gpt4 book ai didi

c - 如何使用 clang 的 -fsanitize=address 在调试输出中获取行号?

转载 作者:太空狗 更新时间:2023-10-29 16:46:05 24 4
gpt4 key购买 nike

我正在尝试使用 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 获取这些信息?

最佳答案

如果我们看一下 clang AddressSanitizer documentation它说:

To make AddressSanitizer symbolize its output you need to set the ASAN_SYMBOLIZER_PATH environment variable to point to the llvm-symbolizer binary (or make sure llvm-symbolizer is in your $PATH):

并显示以下示例:

ASAN_SYMBOLIZER_PATH=/usr/local/bin/llvm-symbolizer ./a.out

正如 OP 指出的那样,安装位置可能会有所不同,但是一旦您知道 llvm-symbolizer 的位置,步骤就相同了。

关于c - 如何使用 clang 的 -fsanitize=address 在调试输出中获取行号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24566416/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com