【问题标题】:Understanding ASAN output了解 ASAN 输出
【发布时间】:2020-01-04 14:36:48
【问题描述】:

我无法弄清楚为什么 ASAN 会给出这个输出,为什么我看不到我的代码中的错误在哪里和哪一行,这个错误甚至在我的代码中,还是在某些库中被程序使用? 这就是我构建项目的方式:

CC=clang CXX=clang++ 介子 -Db_sanitize=address -Db_lundef=false 构建-clang

然后我配置环境值并像这样运行可执行文件:

ASAN_OPTIONS=符号化=1 ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer ./executable

是的,这是 llvm-sybolizer 的有效路径

那么有没有办法让我知道可执行文件+0x431340 的含义以及它在我的代码中指向的位置?

=================================================================
==13110==ERROR: LeakSanitizer: detected memory leaks
Direct leak of 16384 byte(s) in 1 object(s) allocated from:
    #0 0x4e1340 in __interceptor_malloc (/home/maysara/Desktop/testscreen/build-clang/src/excutable+0x4e1340)
    #1 0x7ff16a2ccab8 in g_malloc (/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0+0x51ab8)

Direct leak of 4352 byte(s) in 17 object(s) allocated from:
    #0 0x4e1340 in __interceptor_malloc (/home/maysara/Desktop/testscreen/build-clang/src/excutable+0x4e1340)
    #1 0x7ff165e518ed  (/usr/lib/x86_64-linux-gnu/libfontconfig.so.1+0x1d8ed)

Direct leak of 3840 byte(s) in 6 object(s) allocated from:
    #0 0x4e17c0 in realloc (/home/maysara/Desktop/testscreen/build-clang/src/excutable+0x4e17c0)
    #1 0x7ff165e51998  (/usr/lib/x86_64-linux-gnu/libfontconfig.so.1+0x1d998)

Direct leak of 24 byte(s) in 1 object(s) allocated from:
    #0 0x4e1340 in __interceptor_malloc (/home/maysara/Desktop/testscreen/build-clang/src/excutable+0x4e1340)
    #1 0x7ff16a2ccab8 in g_malloc (/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0+0x51ab8)
    #2 0x7ff168b5910c in g_closure_invoke (/usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0+0x1010c)

Indirect leak of 10016 byte(s) in 313 object(s) allocated from:
    #0 0x4e1340 in __interceptor_malloc (/home/maysara/Desktop/testscreen/build-clang/src/excutable+0x4e1340)
    #1 0x7ff165e3ffef  (/usr/lib/x86_64-linux-gnu/libfontconfig.so.1+0xbfef)

Indirect leak of 4887 byte(s) in 405 object(s) allocated from:
    #0 0x43db60 in strdup (/home/maysara/Desktop/testscreen/build-clang/src/excutable+0x43db60)
    #1 0x7ff165e512f4 in FcValueSave (/usr/lib/x86_64-linux-gnu/libfontconfig.so.1+0x1d2f4)

Indirect leak of 4320 byte(s) in 135 object(s) allocated from:
    #0 0x4e1568 in calloc (/home/maysara/Desktop/testscreen/build-clang/src/excutable+0x4e1568)
    #1 0x7ff165e51fd8  (/usr/lib/x86_64-linux-gnu/libfontconfig.so.1+0x1dfd8)

Indirect leak of 2400 byte(s) in 75 object(s) allocated from:
    #0 0x4e1568 in calloc (/home/maysara/Desktop/testscreen/build-clang/src/excutable+0x4e1568)
    #1 0x7ff165e515c4  (/usr/lib/x86_64-linux-gnu/libfontconfig.so.1+0x1d5c4)

Indirect leak of 576 byte(s) in 18 object(s) allocated from:
    #0 0x4e1568 in calloc (/home/maysara/Desktop/testscreen/build-clang/src/excutable+0x4e1568)
    #1 0x7ff165e51440  (/usr/lib/x86_64-linux-gnu/libfontconfig.so.1+0x1d440)

Indirect leak of 144 byte(s) in 3 object(s) allocated from:
    #0 0x4e1340 in __interceptor_malloc (/home/maysara/Desktop/testscreen/build-clang/src/excutable+0x4e1340)
    #1 0x7ff165e4bacd in FcLangSetCreate (/usr/lib/x86_64-linux-gnu/libfontconfig.so.1+0x17acd)

SUMMARY: AddressSanitizer: 46943 byte(s) leaked in 974 allocation(s).

【问题讨论】:

  • 更喜欢发布文本而不是文本图像。

标签: linux memory-leaks clang llvm-clang address-sanitizer


【解决方案1】:

为了将代码地址解析为源代码位置,您需要在启用调试符号的情况下编译代码,例如使用编译器命令行上的-g 或通常使用构建系统的环境变量CFLAGSCXXFLAGS 进行相应设置:

CFLAGS="-g"
CXXFLAGS="-g"

这需要对实际引用的代码进行,例如这里不仅是executable 的代码,还包括glibfontconfig 等链接库,如果你想解析所有地址。

由于这些库可能是通过系统包管理器安装的,因此您需要查看发行版的文档如何安装调试符号。例如,对于 Ubuntu,通常有带有 -dbg 后缀的软件包变体。

无论如何,您的堆栈跟踪看起来都不是很有帮助,因此尚不清楚找到源代码位置是否会对您有所帮助。您可能希望在运行可执行文件时使用 -fno-omit-frame-pointer 重新编译可执行文件和/或设置环境变量 ASAN_OPTIONS=fast_unwind_on_malloc=0 以尝试改进它们。另见the ASAN faq

【讨论】:

  • 当我这样做时,这些标志不是由介子添加的:meson -Db_sanitize=address 吗?因为当我创建一个小型测试项目并执行上面相同的步骤时,它工作正常,但是当我在广泛使用外部库的大型项目上尝试这种方法时,它看起来像上面
  • 我刚刚添加了你说的标志,还是一样的:/
  • @MaysaraAlhindi — 如果使用 -g 编译没有帮助,那么您需要考虑获取(或创建?)引用库的调试版本。还要调查你是否可以获得比显示的两个条目更长的堆栈回溯——你的目标应该是获得足够长的跟踪,以便你可以看到 main 作为函数之一,这样你就可以知道从哪里调用了这些函数。跨度>
  • @MaysaraAlhindi 我认为堆栈跟踪中提到的任何符号实际上都不是您代码的一部分,它们都是库代码(即使归因于您的可执行文件的那些符号也是 asan 运行时库的一部分)。因此,仅为您的代码设置 -g 标志不会更改此输出。
  • 是否有任何指标可以知道 ASAN 输出是否指向我的代码的一部分或其他内容?
猜你喜欢
  • 2019-05-27
  • 1970-01-01
  • 2021-05-26
  • 2017-04-18
  • 2016-12-24
  • 2017-03-09
  • 2011-10-20
  • 2014-01-27
  • 2019-02-26
相关资源
最近更新 更多