2014-01-16 10 views
19

Ich habe gerade versucht, mit GCC und der -fsanitize=address Flagge zu kompilieren. Wenn ich mein Programm starte, findet der Adressdesinfizierer einen Fehler, aber die Stack-Ablaufverfolgung ist nicht hilfreich. Wie kann ich dies so konfigurieren, dass es auf die Quellcodeorte zeigt, die ich betrachten muss?Bedeutende Stack-Traces für Adress-Desinfektionsmittel in GCC

================================================================= 
==32415== ERROR: AddressSanitizer: heap-buffer-overflow on address 0x6006004b38a0 at pc 0x10b136d5c bp 0x7fff54b8e5d0 sp 0x7fff54b8e5c8 
WRITE of size 8 at 0x6006004b38a0 thread T0 
    #0 0x10b136d5b (/Users/cls/workspace/NetworKit/./NetworKit-Tests-D+0x1000c6d5b) 
    #1 0x10b136e0c (/Users/cls/workspace/NetworKit/./NetworKit-Tests-D+0x1000c6e0c) 
    #2 0x10b138ef5 (/Users/cls/workspace/NetworKit/./NetworKit-Tests-D+0x1000c8ef5) 
    #3 0x10b137a2e (/Users/cls/workspace/NetworKit/./NetworKit-Tests-D+0x1000c7a2e) 
    #4 0x10b13acf2 (/Users/cls/workspace/NetworKit/./NetworKit-Tests-D+0x1000cacf2) 
    #5 0x10b253647 (/Users/cls/workspace/NetworKit/./NetworKit-Tests-D+0x1001e3647) 
    #6 0x10b24ee55 (/Users/cls/workspace/NetworKit/./NetworKit-Tests-D+0x1001dee55) 
    #7 0x10b237108 (/Users/cls/workspace/NetworKit/./NetworKit-Tests-D+0x1001c7108) 
    #8 0x10b237c17 (/Users/cls/workspace/NetworKit/./NetworKit-Tests-D+0x1001c7c17) 
    #9 0x10b2385c9 (/Users/cls/workspace/NetworKit/./NetworKit-Tests-D+0x1001c85c9) 
    #10 0x10b23f659 (/Users/cls/workspace/NetworKit/./NetworKit-Tests-D+0x1001cf659) 
    #11 0x10b254951 (/Users/cls/workspace/NetworKit/./NetworKit-Tests-D+0x1001e4951) 
    #12 0x10b24fbeb (/Users/cls/workspace/NetworKit/./NetworKit-Tests-D+0x1001dfbeb) 
    #13 0x10b23dc38 (/Users/cls/workspace/NetworKit/./NetworKit-Tests-D+0x1001cdc38) 
    #14 0x10b229d28 (/Users/cls/workspace/NetworKit/./NetworKit-Tests-D+0x1001b9d28) 
    #15 0x10b229bda (/Users/cls/workspace/NetworKit/./NetworKit-Tests-D+0x1001b9bda) 
    #16 0x7fff8b7785fc (/usr/lib/system/libdyld.dylib+0x35fc) 
    #17 0x2 
