泄漏消毒器在程序退出后不生成报告



我正在使用地址消毒程序进行编译,并且我试图获得泄漏消毒程序报告,但由于某种原因,它只生成地址消毒程序报告,而不生成泄漏消毒程序报告。

我正在编译Centos 7.9与g++ 9.3.1, Cmake版本3.16.2。

我用

编译

list(APPEND SAN_FLAGS "-fsanitize=address"-fno-omit-frame-pointer"-g3"

启用泄漏消毒器(根据文档,应该在Linux上启用地址消毒器)

Environment="ASAN_OPTIONS=log_path=/var/log/foo_asan.log:detect_leaks=1"

,然后用systemd运行我的程序(也在Centos 7.9上)。使用systemctl停止程序会创建一个foo_asan。日志文件中只有AddressSanitizer报告,而没有LeakSanitizer报告。我怎样才能拿到消毒剂泄漏报告?

日志文件中只有AddressSanitizer报告,没有LeakSanitizer报告。

默认情况下,AddressSanitizer在出现错误时终止。LeakSanitizer只运行在exit上,因为你的程序不运行在exit上,所以你不会得到泄漏报告。

下面是一个既存在内存泄漏又存在缓冲区溢出的示例程序:

#include <malloc.h>
void *alloc(size_t sz) { return malloc(sz); }
void fn(char *p, int n) { p[n] = ''; }
int main()
{
const int sz = 10;
fn(alloc(sz), sz);
return 0;
}

如果我用clang -g -fsanitize=address leaky.c -o leaky构建它并用ASAN_OPTIONS=detect_leaks=1运行它,我只得到错误报告:

=================================================================
==1130841==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x60200000001a at pc 0x5555a7f31f0f bp 0x7ffc86de9420 sp 0x7ffc86de9418
WRITE of size 1 at 0x60200000001a thread T0
#0 0x5555a7f31f0e in fn /tmp/leaky.c:4:32
#1 0x5555a7f31f4c in main /tmp/leaky.c:9:3
...
==1130841==ABORTING     <<<=== Note this.

这个答案显示了如何使程序而不是在出现错误时中止。当我这样做时,我得到AddressSanitizer和LeakSanitizer报告:

clang -g -fsanitize=address -fsanitize-recover=address leaky.c -o leaky
ASAN_OPTIONS=detect_leaks=1:halt_on_error=0 ./leaky
=================================================================
==1131013==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x60200000001a at pc 0x560f9d467f0f bp 0x7ffef258d2b0 sp 0x7ffef258d2a8
WRITE of size 1 at 0x60200000001a thread T0
#0 0x560f9d467f0e in fn /tmp/leaky.c:4:32
#1 0x560f9d467f5c in main /tmp/leaky.c:9:3
...
=================================================================
==1131013==ERROR: LeakSanitizer: detected memory leaks
Direct leak of 10 byte(s) in 1 object(s) allocated from:
#0 0x560f9d42d14e in __interceptor_malloc (/tmp/leaky+0xa314e) (BuildId: d2d081353c37b4b7a8659b1ac39242cfe6259078)
#1 0x560f9d467eb4 in alloc /tmp/leaky.c:3:33
#2 0x560f9d467f4f in main /tmp/leaky.c:9:6
#3 0x7fbf2cc29209 in __libc_start_call_main csu/../sysdeps/nptl/libc_start_call_main.h:58:16
SUMMARY: AddressSanitizer: 10 byte(s) leaked in 1 allocation(s).

最新更新