内存泄漏检查实时应用程序

时间:2016-07-26 14:30:11

标签: c++ linux memory-leaks

我正在用c ++开发一个项目,就像实时应用程序一样,持续监控所有关键设备的数据。我尝试使用Valgrind来检查应用程序中的内存泄漏,但是当我尝试使用Valgrind进行实时测试时,它会大大减慢我的应用程序速度,从而导致系统性能受损。

在实时应用程序中是否有可用于执行内存泄漏检查的方法或工具?

2 个答案:

答案 0 :(得分:2)

一些内存分析工具,如valgrind,Dr. Memory和Intel Inspector使用二进制执行引擎,这意味着它们实际上是反汇编,然后模拟执行。他们还采用了一种称为影子存储器的技术,帮助他们跟踪所有读写访问。他们这样做不仅是为了发现内存泄漏,还有缓冲区溢出,损坏等等。

然而,当涉及仅基于堆的泄漏发现时,捕获对堆分配功能的调用可能就足够了。这基本上是通过一种叫做钩子的方法来完成的。

对于Linux:

<强> 1。 Heaptrack:我还没用过自己。但是这个使用挂钩并声称要比valgrind快得多:

其网页:http://milianw.de/blog/heaptrack-a-heap-memory-profiler-for-linux

其CPPCon 2015视频:https://www.youtube.com/watch?v=myDWLPBiHn0

<强> 2。地址清理程序:由于您可以访问源代码并进行编译,因此您可以同时使用GCC(4.8+)和Clang。至于GCC搜索-fsanitize = leak

第3。 GNU LIB C挂钩:您还可以以编程方式挂钩GNU Lib C运行时内存函数。有关示例,请查看此处:https://github.com/akhin/cpp_multithreaded_order_matching_engine/blob/master/source/memory/debugging/hook_gnu_libc.h

您还可以使用程序断点将其组合在一起。举个例子:

https://github.com/akhin/cpp_multithreaded_order_matching_engine/blob/master/source/memory/debugging/hardware_breakpoint.h

我发现这种方法特别有用,因为您可以将搜索范围缩小到范围分配事件。

<强> 4。使用第三方分配器:您可以使用第三方分配器,例如Google的TCMalloc或Jemalloc来查找泄漏:

https://github.com/jemalloc/jemalloc/wiki/Use-Case%3A-Leak-Checking

http://goog-perftools.sourceforge.net/doc/heap_checker.html

答案 1 :(得分:0)

查看地址消毒剂,泄漏消毒剂和其他相关工具:http://clang.llvm.org/docs/AddressSanitizer.htmlhttp://clang.llvm.org/docs/LeakSanitizer.html