【发布时间】:2014-07-04 03:46:57
【问题描述】:
我正在尝试用asan 调试clang 检测到的内存错误,但valgrind 错过了。但是我无法获得我的clang 构建的二进制文件来给我任何有用的调试信息。我可以用一个简短的测试程序来证明这一点:
#include <stdlib.h>
#include <string.h>
int main(void)
{
char *a = malloc(8);
memset(a, 0, 9);
free(a);
return 0;
}
(很明显这个错误会被valgrind捡起来,纯粹是为了说明clang的问题。)
我用 Clang 3.4-1ubuntu1 像这样编译它:
clang -fsanitize=address -fno-sanitize-recover -o test -O0 -g test.c
果然,./test 中止,我看到一些调试信息:
==3309==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x60200000eff8 at pc 0x43e950 bp 0x7fff168724f0 sp 0x7fff168724e8
WRITE of size 9 at 0x60200000eff8 thread T0
#0 0x43e94f (/home/jason/Code/astest/test+0x43e94f)
#1 0x7faa43c47de4 (/lib/x86_64-linux-gnu/libc.so.6+0x21de4)
#2 0x43e6ac (/home/jason/Code/astest/test+0x43e6ac)
0x60200000eff8 is located 0 bytes to the right of 8-byte region [0x60200000eff0,0x60200000eff8)
allocated by thread T0 here:
#0 0x42cc25 (/home/jason/Code/astest/test+0x42cc25)
#1 0x43e874 (/home/jason/Code/astest/test+0x43e874)
#2 0x7faa43c47de4 (/lib/x86_64-linux-gnu/libc.so.6+0x21de4)
但我真正想知道的是发生错误的行号,以及分配内存的位置。
如何从clang+asan 获取此信息?
【问题讨论】:
-
This page我的帮助。
-
@ShafikYaghmour 该页面让我找到了使用
ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer-3.4 ./test的解决方案,这比为堆栈跟踪中的每个条目手动运行addr2line要好得多。你想把它作为答案发布,还是留给我? -
我本来打算把它作为答案发布但我没有时间测试它,让我现在发布它。
标签: c clang address-sanitizer