0x6006004b38a0 is located 0 bytes to the right of 32-byte region [0x6006004b3880,0x6006004b38a0) 
allocated by thread T0 here: 
    #0 0x10b8bb63a (/usr/local/lib/gcc/x86_64-apple-darwin13.0.0/4.8.2/libasan.0.dylib+0xe63a) 
    #1 0x10b0777c6 (/Users/cls/workspace/NetworKit/./NetworKit-Tests-D+0x1000077c6) 
    #2 0x10b07701e (/Users/cls/workspace/NetworKit/./NetworKit-Tests-D+0x10000701e) 
    #3 0x10b09cd1b (/Users/cls/workspace/NetworKit/./NetworKit-Tests-D+0x10002cd1b) 
    #4 0x10b09c6ef (/Users/cls/workspace/NetworKit/./NetworKit-Tests-D+0x10002c6ef) 
    #5 0x10b09960e (/Users/cls/workspace/NetworKit/./NetworKit-Tests-D+0x10002960e) 
    #6 0x10b137844 (/Users/cls/workspace/NetworKit/./NetworKit-Tests-D+0x1000c7844) 
    #7 0x10b13acf2 (/Users/cls/workspace/NetworKit/./NetworKit-Tests-D+0x1000cacf2) 
    #8 0x10b253647 (/Users/cls/workspace/NetworKit/./NetworKit-Tests-D+0x1001e3647) 
    #9 0x10b24ee55 (/Users/cls/workspace/NetworKit/./NetworKit-Tests-D+0x1001dee55) 
    #10 0x10b237108 (/Users/cls/workspace/NetworKit/./NetworKit-Tests-D+0x1001c7108) 
    #11 0x10b237c17 (/Users/cls/workspace/NetworKit/./NetworKit-Tests-D+0x1001c7c17) 
    #12 0x10b2385c9 (/Users/cls/workspace/NetworKit/./NetworKit-Tests-D+0x1001c85c9) 
    #13 0x10b23f659 (/Users/cls/workspace/NetworKit/./NetworKit-Tests-D+0x1001cf659) 
    #14 0x10b254951 (/Users/cls/workspace/NetworKit/./NetworKit-Tests-D+0x1001e4951) 
    #15 0x10b24fbeb (/Users/cls/workspace/NetworKit/./NetworKit-Tests-D+0x1001dfbeb) 
    #16 0x10b23dc38 (/Users/cls/workspace/NetworKit/./NetworKit-Tests-D+0x1001cdc38) 
    #17 0x10b229d28 (/Users/cls/workspace/NetworKit/./NetworKit-Tests-D+0x1001b9d28) 
    #18 0x10b229bda (/Users/cls/workspace/NetworKit/./NetworKit-Tests-D+0x1001b9bda) 
    #19 0x7fff8b7785fc (/usr/lib/system/libdyld.dylib+0x35fc) 
    #20 0x2 
Shadow bytes around the buggy address: 
    0x1c00c00966c0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 
    0x1c00c00966d0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 
    0x1c00c00966e0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 
    0x1c00c00966f0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 
    0x1c00c0096700: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 
=>0x1c00c0096710: 00 00 00 00[fa]fa fd fd fd fd fa fa fd fd fd fa 
    0x1c00c0096720: fa fa fd fd fd fa fa fa 00 00 00 07 fa fa 00 00 
    0x1c00c0096730: 00 04 fa fa fd fd fd fd fa fa fd fd fd fd fa fa 
    0x1c00c0096740: fd fd fd fa fa fa fd fd fd fa fa fa 00 00 00 07 
    0x1c00c0096750: fa fa 00 00 00 00 fa fa 00 00 00 04 fa fa fd fd 
    0x1c00c0096760: fd fd fa fa fd fd fd fd fa fa fd fd fd fd fa fa 
Shadow byte legend (one shadow byte represents 8 application bytes): 
    Addressable:   00 
    Partially addressable: 01 02 03 04 05 06 07 
    Heap left redzone:  fa 
    Heap righ redzone:  fb 
    Freed Heap region:  fd 
    Stack left redzone: f1 
    Stack mid redzone:  f2 
    Stack right redzone: f3 
    Stack partial redzone: f4 
    Stack after return: f5 
    Stack use after scope: f8 
    Global redzone:  f9 
    Global init order:  f6 
    Poisoned by user:  f7 
    ASan internal:   fe 
==32415== ABORTING 
+0

Sie haben Informationen in die ausführbare Datei kompiliert Debuggen? – buc030

+0

@ buc030 Ich denke schon, mit der '-g3'flag. – clstaudt

+0

dann versuchen Sie addr2line, es ist ein Unix-Kommandozeilen-Dienstprogramm, das Ihnen helfen wird, Adresse zu einem signifikanteren Namen zu übersetzen – buc030

Antwort

17

Dies ist, was für mich funktioniert:

  • Stellen Sie sicher, llvm (einschließlich llvm-Symbolizer) installiert haben.
  • Export des folgende Variable

    export ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer

    (ersetzen mit dem richtigen Pfad zu dem llvm-Symbolizer Befehl).

  • Jetzt ausführbare Datei (a.out vorerst) laufen als

    ASAN_OPTIONS=symbolize=1 a.out
+0

Konstante heißt ASAN_SYMBOLIZER_PATH, scheint für mich zu arbeiten. – Lupus

+4

Das schwierige Bit ist das Symbolize = 1, wenn Sie mit GCC kompilieren. In Clang ist dies optional. Siehe mein Geiste: https://gist.github.com/kwk/4171e37f4bcdf7705329 –

+0

Dies ist nicht mehr erforderlich in GCC (4.9.3 oben) –

