memory-leaks - 检测泄漏与泄漏检查at_exit?
问题描述
我使用AddressSanitizer来检查我的应用程序的内存泄漏,但我对这两个标志之间的区别感到困惑:detect_leaks
vs leak_check_at_exit
.
我认为下面的代码应该报告内存泄漏,即使leak_check_at_exit=0
因为泄漏已经发生在每个循环期间,而不是在主函数返回之后:
int main() {
void *mem;
for(int i=0; i<1000; i++) {
mem = malloc(1024);
}
return 0;
}
随着detect_leaks=1:leak_check_at_exit=1
程序确实给出了正确的内存泄漏报告:
=================================================================
==73448==ERROR: LeakSanitizer: detected memory leaks
Direct leak of 1024000 byte(s) in 1000 object(s) allocated from:
#0 0x7f0933f053f8 in __interceptor_malloc (/usr/lib/x86_64-linux-gnu/libasan.so.3+0xc23f8)
#1 0x42c8c1 in main src/main.cpp:10
#2 0x7f0931b05ec4 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21ec4)
但detect_leaks=1:leak_check_at_exit=0
它不会报告任何内存泄漏。在我看来,设置leak_check_at_exit=0
等同于设置detect_leaks=0
。
问题detect_leaks
:和有什么区别leak_check_at_exit
?
解决方案
LeakSanitizer 的工作原理是分析程序内存中指向已分配块的指针。分析非常慢,因此仅在执行结束时执行(您也可以通过调用来运行它__lsan_do_leak_check
)。
当你设置leak_check_at_exit=0
你有效地禁用 Lsan。您可以在每次循环迭代时手动插入__lsan_do_leak_check
,但这会减慢程序速度,并且如果您的应用程序有多个线程,也可能无法正常运行。
推荐阅读
- ios - Xcode 11 Beta 不会因为 WatchKit 而构建?
- swift - 致命错误:单击特定单元格进行 segue 时索引超出范围
- julia - 使用 get 和 set 索引函数进行基于范围的切片?
- ios - Verifone e355 iOS 集成 - 无法使用软模式触发条码扫描器
- java - 哪个是更快的 i++ 或 ++i 以及为什么
- sql-server - 向 Web 服务连接授予数据库权限的良好做法是什么?
- angular - Angular 和 Laravel 错误 - 应用程序已被 CORS 策略阻止
- python - 遍历具有多个句柄的 Pandas DataFrame,并迭代地追加编辑的行?
- c# - 如何从 BuckarooSdk 获取付款状态?
- node.js - NodeJs 未在端口 4000 中运行