【发布时间】:2016-01-17 00:41:07
【问题描述】:
我继承了一些遗留代码,它似乎在某处存在内存泄漏。我的第一反应是用
编译-faddress=sanitize -fno-omit-frame-pointer
让 Address Sanitizer 的工具系列帮我找出漏洞。然而,我非常失望。我希望得到某种运行时错误消息(类似于地址清理程序在您不应该读取或写入内存时出现的错误)。在程序成功完成之前,泄漏消毒剂似乎不会进行任何泄漏检查分析。我的问题是我继承的代码有几个线程,它并不是为了准备软着陆而设计的。
我用一个简单的例子简化了我的问题:
#include <thread>
#include <chrono>
#include <iostream>
bool exit_thread = false;
void threadFunc()
{
while(!exit_thread)
{
char* leak = new char[256];
std::this_thread::sleep_for(std::chrono::seconds{1});
}
}
int main() {
std::thread t(threadFunc);
std::cout << "Waiting\n";
std::this_thread::sleep_for(std::chrono::seconds{5});
exit_thread = true;
std::cout << "Exiting\n";
//Without joining here I do not get the leak report.
t.join();
return 0;
}
我用这个编译
clang++ leaker.cpp -fsanitize=address -fno-omit-frame-pointer -g -O0 -std=c++1y -o leaker
然后用
跑ASAN_OPTIONS='detect_leaks=1' LSAN_OPTIONS='exitcode=55:report_objects=true:log_threads=true:log_pointers=true' ./leaker
(我在这里的“LSAN_OPTIONS”有点疯狂,因为我在玩......没有一个选项能达到我想要的效果,但是在得知泄漏后退出)。
如代码中所述,如果我加入线程然后退出程序,我会得到一个漂亮的泄漏报告。否则我什么也得不到。正如您所想象的那样,在遗留代码库中跟踪 10-100 个线程并且让它们都很好地关闭是很笨拙的。
几年前,我记得我玩过Visual Leak Detector 并且运气不错,因为它会生成包含所有潜在内存泄漏的报告(我不记得必须很好地删除所有内容)。问题是这个工具只适用于 Windows,我的代码只适用于 Linux。我可以让 LeakSanitizer 工具做类似的事情吗?
【问题讨论】:
-
您可能想查看Valgrind。
-
不幸的是,我的应用程序无法处理 valgrind 减速
标签: c++ linux multithreading memory-leaks address-sanitizer