1
================================================================= 
==32415== ERROR: AddressSanitizer: heap-buffer-overflow on address 0x6006004b38a0 at pc 0x10b136d5c bp 0x7fff54b8e5d0 sp 0x7fff54b8e5c8 
WRITE of size 8 at 0x6006004b38a0 thread T0 
    #0 0x10b136d5b (/Users/cls/workspace/NetworKit/./NetworKit-Tests-D+0x1000c6d5b) 
    #1 0x10b136e0c (/Users/cls/workspace/NetworKit/./NetworKit-Tests-D+0x1000c6e0c) 
    #2 0x10b138ef5 (/Users/cls/workspace/NetworKit/./NetworKit-Tests-D+0x1000c8ef5) 
    #3 0x10b137a2e (/Users/cls/workspace/NetworKit/./NetworKit-Tests-D+0x1000c7a2e) 
    #4 0x10b13acf2 (/Users/cls/workspace/NetworKit/./NetworKit-Tests-D+0x1000cacf2) 
    #5 0x10b253647 (/Users/cls/workspace/NetworKit/./NetworKit-Tests-D+0x1001e3647) 
    #6 0x10b24ee55 (/Users/cls/workspace/NetworKit/./NetworKit-Tests-D+0x1001dee55) 
    #7 0x10b237108 (/Users/cls/workspace/NetworKit/./NetworKit-Tests-D+0x1001c7108) 
    #8 0x10b237c17 (/Users/cls/workspace/NetworKit/./NetworKit-Tests-D+0x1001c7c17) 
    #9 0x10b2385c9 (/Users/cls/workspace/NetworKit/./NetworKit-Tests-D+0x1001c85c9) 
    #10 0x10b23f659 (/Users/cls/workspace/NetworKit/./NetworKit-Tests-D+0x1001cf659) 
    #11 0x10b254951 (/Users/cls/workspace/NetworKit/./NetworKit-Tests-D+0x1001e4951) 
    #12 0x10b24fbeb (/Users/cls/workspace/NetworKit/./NetworKit-Tests-D+0x1001dfbeb) 
    #13 0x10b23dc38 (/Users/cls/workspace/NetworKit/./NetworKit-Tests-D+0x1001cdc38) 
    #14 0x10b229d28 (/Users/cls/workspace/NetworKit/./NetworKit-Tests-D+0x1001b9d28) 
    #15 0x10b229bda (/Users/cls/workspace/NetworKit/./NetworKit-Tests-D+0x1001b9bda) 
    #16 0x7fff8b7785fc (/usr/lib/system/libdyld.dylib+0x35fc) 
    #17 0x2 

Als Alternative ist das, was ich schon seit Jahren unter Clang getan. Pipe deine Ausgabe durch asan_symbolize, um die Symbole zu erhalten. So sollten Sie so etwas wie:

./test.exe 2>&1 | asan_symbolize 

I asan_symbolize haben in beiden /usr/bin und /usr/local/bin:

$ find /usr/ -name asan* 
/usr/bin/asan_symbolize 
/usr/lib/llvm-3.4/lib/clang/3.4/include/sanitizer/asan_interface.h 
/usr/local/bin/asan_symbolize.py 
/usr/local/lib/clang/3.5.0/include/sanitizer/asan_interface.h 

Ich habe zwei Kopien, weil man mit Clang installiert wurde über apt-get (/usr/bin/asan_symbolize), und ich bauen Clang aus Quellen gelegentlich (/usr/local/bin/asan_symbolize.py).

Wenn Sie keine Kopien haben, dann glaube ich, Sie es von address-sanitizer auf Google Code abrufen kann.


Sobald Sie mit asan_symbolize beginnen, könnten Sie in eine Situation kommen, wo asan_symbolize die Symbole nicht aufgrund einer Pfadänderung finden (zum Beispiel ein Programm oder eine Bibliothek wurde von seinem Build-Standort zu einem Zielverzeichnis kopiert). Siehe hierzu Specify Symbol Path to asan_symbolize? auf der Asan-Mailingliste.

In Antwort des KCC, bedeutete, dass er etwas zu tun:

./test.exe 2>&1 | sed "s/<old path>/<new path>/g" | asan_symbolize 

(Ich denke, das ist, was ich bei der Prüfung von Postgres zu tun hatte).


Python hat einen Crash-Kurs in Clang und seine sanitizers bei Dynamic Analysis with Clang. Es behandelt Themen wie Stack-Traces abrufen. (Ich habe die Seite für das Python-Projekt geschrieben, um ihnen zu helfen, Clang und seine Desinfektionsmittel zu seinem Release-Engineering-Prozess hinzuzufügen. Es ist jetzt ein paar Jahre alt, aber ich glaube, dass alle Informationen immer noch gelten).