gpt4 book ai didi

c++ - 如何在通过应用程序进行单步调试时检查堆分配?

转载 作者:太空狗 更新时间:2023-10-29 12:38:57 26 4
gpt4 key购买 nike

我需要查看程序某部分的内存消耗。在这一点上,我不关心泄漏,只关心程序何时分配堆中的对象。我可以将分配追溯到某些方法,但现在我需要放大。理想情况下,我想逐步调试代码以到达关键部分,并且对于每一步,我都会更新已分配的内存和位置。

我尝试以不同的方式使用 valgrind --massif。我得到的最接近的是使用 vgdb 并在我感兴趣的部分之前和之后强制快照,然后在 massif-visualizer 中手动比较这些快照。但是,我似乎无法以可见的小分配 (<1mB) 的方式设置阈值或忽略方法,因为程序在启动期间分配了几百 mB。

我也尝试了 gperftools heapprofiler 但没有取得更多进展。

(我也试过 heaptrack 但到目前为止未能编译 gui 工具)

我觉得我在这里遗漏了一些东西,让事情变得比他们必须的更复杂。如何在通过我的应用程序进行单步调试时检查堆分配?

CentOS7 3.10, gcc 4.8.5

更新:这是一项重复性任务,我不能总是重新编译软件。我正在寻找一种通用解决方案,可以在分析“奇怪”的内存消耗时有效地重复使用。商业工具也可以,只要它们 def 就可以。完成工作。

最佳答案

如果您在使用外部工具时遇到问题,您也可以在代码中进行粗略的分析。

您可以覆盖每个类的静态新运算符。这将允许您记录/打印类型名称、大小等,并执行初始过滤 - 例如您的 1MiB 限制。或者,您可以全局覆盖 new 运算符以捕获所有分配。

如果您使用标准库容器,自定义分配器也是跟踪的一个选项,如果涉及更多的话。

一旦分配在您的控制之下,您应该能够在您的关键部分启用/禁用一次日志记录。

关于c++ - 如何在通过应用程序进行单步调试时检查堆分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56735820/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com