C++ 检测内存分配

Posted

技术标签:

【中文标题】C++ 检测内存分配【英文标题】:C++ detect memory allocation 【发布时间】:2016-07-17 07:49:16 【问题描述】:

我正在尝试提高我的 C++ 程序的性能,我发现将内存分配 (malloc) 转换为对象池会产生很好的效果。 问题在于检测调用 malloc 的位置,因为代码库非常大。我不能使用带断点的简单 gdb,因为有许多计时器和信号处理程序并行运行。

gdb 中有没有一种方法可以在调用 malloc 时打印整个堆栈跟踪,而不必每次都手动执行。 或者 你能推荐任何其他工具来帮助我做同样的事情吗?

【问题讨论】:

在整个代码库中搜索字符串 malloc 有多难? 为什么在 C++ 代码中使用 malloc?你应该使用新的。在这种情况下,您可以定义自己的新运算符 你可以在 GDB 中做this 吗?如果它落在 malloc(或 new)中,您就找到了一个活的。如果没有,在 20 个左右的样本之后,它使用的时间太少,以至于优化它真的不值得。 @MikeDunlavey 它将登陆 malloc 因为 new 使用它.. 我想 pool 也使用它 【参考方案1】:

您可以使用 Python 编写 gdb 脚本。

您还可以实现自己的 malloc 函数并与之链接。返回地址将在堆栈上,这将为您提供调用者。

【讨论】:

【参考方案2】:

valgrind 工具套件包含可以用于此目的的 massif:

valgrind --tool=massif ./mybinary

这会收集所有分配的详细信息,包括您可以在程序完成执行后检查的堆栈跟踪。有关输出的更多详细信息,请参阅地块文档:http://valgrind.org/docs/manual/ms-manual.html。希望对您有所帮助。

附:还要检查 TCMalloc 库——它可能已经做了你想要的,尽管你可以根据你的具体应用做得更好。最好的是不需要更改源代码 - 您只需使用链接器指令替换 glibc 中的 malloc 函数。

【讨论】:

以上是关于C++ 检测内存分配的主要内容,如果未能解决你的问题,请参考以下文章

C++中内存分配问题

Valgrind C++ 内存泄漏检测

Valgrind C++ 内存泄漏检测

C++内存分配及变长数组的动态分配

c++内存分配

在 C++ 中的 2D 动态内存分配数组中释放分配的内存