2009-09-21 14 views
11

Quando la mia applicazione si blocca linux, produce una linea nel log di qualcosa come:Quali sono rip numeri segmentation fault/RSP e come usarli

segfault a 0000000 rip 00003f32a823 RSP 000123ade323 errore 4

Quali sono quegli indirizzi rip e rsp? come li uso per individuare il problema? corrispondono a qualcosa nelle uscite "objdump" o "readelf"? sono utili se il mio programma ottiene i suoi simboli estratti (in un file separato, che può essere usato usando gdb)

risposta

7

Bene, il puntatore di rip dice l'istruzione che ha causato l'arresto. Devi cercarlo in un file di mappa.

Nel file di mappa si avrà un elenco di funzioni e il loro indirizzo di partenza. Quando si carica l'applicazione, viene caricata su un indirizzo di base. Il puntatore di ripping - l'indirizzo di base ti dà l'indirizzo del file di mappa. Se si ricerca nel file di mappa una funzione che inizia con un indirizzo leggermente inferiore al puntatore di rip e viene seguita, nell'elenco, da una funzione con un indirizzo più alto, è stata individuata la funzione che si è bloccata.

Da lì è necessario provare e identificare cosa è andato storto nel codice. Non è molto divertente ma, almeno, ti dà un punto di partenza.

Modifica: il bit "segfault at" ti dice, scommetto, che hai annullato il riferimento a un puntatore NULL. Il rsp è il puntatore dello stack corrente. Purtroppo non è tutto ciò che è utile. Con un deposito di memoria "potresti" essere in grado di capire con maggiore precisione dove ti trovavi nella funzione ma può essere davvero difficile capire esattamente dove ti trovi in ​​una build ottimizzata

3

Ho ottenuto il errore, anche. Quando ho visto:

probe.out[28503]: segfault at 0000000000000180 rip 00000000004450c0 rsp 00007fff4d508178 error 4 

probe.out è un'app che utilizza libavformat (ffmpeg). L'ho smontato.

objdump -d probe.out 

Il RIP è dove l'istruzione verrà eseguito:

00000000004450c0 <ff_rtp_queued_packet_time>: 
    4450c0:  48 8b 97 80 01 00 00 mov 0x180(%rdi),%rdx 
    44d25d:  e8 5e 7e ff ff   callq 4450c0 <ff_rtp_queued_packet_time> 

finalmente, ho trovato l'applicazione si è schiantato nella funzione ff_rtp_queued_packet_time

PS. a volte l'indirizzo non corrisponde esattamente, ma è quasi arrivato.

Problemi correlati