c++ gcc memory stack-trace address-sanitizer

c++ - Rastros significativos de la pila para el desinfectante de direcciones en GCC



memory stack-trace (3)

Esto es lo que me funciona:

  • Asegúrese de haber instalado llvm (incluido llvm-symbolizer).
  • Exportar la siguiente variable

    export ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer

    (Reemplace con su ruta correcta al comando llvm-symbolizer).

  • Ahora ejecuta tu ejecutable (a.out por ahora) como

    ASAN_OPTIONS=symbolize=1 a.out

Acabo de intentar compilar con GCC y el -fsanitize=address . Cuando ejecuto mi programa, el desinfectante de direcciones encuentra un defecto, pero el seguimiento de la pila no es útil. ¿Cómo puedo configurar esto para que apunte a las ubicaciones del código fuente que necesito mirar?

================================================================= ==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



================================================================= ==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

Como alternativa, esto es lo que he estado haciendo durante años bajo Clang. Pipe su salida a través de asan_symbolize para obtener los símbolos. Así que deberías hacer algo como:

./test.exe 2>&1 | asan_symbolize

Tengo asan_symbolize en /usr/bin y /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

Tengo dos copias porque una se instaló con Clang a través de apt-get ( /usr/bin/asan_symbolize ), y en ocasiones construyo Clang a partir de fuentes ( /usr/local/bin/asan_symbolize.py ).

Si no tiene copias, entonces creo que puede obtenerlas desde address-sanitizer de address-sanitizer en Google Code.

Una vez que empiece a usar asan_symbolize , puede encontrar una situación en la que asan_symbolize no pueda encontrar los símbolos debido a un cambio de ruta (por ejemplo, un programa o biblioteca se copió desde su ubicación de compilación a un directorio de destino). Para eso, vea Especificar la ruta del símbolo para asan_symbolize? en la lista de correo de Asan.

En la respuesta de kcc , él quería hacer algo como:

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

(Creo que eso es lo que tenía que hacer al probar Postgres).

Python tiene un curso acelerado en Clang y sus desinfectantes en Dynamic Analysis with Clang . Discute temas como obtener rastros de pila. (Escribí la página del proyecto Python para ayudarlos a agregar Clang y sus desinfectantes a su proceso de ingeniería de lanzamiento. Ya tienen algunos años, pero creo que toda la información aún se aplica).