c - 抑制由第三方库引起的间接泄漏
问题描述
我有这个非常简单C
的代码调用scheme
脚本guile
:
/* main.c */
#include <libguile.h>
int main(void)
{
scm_init_guile();
scm_c_primitive_load("script.scm");
SCM func = scm_variable_ref(scm_c_lookup("func"));
scm_call_0(func);
return 0;
}
scheme
脚本:
; script.scm
(define (func)
(display "Hello from scheme\n")
)
编译和运行:
export ASAN_OPTIONS=detect_leaks=1 LSAN_OPTIONS=suppressions=asan.supp
gcc -std=c11 -Wpedantic -Wall `pkg-config --cflags guile-3.0` \
-fsanitize=address -fno-omit-frame-pointer \
-o demo main.c `pkg-config --libs guile-3.0`
./demo
我能够抑制guile
使用此抑制文件 ( asan.supp
) 引起的一些泄漏:
leak:iconv_open
leak:libguile
但是其中一个泄漏没有提供足够的信息,消毒剂输出是:
=================================================================
==33333==ERROR: LeakSanitizer: detected memory leaks
Indirect leak of 208 byte(s) in 1 object(s) allocated from:
#0 0x7ff8a9b8d517 in malloc (/lib/x86_64-linux-gnu/libasan.so.6+0xb0517)
#1 0x7ff8a97e94f6 (/lib/x86_64-linux-gnu/libc.so.6+0x344f6)
-----------------------------------------------------
Suppressions used:
count bytes template
2 32752 iconv_open
1 32 libguile
-----------------------------------------------------
SUMMARY: AddressSanitizer: 208 byte(s) leaked in 1 allocation(s).
如您所见,有关泄漏的信息非常通用(malloc
和libc
),当然我不能放入libc
抑制文件,因为我不会获得有关我的真实泄漏的信息。
有没有办法抑制第三方库引起的所有“间接泄漏”?
解决方案
假设您已经使用了-您确实使用了-我相信在某些情况下-fno-omit-frame-pointer
您需要添加fast_unwind_on_malloc=0
到您的ASAN_OPTIONS
(or ) 中。LSAN_OPTIONS
这会更慢,但会提供更完整的回溯。
对于 C++ new
/ FAQ还建议切换到delete
,这可能会更快。不过,这似乎与您无关。-shared-libstdc++
推荐阅读
- c++ - 找不到 CMake 静态库的依赖项
- c# - 当我有两个非静态表单时,如何在它们之间进行事件
- css - 避免从 HTML 中的部分文本复制以避免不必要的内容?
- react-native - 单击 SideMenu 上的按钮时强制重新渲染汉堡图标
- vue.js - 重置路线,而不是向当前路线添加新路线
- python - 无法在 redhawk 的 fcalc 组件中设置方程式
- docker - 如何从 docker 容器中刷新 pixhawk?
- c# - 作为参数传递的对象不会在 c# 中初始化并失败
- ios - 在 Swift Project 中将 MPMoviePlayerController 全屏按钮图标更改为 iOS 中的标题图标
- c++ - 仅使用递归函数来计算给定数字的最终总和