logo

Errore di segmentazione Core scaricato da Ubuntu

Che cos'è un errore di segmentazione?

Errore di segmentazione O violazione di accesso ( segfault in breve) è una condizione di guasto o guasto che si verifica dall'hardware con protezione della memoria, avvisando un sistema operativo che il software ha tentato di accedere ad un'area di memoria limitata (una violazione di accesso alla memoria).

nick pulos fulmine nero

Si tratta di un modulo di errore di protezione generale sui sistemi x86 standard. In risposta, il kernel del sistema operativo solitamente implementa alcune operazioni correttive, generalmente trasmettendo l'errore al processo incriminato trasferendo un segnale al processo.

In alcuni casi, i processi possono installare un gestore di segnale, consentendo loro di ripristinarsi da soli, ma altrimenti viene utilizzato il gestore di segnale predefinito del sistema operativo, che generalmente porta alla terminazione anomala del processo e talvolta a un core dump.

  • Gli errori di segmentazione sono una classe di errore di base nei programmi specificati in molti linguaggi come C linguaggio che offre accesso alla memoria di basso livello e alcuni controlli di sicurezza.
  • Esse sorgono principalmente a causa di numerosi errori nei puntatori utilizzati per l'indirizzamento della memoria virtuale, in particolare per l'accesso illegale.
  • Altri tipi di errori di accesso alla memoria sono a errore dell'autobus , che comprende anche diverse cause.
  • Questi appaiono principalmente a causa di un indirizzamento della memoria fisica impreciso o di un accesso alla memoria disallineato.
  • Questi sono alcuni riferimenti di memoria che l'hardware non può indirizzare invece di riferimenti che il processo non è autorizzato a indirizzare.
  • Diversi linguaggi di programmazione potrebbero applicare meccanismi creati per evitare errori di segmentazione e sviluppare la sicurezza della memoria. Ad esempio, IL Ruggine il linguaggio di programmazione applica un modello basato sulla proprietà per garantire la sicurezza della memoria. Un'altra lingua come Giava E Lisp applica la garbage collection, che ignora molte classi di errori di memoria che potrebbero causare errori di segmentazione.

Panoramica dell'errore di segmentazione

  • Un errore di segmentazione appare quando un programma tenta di accedere a una posizione di memoria a cui non è consentito l'accesso o tenta di accedere a una posizione di memoria in un modo non consentito (ad esempio, tentando di scrivere in una posizione di sola lettura o di sovrascrivere la posizione parte del sistema operativo).
  • Nell'informatica, la parola 'segmentazione' ha diversi usi. Nel senso di segmentation fault, parola usata dal 1950, definisce lo spazio degli indirizzi del programma, solo lo spazio degli indirizzi del programma è leggibile con protezione della memoria, e di questo, solo lo stack e la parte di lettura-scrittura del segmento dati del programma è scrivibile. Pertanto, tentare di leggere al di fuori dello spazio degli indirizzi del programma o di scrivere nella parte di sola lettura dello spazio degli indirizzi si traduce in un errore di segmentazione.
  • Viene visualizzato un errore di segmentazione se l'hardware rileva un tentativo di fare riferimento a un segmento inesistente, a una posizione esterna ai limiti del segmento o a una posizione in uno stile non consentito dalle autorizzazioni concesse per il segmento sui sistemi che utilizzano la segmentazione della memoria di l'hardware per fornire memoria virtuale.
  • In genere, un errore di pagina non valida provoca un errore di segmentazione sui sistemi che utilizzano solo il paging. Gli errori di pagina e gli errori di segmentazione sono entrambi errori derivanti dal sistema di gestione della memoria virtuale. Inoltre, l'errore di segmentazione può verificarsi indipendentemente dagli errori di pagina; l'accesso illegittimo a qualsiasi pagina valida è l'errore di segmentazione. L'errore di segmentazione può apparire al centro di una pagina. All'interno di un overflow del buffer che risiede in una pagina ma, ad esempio, sovrascrive la memoria illegalmente.
  • Inizialmente, la colpa è nata da MMU ( unità di gestione della memoria ) in caso di accesso illegale, come parte del suo aspetto relativo alla protezione della memoria, o di un errore di pagina non valida a livello hardware. Se il problema non è un indirizzo logico non valido ma piuttosto un indirizzo fisico non valido, si verifica piuttosto l'errore del bus. Quindi, questi non sono sempre distinti.
  • Viene rilevato questo errore e viene inviato un segnale al processo incriminato, attivando il gestore del processo per quel segnale a livello di sistema operativo. Diversi tipi di sistemi operativi hanno nomi di segnali distinti per indicare che si è verificato un errore di segmentazione.
  • Un segnale noto come SIGSEGV (Corto per violazione della segmentazione ) viene trasferito al processo incriminato sui sistemi operativi simili a Unix. Il processo offensivo ottiene un'eccezione, ovvero STATUS_ACCESS_VIOLATION su Microsoft Windows.

Cause dell'errore di segmentazione

Le circostanze in cui appare un errore di segmentazione e il modo in cui si manifesta sono specifici del sistema operativo e dell'hardware. Hardware diversi generano guasti diversi a seconda delle circostanze e sistemi operativi diversi li trasformano in segnali diversi che vengono inviati ai processi.

La causa imminente potrebbe essere una violazione dell'accesso alla memoria, sebbene la causa sottostante sia un bug del software di qualche tipo. Eseguire il debug di un bug o decidere la causa principale può essere facile in alcuni casi, in cui il programma porterà costantemente a un errore di segmentazione. Tuttavia, in altri casi il sacchetto potrebbe essere difficile da riprodurre e fare affidamento sull'allocazione della memoria ad ogni esecuzione.

Di seguito sono riportate alcune cause tipiche dell'errore di segmentazione:

  • Tentativo di accesso a un indirizzo di memoria inesistente (esterno allo spazio degli indirizzi del processo)
  • Tentativo di accesso alla memoria su cui un programma non ha i diritti (come strutture del kernel nel contesto del processo)
  • Tentativo di scrivere memoria di sola lettura (come segmento di codice )
  • A loro volta, questi sono spesso causati da numerosi errori di programmazione che determinano un accesso non valido alla memoria:
  • Tentativo di eseguire un programma che non viene compilato correttamente. (Alcuni compilatori genereranno un file eseguibile indipendentemente dall'esistenza di errori in fase di compilazione.)
  • Un overflow dello stack
  • Un buffer overflow
  • Assegnare o dereferenziare un puntatore liberato (a puntatore penzolante , che indica la memoria che è stata eliminata/deallocata/liberata)
  • Assegnazione o dereferenziazione a un puntatore non inizializzato (UN puntatore selvaggio , che indica un indirizzo di memoria casuale)
  • Il rimando ad a puntatore nullo solitamente indica un indirizzo che non fa parte dello spazio degli indirizzi del processo

Gli errori di segmentazione spesso compaiono a causa di errori nell'uso di un puntatore, in particolare in Allocazione dinamica della memoria in C nel codice C. Il rimando ad a puntatore nullo , che si traduce in un comportamento indefinito, porterà a un errore di segmentazione. È dovuto a un puntatore nullo che non può essere un indirizzo di memoria valido. IL puntatori pendenti E puntatori selvaggi indica una memoria che potrebbe o non potrebbe esistere e potrebbe o meno essere scrivibile o leggibile e quindi può provocare bug temporanei.

Risolvi l'errore di segmentazione in Ubuntu

Questo errore potrebbe colpire il nostro sistema Ubuntu in qualsiasi momento. L'errore di segmentazione si verifica quando il nostro sistema tenta di accedere a qualsiasi pagina di memoria che non esiste. Nucleo scaricato definisce quando una parte di codice tenta di eseguire un'operazione di scrittura e lettura in una posizione libera o di sola lettura. Generalmente, segfault sono associati a un file denominato core e avvengono al momento dell'aggiornamento.

Durante l'esecuzione di alcuni comandi al momento della situazione di core dump potremmo incontrare il file 'Impossibile aprire il file di blocco' errore. Ciò è dovuto al fatto che il sistema sta tentando di prendere un pezzo di blocco che non esiste. È a causa del crash dei file binari di alcuni programmi specifici.

Potremmo eseguire il debug o il backtracking per risolverlo, ma la soluzione è riparare i pacchetti danneggiati implementando alcuni passaggi menzionati come segue:

1. Rimuovere i file di blocco disponibili in posizioni distinte.

 $ sudo rm -rvf /var/lib/apt/lists/lock /var/cache/apt/archives/lock /var/lib/dpkg/lock and restart our system 

Errore di segmentazione Core scaricato da Ubuntu

2. Rimozione della cache del repository.

 $ sudo apt-get clean all 

Errore di segmentazione Core scaricato da Ubuntu

3. Aggiorna e aggiorna la cache del nostro repository.

 $ sudo apt-get update 

Errore di segmentazione Core scaricato da Ubuntu
 $ sudo apt-get upgrade 

Errore di segmentazione Core scaricato da Ubuntu

4. Ora aggiorna la nostra distribuzione che aggiornerà i nostri pacchetti.

 $ sudo apt-get dist-upgrade 

Errore di segmentazione Core scaricato da Ubuntu

5. Cerca i pacchetti rotti e rimuovili con forza.

 $ sudo dpkg -1 | grep ^..r | apt-get purge 

Un ottimo modo che funzionerà sempre è il seguente, a parte la riga di comando:

  1. In modalità di avvio, esegui Ubuntu facendo clic su Esc chiave dopo il riavvio.
  2. Scegliere ' Opzioni avanzate per Ubuntu
    Errore di segmentazione Core scaricato da Ubuntu
  3. In modalità di ripristino esegui Ubuntu e verranno menzionate diverse opzioni.
  4. Innanzitutto, scegli il 'Riparare i pacchi rotti'
    Errore di segmentazione Core scaricato da Ubuntu
  5. Quindi, scegli il 'Riprendi l'avvio normale'
    Errore di segmentazione Core scaricato da Ubuntu

Ora abbiamo due modi per risolvere la GUI e la CLI dell'errore di segmentazione. A volte può anche succedere che il comando, ad esempio apt, non funzioni a causa del file segfault , quindi il metodo CLI non verrà implementato. In quella situazione, non preoccuparti perché il metodo GUI funzionerà sempre per noi.

Gestione dell'errore di segmentazione

L'attività predefinita per un errore del bus o un errore di segmentazione è la terminazione anomala di un processo che lo ha riscontrato. Potrebbe essere prodotto un file core per facilitare il debug e potrebbero essere implementate anche altre attività dipendenti dalla piattaforma. Ad esempio, molti sistemi Linux che applicano l'estensione patch di sicurezza potrebbe accedere Segnali SIGSEGV per il monitoraggio di possibili tentativi di intrusione con buffer overflow.

Su alcuni sistemi, come Windows e Linux, è possibile che un programma stesso gestisca un errore di segmentazione. Il programma in esecuzione non solo può gestire l'evento ma potrebbe estrarre alcuni dettagli sul suo stato come i valori del registro del processore, ottenere una traccia dello stack, la riga di un codice sorgente quando è stato incontrato, l'indirizzo di memoria a cui è stato effettuato l'accesso in modo non valido e se l'attività era di scrittura o di lettura a seconda del sistema operativo e dell'architettura.

Tuttavia, un errore di segmentazione definisce che un programma ha un errore che richiede una correzione, è anche possibile causare tale errore intenzionalmente a scopo di test, debug e anche per imitare piattaforme in cui è richiesto l'accesso diretto alla memoria. In quest'ultimo caso, il sistema dovrebbe essere in grado di consentire l'esecuzione del programma anche dopo che si è verificato l'errore.

la scorciatoia tutta maiuscola Excel

In questa situazione, quando il sistema lo consente, è possibile gestire l'evento e potenziare il programma del processore per contrastarlo 'salto' sull'istruzione fallita di procedere con l'esecuzione.

Esempi di difetto di segmentazione

Errore di segmentazione Core scaricato da Ubuntu

Scrittura nella memoria di sola lettura

Ne risulta un errore di segmentazione. Appare quando il programma scrive su una parte del suo segmento di codice o sulla parte di sola lettura del segmento di dati con livelli di errore di codice perché questi vengono caricati tramite il sistema operativo nella memoria di sola lettura.

Dereferenziazione del puntatore nullo

In C e in altri linguaggi simili al C, i puntatori null vengono utilizzati per il significato 'puntatore a nessun oggetto' e poiché l'indicatore di errore e il dereferenziamento nel puntatore nullo (una scrittura o lettura da un puntatore nullo) è un errore di programma molto semplice.

Lo standard non dice che il puntatore nullo è simile al puntatore all'indirizzo di memoria 0, anche se potrebbe essere così. Quasi tutti i sistemi operativi mappano l'indirizzo del puntatore nullo in modo tale che il suo utilizzo porti a un errore di segmentazione.

Questo comportamento non è garantito da nessuno standard C. In C, dereferenziare il puntatore nullo è il comportamento indefinito e un'implementazione conforme può presupporre che un puntatore dereferenziato non sia nullo.

Overflow del buffer

Overflow dello stack