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++ 检测内存分配的主要内容,如果未能解决你的问题,请参考以下文章