【发布时间】:2016-11-30 06:25:22
【问题描述】:
我正在用 C++ 开发一个项目,它就像实时应用程序不断监控所有关键设备的数据。我尝试使用 Valgrind 来检查应用程序中的内存泄漏,但是当我尝试使用 Valgrind 进行实时测试时,它会荒谬地减慢我的应用程序的速度,从而损害我的系统性能。
有没有这样的方法或工具可以用来在实时应用程序中进行内存泄漏检查?
【问题讨论】:
标签: c++ linux memory-leaks
我正在用 C++ 开发一个项目,它就像实时应用程序不断监控所有关键设备的数据。我尝试使用 Valgrind 来检查应用程序中的内存泄漏,但是当我尝试使用 Valgrind 进行实时测试时,它会荒谬地减慢我的应用程序的速度,从而损害我的系统性能。
有没有这样的方法或工具可以用来在实时应用程序中进行内存泄漏检查?
【问题讨论】:
标签: c++ linux memory-leaks
看看address sanitizer、leak sanitizer等相关工具:http://clang.llvm.org/docs/AddressSanitizer.html、http://clang.llvm.org/docs/LeakSanitizer.html
【讨论】:
一些内存分析工具,例如 valgrind、Dr. Memory 和 Intel Inspector 使用二进制执行引擎,这意味着它们实际上是反汇编然后模拟执行。他们还采用了一种称为影子内存的技术,可以帮助他们跟踪所有读写访问。他们这样做不仅是为了发现内存泄漏,还包括缓冲区溢出、损坏等。
但是,当仅涉及基于堆的泄漏发现时,捕获对堆分配函数的调用可能就足够了。这基本上是通过一种叫做 hooking 的方法来完成的。
对于 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.使用第 3 方分配器:您可以使用第 3 方分配器,例如 Google 的 TCMalloc 或 Jemalloc 来查找泄漏:
https://github.com/jemalloc/jemalloc/wiki/Use-Case%3A-Leak-Checking
【讨论】: