L'esecuzione dell'applicazione termina con "Errore di segmentazione"


Risposte:


63

Un errore di segmentazione è il risultato di una violazione di accesso alla memoria. Il programma ha fatto riferimento a un indirizzo di memoria al di fuori di ciò che gli è stato assegnato e il kernel del sistema operativo risponde uccidendo il programma con SIGSEGV.

Questo è un errore, dal momento che non ha senso tentare di accedere alla memoria inaccessibile (non può essere fatto). Errori di questo tipo sono facili da fare, tuttavia, in particolare in linguaggi come C e C ++ (che rappresentano molte applicazioni comuni). Indica un bug nel programma stesso o in una libreria a cui si collega. Se si desidera segnalare il bug (fare - questo aiuta), è una buona idea includere un backtrace degli eventi che hanno portato all'errore di seg.

Per fare ciò, è possibile eseguire il programma all'interno gdb(il debugger GNU), che dovrebbe essere disponibile da qualsiasi distribuzione Linux se non è già installato (il pacchetto si chiamerà semplicemente "gdb"). Se l'applicazione rotta si chiama "brokenapp":

gdb brokenapp

Apparirà un paragrafo sul copyright e le licenze e alla fine un prompt con il cursore:

(gdb) _ 

Digita rune premi invio. Se è necessario fornire argomenti (ad es. -x --foo=bar whatever) Aggiungere quelli ( run -x --foo=bar whatever). Il programma farà quello che fa, vedrai l'output e se hai bisogno di interagire puoi (nota che puoi eseguire qualsiasi tipo di programma, incluso un GUI, all'interno di gdb). Nel punto in cui di solito segfault vedrai:

Program received signal SIGSEGV, Segmentation fault.
0x00000000006031c9 in ?? ()
(gdb) _

La seconda riga di output qui è solo un esempio. Ora digita bt(per "backtrace") e premi invio. Vedrai qualcosa del genere, anche se potrebbe essere molto più lungo:

(gdb) bt
#0  0x00000000006031c9 in ?? ()
#1  0x000000000040157f in mishap::what() const ()
#2  0x0000000000401377 in main ()

Se è più lungo, otterrai solo uno schermo alla volta e ci sarà un --More--messaggio. Continua a premere invio fino al termine. Ora puoi quit, l'output rimarrà nel tuo terminale. Copia tutto da quel momento Program received signal SIGSEGVin un file di testo e invia una segnalazione di bug con il bug tracker dell'applicazione; puoi trovarli online cercando, ad es. "segnalazione di bug rotti" - probabilmente dovrai registrarti per poterti inviare una risposta via e-mail. Includi la descrizione del problema, eventuali argomenti forniti run, ecc. E una copia del backtrace (se è molto lungo, potrebbe esserci un modo per allegare un file di testo nell'interfaccia del tracker dei bug). Includi anche la versione, se sai di cosa si tratta ( brokenapp --versionpotrebbe funzionare o la pagina man potrebbe indicare come ottenerla),

Si spera che qualcuno ti risponderà tra non molto tempo. La presentazione di bug è generalmente apprezzata.


1
Un errore di segmentazione può verificarsi anche nei linguaggi degli interpreti (ciò è principalmente dovuto a bug nell'interprete stesso),
Braiam

Questo è super utile! C'è la possibilità di entrare? mettere un segno di stop e provare a scoprire di più?
Zloy Smiertniy,

1
@ZloySmiertniy gdbfa molte cose . Si desidera passare alla sezione 5.1
Riccioli d'oro,

11

Ciò significa che l'applicazione ha un bug.

  • Se sei un utente finale, devi contattare il fornitore dell'applicazione.

    • Se è arrivato con una distribuzione Linux, dovresti creare una segnalazione di bug per quella distribuzione.
    • Per le app non commerciali di terze parti è necessario segnalare il bug all'autore o questo particolare tracker bug dell'applicazione. Di solito è possibile trovare posto sfogliando il sito dell'applicazione o il pacchetto binario / sorgente scaricato.
    • Per le app commerciali è necessario contattare l'assistenza.
  • Se è la tua applicazione, puoi:

    1. abilita file core: $ ulimit -c unlimited
    2. riprodurre l'incidente: $ ./yourapp
    3. arresto anomalo del debug con gdb: $ gdb ./yourapp core

I file core saranno anche molto utili per gli sviluppatori diversi da te: contengono lo stato completo del programma al momento del crash; se hai intenzione di presentare una segnalazione di bug, allegarli e in alcuni casi al file binario dell'app. Tieni presente che ci sono poche possibilità che i tuoi dati personali come numeri di account, password e simili possano rimanere in memoria del programma al momento del crash. In molti casi, la segnalazione del solo backtrace del thread bloccato è di grande aiuto per gli sviluppatori per trovare il problema. Per ottenere il backtrace, è possibile caricare il file core con debugger (come gdb executable corefile).


Secondo la finestra di dialogo di Microsoft, dovresti contattare il tuo fornitore "solo se il problema persiste", altrimenti non preoccuparti. Gli arresti rari non sono veri e propri bug, ma solo riproducibili.
Kaz,

4
La mia osservazione è che la qualità del software Microsoft è bassa in molti casi rispetto al software UNIX, ed è bello che nel mondo UNIX le persone di solito non facciano riferimento alle loro linee guida.
gena2x,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.