【发布时间】: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