2009-09-21 2 views
11

Wenn mein Linux-Anwendung abstürzt, ist es eine Zeile in der etwas Protokolle erzeugt wie:Was sind segfault rip/rsp Zahlen und wie sie verwendet werden

segfault bei 0000000 rip 00003f32a823 rsp 000123ade323 Fehler 4

Was sind diese rip- und rsp-Adressen? Wie verwende ich sie, um das Problem zu lokalisieren? Entsprechen sie etwas in den Ausgaben "objdump" oder "readelf"? sind sie nützlich, wenn mein Programm seine Symbole ausgestreift bekommt (in eine separate Datei, die mit gdb verwendet werden kann)

Antwort

7

Nun der Risszeiger sagt Ihnen die Anweisung, die den Absturz verursacht hat. Sie müssen es in einer Map-Datei nachschlagen.

In der Kartendatei haben Sie eine Liste von Funktionen und deren Startadresse. Wenn Sie die Anwendung laden, wird sie in eine Basisadresse geladen. Der RIP-Zeiger - die Basisadresse gibt Ihnen die Adresse der Map-Datei. Wenn Sie dann die Map-Datei nach einer Funktion durchsuchen, die bei einer Adresse beginnt, die etwas niedriger als Ihr RIP-Pointer ist und in der Liste von einer Funktion mit einer höheren Adresse gefolgt wird, haben Sie die Funktion gefunden, die abgestürzt ist.

Von dort müssen Sie versuchen zu identifizieren, was in Ihrem Code falsch gelaufen ist. Es ist nicht viel Spaß, aber es gibt Ihnen zumindest einen Ausgangspunkt.

Edit: Das Bit "segfault at" sagt Ihnen, ich würde wetten, dass Sie einen Nullzeiger dereferenziert haben. Der rsp ist der aktuelle Stapelzeiger. Leider ist es wahrscheinlich nicht so nützlich. Mit einem Speicherabzug können Sie genauer herausfinden, wo Sie in der Funktion waren, aber es kann sehr schwierig sein, genau herauszufinden, wo Sie sich in einem optimierten Build befinden.

3

Ich habe die Fehler auch. Als ich sah:

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

probe.out ist eine App, die libavformat (ffmpeg) verwendet wird. Ich habe es auseinandergebaut.

objdump -d probe.out 

Der Riss ist, wo der Befehl ausgeführt wird:

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> 

schließlich fand ich die App in der Funktion ff_rtp_queued_packet_time

PS abgestürzt. manchmal stimmt die Adresse nicht genau überein, aber es ist fast da.

Verwandte Themen