Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ GCC中地址消毒器的有意义堆栈跟踪_C++_Gcc_Memory_Stack Trace_Address Sanitizer - Fatal编程技术网

C++ GCC中地址消毒器的有意义堆栈跟踪

C++ GCC中地址消毒器的有意义堆栈跟踪,c++,gcc,memory,stack-trace,address-sanitizer,C++,Gcc,Memory,Stack Trace,Address Sanitizer,我只是尝试使用GCC和-fsanize=address标志进行编译。当我运行我的程序时,地址消除器发现了一个缺陷,但是堆栈跟踪没有帮助。如何配置它,使其指向需要查看的源代码位置 ================================================================= ==32415== ERROR: AddressSanitizer: heap-buffer-overflow on address 0x6006004b38a0 at pc 0x10b13

我只是尝试使用GCC和
-fsanize=address
标志进行编译。当我运行我的程序时,地址消除器发现了一个缺陷,但是堆栈跟踪没有帮助。如何配置它,使其指向需要查看的源代码位置

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

这就是我的工作:

  • 确保已安装llvm(包括llvm符号器)
  • 导出以下变量

    export ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer 导出ASAN\u符号器\u路径=/usr/bin/llvm符号器 (替换为llvm SYMBOLER命令的正确路径)

  • 现在按如下方式运行可执行文件(a.out)

    ASAN_选项=符号=1 a.out
=================================================================
==32415==错误:地址消毒器:pc 0x10b136d5c bp 0x7fff54b8e5d0 sp 0x7fff54b8e5c8上的地址0x6006004b38a0上的堆缓冲区溢出
在0x6004B38A0螺纹T0处写入尺寸8
#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+0x1001DFEB)
#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
另一种选择是,这是我多年来在叮当声下一直在做的事情。通过
asan_symbol
管道输出符号。所以你应该做一些类似的事情:

/test.exe 2>&1 | asan|u符号
我在
/usr/bin
/usr/local/bin
中都有
asan_符号

$find/usr/-name asan*
/usr/bin/asan_符号
/usr/lib/llvm-3.4/lib/clang/3.4/include/sanitizer/asan_interface.h
/usr/local/bin/asan_symbol.py
/usr/local/lib/clang/3.5.0/include/sanitizer/asan_interface.h
我有两个副本,因为其中一个是通过
apt-get
/usr/bin/asan_-symbol
)安装的,我偶尔会从源代码中创建Clang(
/usr/local/bin/asan_-symbol.py

如果你没有拷贝,那么我相信你可以从谷歌代码中获取


一旦开始使用
asan_symbol
,您可能会遇到这样一种情况,即
asan_symbol
由于路径更改而找不到符号(例如,程序或库已从其生成位置复制到目标目录)。有关详细信息,请参阅Asan邮件列表上的

在kcc的回答中,他的意思是:

/test.exe 2>&1 | sed“s///g”| asan|u符号
(我想这就是我在测试博士后时必须做的事情)



Python有一个关于叮当声及其消毒剂的速成课程。它讨论诸如获取堆栈跟踪之类的主题。(我为Python项目编写了页面,以帮助他们将Clang及其消毒剂添加到其发布工程过程中。虽然已经有几年了,但我相信所有信息仍然适用)。

GCC 4.9.3不需要单独的符号


您有编译到可执行文件中的调试信息吗?@buc030我想是的,使用
-g3
标志。然后尝试addr2line,它是一个unix命令行实用程序,可以帮助您将地址转换为更重要的名称您使用的是哪个版本的GCC?常量被命名为an_symbolr_PATH,似乎对我有用。当你使用GCC编译时,棘手的一点是symbol=1。在叮当声中,这是可选的。请参阅我的要点:GCC(上文4.9.3)不再要求使用asan时禁用哪些标志? ASAN_OPTIONS=symbolize=1 a.out