【问题标题】:clang memory sanitizer; how to make it print source line numbers叮当记忆消毒剂;如何让它打印源代码行号
【发布时间】:2014-06-25 02:59:08
【问题描述】:

我正在用clang++ -fsanitize=memory -fsanitize-memory-track-origins -fno-omit-frame-pointer -g -O0 编译我的程序,当我运行它时,输出是:

matiu@matiu-laptop:~/projects/json++11/build$ ./tests 
.......==10534== WARNING: MemorySanitizer: use-of-uninitialized-value
    #0 0x7fe7602d4a51 (/home/matiu/projects/json++11/build/tests+0x106a51)
    #1 0x7fe7602dfca6 (/home/matiu/projects/json++11/build/tests+0x111ca6)
    ...
    #31 0x7fe75edbaec4 (/lib/x86_64-linux-gnu/libc.so.6+0x21ec4)
    #32 0x7fe7602808dc (/home/matiu/projects/json++11/build/tests+0xb28dc)

  Uninitialized value was created by a heap allocation
    #0 0x7fe76026e7b3 (/home/matiu/projects/json++11/build/tests+0xa07b3)
    #1 0x7fe7602ee7da (/home/matiu/projects/json++11/build/tests+0x1207da)
    ...
    #18 0x7fe7602c1c4c (/home/matiu/projects/json++11/build/tests+0xf3c4c)
    #19 0x7fe7602873fa (/home/matiu/projects/json++11/build/tests+0xb93fa)

SUMMARY: MemorySanitizer: use-of-uninitialized-value ??:0 ??
Exiting

我怎样才能让它像漂亮的例子一样显示行号:http://clang.llvm.org/docs/MemorySanitizer.html

我怀疑这可能是不可能的,因为我的程序是一大堆嵌套的 lambda:https://github.com/matiu2/json--11/blob/master/tests.cpp

【问题讨论】:

  • 所以它会在示例中打印行号,而不是在您的代码中? addr2line 可能会有所帮助,但不是您真正想要的。
  • 感谢@keltar,这绝对有帮助:$ addr2line -e tests 0x15c59a /.../bandit/src/bandit/bandit/grammar.h:126

标签: clang++ msan


【解决方案1】:

使用地址清理程序,我注意到我需要定义这些环境变量:

  • ASAN_OPTIONS=symbolize=1(仅在使用 GCC > 4.8 编译时需要)和
  • ASAN_SYMBOLIZER_PATH=$(which llvm-symbolizer) 我认为符号器就是你要找的。它将符号转换为带有行号和列的文件名。

memory sanitizer project website 上写着:

符号化

将 MSAN_SYMBOLIZER_PATH 环境变量设置为 llvm-symbolizer 二进制文件(通常使用 LLVM 构建)。 MemorySanitizer 将使用它来对动态报告进行符号化。

所以您需要将MSAN_SYMBOLIZER_PATH 设置为类似于ASAN_SYMBOLIZER_PATH

【讨论】:

  • 感谢 Konrad,这正是我所需要的 :) 事实证明,在我的 Ubuntu 安装中,llvm-symbolizer 被命名为 llvm-symbolizer-3.5 .. 在 /usr/bin 中添加符号链接/llvm-symbolizer 并将其放在路径中就可以了。
  • 在 Ubuntu 上,仍然需要创建符号链接才能打印行号。
  • 在 ubuntu 上,您需要 apt install llvm(至少从 18.04 开始)
  • @matiu,在 Ubuntu 20.10 中,该位置是预期的位置:/usr/bin/llvm-symbolizer
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-26
  • 1970-01-01
相关资源
最近更新 更多