Wie ordne ich einen segfault Befehlszeiger-Adresse von / var / log / messages auf eine Adresse / Funktion in meiner .map-Datei?

StackOverflow https://stackoverflow.com/questions/1408788

  •  05-07-2019
  •  | 
  •  

Frage

(Meine Umgebung ist 64-Bit-Ubuntu, meine Anwendung ist C ++ kompiliert und verknüpft mit g ++).

Wenn eine Anwendung tut so etwas wie Division durch Null oder eine asm("int $3") im Code, eine der folgenden links ausgefuehrt wird über syslog angemeldet /var/log/kern.log und /var/log/messages:

Sep 10 18:06:47 VM kernel: [117194.123452] a.out[20288] trap divide error ip:45c59d sp:7fff65a91810 error:0 in a.out[400000+144000]
Sep 10 18:07:10 VM kernel: [117217.020833] a.out[20294] trap int3 ip:45c493 sp:7fff5cc559f0 error:0

In diesen beiden Fällen werden die Befehlszeiger Adresse zeigt auf etwas, das ich leicht in der .map Datei zur Verknüpfungszeit (mit dem „-Wl,-Map,output.map“) produziert nachschlagen kann.

Aber wenn ich einen Segmentation-Fehler verursachen, in diesem Fall durch einen Aufruf mit der Quelle auf NULL gesetzt memcpy(), der Befehlszeiger ist so außer Reichweite, ich habe keine Ahnung, wie es soll abgebildet werden:

Sep 10 18:06:13 VM kernel: [117160.228587] a.out[20282]: segfault at 0 ip 00007f7e79209092 sp 00007fff831faf08 error 4 in libc-2.9.so[7f7e79185000+168000]

In diesem Beispiel würde ich die IP erwartete im Bereich von 0x445e70-0x445e7f zu sein, die die Lage von memcpy () ist nach meiner .map-Datei.

Meine Frage: Was ist der Trick, um die ip in diesem Fall auf der Interpretation

War es hilfreich?

Lösung

Nach der Nachricht sieht es aus wie es in memcpy() abgestürzt, von libc-2.9.so, die sich in Ihrem Prozess bei 0x7f7e79185000 Start abgebildet wird. Dies wird erwartet, da memcpy die Funktion, die auf den Zeiger dereferenzieren versucht. Der Befehlszeiger sieht gültig, da sie im Bereich von libc ist. Wenn Sie Memcpy außer Kraft zu setzen beabsichtigten und Ihre eigene Version aufrufen, müssen Sie möglicherweise mit -fno-builtin-memcpy kompilieren.

Bearbeiten Sie libc können Verknüpfung statisch sondern nach der Nachricht, die Sie auch die libc Shared Library in Ihren Prozess Speicher abgebildet haben. Sie sollten sehen, es in /proc/ aufgelistet pid /maps während Ihr Programm läuft. Es kann sein, dass Sie mit einer anderen gemeinsam genutzten Bibliothek verknüpfen, wie libstdc ++, und es hängt von dem libc Shared Library. Als Ergebnis haben Sie zwei Versionen von memcpy, und in diesem Fall ist es die libc Shared Library Version aufrufen, die bei der hohen Adresse abgebildet wird. Wenn Sie die libc gemeinsam genutzte Bibliothek nicht dann wollen sicherstellen, dass Sie eine Verknüpfung alle Bibliotheken statisch; Verwenden Sie die Option -static am Anfang Ihrer Verbindungslinie.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top