【问题标题】:LeakSanitizer not working under gdb in Ubuntu 18.04?LeakSanitizer 不能在 Ubuntu 18.04 的 gdb 下工作?
【发布时间】:2019-05-30 01:52:22
【问题描述】:

我最近将我的 Linux 开发虚拟机从 Ubuntu 16.04 升级到了 18.04,并注意到一件事发生了变化。这是在 x86-64 上。在 16.04 中,我一直有这个工作流程,我将使用 gcc(5.4,16.04 中的库存版本)和-fsanitize=address-O0 -g 构建我正在处理的项目,然后通过 gdb 运行可执行文件( 7.11.1,也是 Ubuntu 附带的版本)。这很好用,最后,如果 LeakSanitizer 检测到内存泄漏,它会生成泄漏报告。

在 18.04 中,这似乎不再起作用; LeakSanitizer 抱怨在 ptrace 下运行:

==5820==LeakSanitizer has encountered a fatal error.
==5820==HINT: For debugging, try setting environment variable LSAN_OPTIONS=verbosity=1:log_threads=1
==5820==HINT: LeakSanitizer does not work under ptrace (strace, gdb, etc)

然后程序崩溃:

Thread 1 "spyglass" received signal SIGABRT, Aborted.
__GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51

我不确定是什么导致了新行为。在 18.04 上,我使用默认 gcc (7.3.0) 构建,使用 -fsanitize=address -O0 -g 并使用默认 gdb (8.1.0) 进行调试。可以以某种方式重新启用旧行为吗?或者我是否需要更改我的工作流程并从程序中分离出来,然后才能将其终止以获得泄漏报告?

【问题讨论】:

  • 同时我发现了这个:github.com/google/sanitizers/issues/857。不过信息很短。
  • 我在一个小示例程序上进行了跟踪。看来 gcc 5 中的 lsan 并不认为 ptrace 失败是致命的。我还不知道忽略失败对其结果的质量有何影响,但我会看看。解决方法是在你的 18.04 系统上安装 gcc-5 包(它在标准 repo 中)并在你使用 cc 的任何地方使用 gcc-5

标签: linux gcc gdb address-sanitizer gcc7


【解决方案1】:

LeakSanitizer 在内部使用 ptrace,可能会暂停所有线程,以便它可以扫描泄漏而不会出现误报(请参阅 issue 9)。只有一个应用程序可以使用 ptrace,所以如果你在 gdb 或 strace 下运行你的应用程序,那么 LeakSanitizer 将无法通过 ptrace 附加。

如果您对泄漏调试不感兴趣,请禁用它:

export ASAN_OPTIONS=detect_leaks=0

如果您确实要启用泄漏调试,则必须在 LeakSanitizer 开始扫描之前分离调试器。为了能够在不久之后附加调试器,请稍等片刻(例如,10 秒):

export ASAN_OPTIONS=sleep_before_dying=10
./program

然后在另一个 shell 中,再次附加到应用程序:

gdb -q -p $(pidof program)

有关上述(和其他)选项的更多描述,请参阅https://github.com/google/sanitizers/wiki/AddressSanitizerFlags

【讨论】:

  • 谢谢,我注意到可以禁用泄漏检查。不过,这仍然很烦人,这在过去非常有效。
  • 请注意,您在上面的行中有错字,至少在 bash 下运行时是这样。 export XXX:= 语法不起作用:export ASAN_OPTIONS:sleep_before_dying=1 bash: export: `ASAN_OPTIONS:sleep_before_dying=1': not a valid identifier
  • 修正了错字。通常我有更多以冒号分隔的选项,例如:ASAN_OPTIONS=abort_on_error=1:report_objects=1:sleep_before_dying=1.
猜你喜欢
  • 1970-01-01
  • 2018-10-11
  • 1970-01-01
  • 2019-03-22
  • 1970-01-01
  • 2020-04-14
  • 2018-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多