我正在用c ++开发一个项目,就像实时应用程序一样,持续监控所有关键设备的数据。我尝试使用Valgrind来检查应用程序中的内存泄漏,但是当我尝试使用Valgrind进行实时测试时,它会大大减慢我的应用程序速度,从而导致系统性能受损。
在实时应用程序中是否有可用于执行内存泄漏检查的方法或工具?
答案 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
您还可以使用程序断点将其组合在一起。举个例子:
我发现这种方法特别有用,因为您可以将搜索范围缩小到范围分配事件。
<强> 4。使用第三方分配器:您可以使用第三方分配器,例如Google的TCMalloc或Jemalloc来查找泄漏:
https://github.com/jemalloc/jemalloc/wiki/Use-Case%3A-Leak-Checking
答案 1 :(得分:0)