Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ LeakSanitizer:获取运行时泄漏报告?_C++_Linux_Multithreading_Memory Leaks_Address Sanitizer - Fatal编程技术网

C++ LeakSanitizer:获取运行时泄漏报告?

C++ LeakSanitizer:获取运行时泄漏报告?,c++,linux,multithreading,memory-leaks,address-sanitizer,C++,Linux,Multithreading,Memory Leaks,Address Sanitizer,我继承了一些遗留代码,它似乎在某个地方有内存泄漏。我的第一反应是用 -faddress=sanitize -fno-omit-frame-pointer 让地址消毒器系列工具帮我找到漏洞。然而,我非常失望。我希望得到某种运行时错误消息(类似于不应该读取或写入内存时地址消毒器的错误)。在程序成功完成之前,泄漏消毒剂似乎不会进行任何泄漏检查分析。我的问题是我继承的代码有几个线程,它不是为了加入所有线程来准备软着陆 我在一个简单的例子中简化了我的问题: #include <thread>

我继承了一些遗留代码,它似乎在某个地方有内存泄漏。我的第一反应是用

-faddress=sanitize -fno-omit-frame-pointer
让地址消毒器系列工具帮我找到漏洞。然而,我非常失望。我希望得到某种运行时错误消息(类似于不应该读取或写入内存时地址消毒器的错误)。在程序成功完成之前,泄漏消毒剂似乎不会进行任何泄漏检查分析。我的问题是我继承的代码有几个线程,它不是为了加入所有线程来准备软着陆

我在一个简单的例子中简化了我的问题:

#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;                                                
}    
然后和我一起跑

ASAN_OPTIONS='detect_leaks=1' LSAN_OPTIONS='exitcode=55:report_objects=true:log_threads=true:log_pointers=true' ./leaker                                                
(我对这里的“LSAN_选项”有点疯狂,因为我在四处玩……没有一个选项达到了我想要的效果,但是在得知泄漏后退出)

正如代码中提到的,如果我加入线程,然后退出程序,我会得到一个非常好的泄漏报告。否则我什么也得不到。正如您可以想象的那样,在一个遗留代码库中跟踪10-100个线程并使它们都很好地运行是很难实现的


几年前,我记得玩过它,运气不错,因为它会生成包含所有潜在内存泄漏的报告(我不记得必须很好地记录所有内容)。问题是这个工具只适用于Windows,我的代码只适用于Linux。我可以让LeakSanitizer工具做类似的事情吗

LeakSanitizer()的公共接口具有各种功能,可以满足您的需要。函数
\u lsan\u do\u leak\u check()
执行检查并在发现泄漏时终止。还有一个
\u lsan\u do\u recoverable\u leak\u check
,它不会终止,可以多次调用

考虑对您的程序进行此修改:

#include <thread>
#include <chrono>
#include <iostream>
#include <sanitizer/lsan_interface.h>

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();
   __lsan_do_recoverable_leak_check();
   std::cout << "Done\n";
   return 0;
}
#包括
#包括
#包括
#包括
bool exit_thread=false;
void threadFunc()
{
而(!退出线程)
{
char*leak=新字符[256];
std::this_thread::sleep_for(std::chrono::seconds{1});
}
}
int main(){
标准:螺纹t(threadFunc);

std::你可能想调查一下。不幸的是,我的应用程序无法处理valgrind的减速
#include <thread>
#include <chrono>
#include <iostream>
#include <sanitizer/lsan_interface.h>

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();
   __lsan_do_recoverable_leak_check();
   std::cout << "Done\n";
   return 0;
}
Waiting
Exiting

=================================================================
==29240==ERROR: LeakSanitizer: detected memory leaks

Direct leak of 1024 byte(s) in 4 object(s) allocated from:
    #0 0x4d9a30 in operator new[](unsigned long) (leaker+0x4d9a30)
    #1 0x4dc663 in threadFunc() leaker.cpp:12:20
    #2 0x4dffe3 in void std::_Bind_simple<void (*())()>::_M_invoke<>(std::_Index_tuple<>) /usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/5.2.0/../../../../include/c++/5.2.0/functional:1530:18
    #3 0x4dff94 in std::_Bind_simple<void (*())()>::operator()() /usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/5.2.0/../../../../include/c++/5.2.0/functional:1520:16
    #4 0x4dfcc8 in std::thread::_Impl<std::_Bind_simple<void (*())()> >::_M_run() /usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/5.2.0/../../../../include/c++/5.2.0/thread:115:13
    #5 0x7f0a9664034f in execute_native_thread_routine /build/gcc-multilib/src/gcc-5.2.0/libstdc++-v3/src/c++11/thread.cc:84

SUMMARY: AddressSanitizer: 1024 byte(s) leaked in 4 allocation(s).
Done
terminate called without an active exception
Aborted