2014-01-16 5 views
19

GCC 및 -fsanitize=address 플래그로 컴파일을 시도했습니다. 프로그램을 실행하면 주소 소독 프로그램에서 결함을 발견하지만 스택 추적은 도움이되지 않습니다. 어떻게해야 볼 수있는 소스 코드 위치를 가리 키도록 구성 할 수 있습니까?GCC의 주소 sanitizer에 대한 의미있는 스택 추적

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

실행 파일에 컴파일 된 디버깅 정보가 있습니까? – buc030

+0

@ buc030'-g3'flag를 사용하여 그렇게 생각합니다. – clstaudt

+0

그런 다음 addr2line을 시도하십시오. 주소를 더 중요한 이름으로 변환하는 데 도움이되는 유닉스 명령 줄 유틸리티입니다. – buc030

답변

17

이 나를 위해 노력하고 무엇 :

  • 당신이 (LLVM-symbolizer 포함) LLVM을 설치했는지 확인하십시오.
  • 수출 다음과 같은 변수

    export ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer

    합니다 (LLVM-symbolizer 명령에 대한 올바른 경로로 대체).

  • 지금이 내가 연타 아래 년 동안 일을 한 것입니다, 다른 방법으로

    ASAN_OPTIONS=symbolize=1 a.out
+0

상수의 이름은 ASAN_SYMBOLIZER_PATH입니다. 나를 위해 작동하는 것 같습니다. – Lupus

+4

GCC 컴파일러를 사용하면 까다로운 비트가 symbolize = 1이됩니다. Clang에서는 선택 사항입니다. 내 요점을 참조하십시오 : https://gist.github.com/kwk/4171e37f4bcdf7705329 –

+0

GCC (위의 4.9.3)에서 더 이상 필요하지 않습니다. –

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 

로 (지금의 a.out) 실행 파일을 실행합니다. 출력을 asan_symbolize으로 파이프하여 기호를 가져옵니다. 나는 모두 /usr/bin/usr/local/binasan_symbolize

./test.exe 2>&1 | asan_symbolize 

: 같은 당신이 뭔가를해야

$ 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 

하나 apt-get (/usr/bin/asan_symbolize)를 통해 연타와 함께 설치했기 때문에 나는 두 복사본을 가지고, 내가 연타를 구축 출처 : 경우에 따라 (/usr/local/bin/asan_symbolize.py). 당신이 사본이없는 경우

, 나는 당신이 Google 코드 address-sanitizer에서 가져올 수 있다고 생각합니다. 당신이 asan_symbolize을 사용하기 시작하면, 당신 인해 경로 변경에 asan_symbolize이 기호를 찾을 수없는 상황이 발생할 수 있습니다


(예를 들어, 프로그램이나 라이브러리 대상 디렉토리의 빌드 위치에서 복사). 이를 위해서는 아산 메일 링리스트의 Specify Symbol Path to asan_symbolize?을 참조하십시오.

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

(나는 그것이 내가 포스트 그레스를 테스트 할 때해야 할 일을했을 것 같아요) :

KCC의 대답, 그는 같은 뭔가를 의미했다.


파이썬은 Dynamic Analysis with Clang에서 연타와 소독제의 충돌 과정이있다. 스택 트레이스 가져 오기와 같은 주제에 대해 설명합니다. (저는 Python 프로젝트를위한 페이지를 작성하여 Clang과 그것의 sanitizers를 릴리즈 엔지니어링 프로세스에 추가했습니다.이 기술은 몇 년 전의 것이지만 여전히 모든 정보가 적용된다고 생각합니다).