Debugging 如何从重复分配中跟踪生命周期堆使用情况

Debugging 如何从重复分配中跟踪生命周期堆使用情况,debugging,optimization,fortran,valgrind,heap-memory,Debugging,Optimization,Fortran,Valgrind,Heap Memory,我有一个程序,在它的生命周期中使用的内存总量比我预期的要多得多,我想看看是否有什么我可以做的 我使用了Valgrind的memcheck工具来消除内存泄漏,使用Valgrind的massif工具来查看堆快照。massif可以告诉我在特定时间点,哪些线负责最大的堆块。由于massif没有显示任何非常大的内容,我怀疑我的问题是某些行多次执行较小的分配 以防一些数字会有帮助:程序运行约5秒,进行密集的数值计算。内存使用的峰值为1MB。内存使用寿命为10GB。最大的单次分配是250KB,这是8次分配 因

我有一个程序,在它的生命周期中使用的内存总量比我预期的要多得多,我想看看是否有什么我可以做的

我使用了Valgrind的memcheck工具来消除内存泄漏,使用Valgrind的massif工具来查看堆快照。massif可以告诉我在特定时间点,哪些线负责最大的堆块。由于massif没有显示任何非常大的内容,我怀疑我的问题是某些行多次执行较小的分配

以防一些数字会有帮助:程序运行约5秒,进行密集的数值计算。内存使用的峰值为1MB。内存使用寿命为10GB。最大的单次分配是250KB,这是8次分配

因此,我希望看到的不是哪一行在任何特定时间点分配了大量内存,而是程序整个生命周期中分配的每一行内存的总和。我觉得Valgrind应该可以访问这些信息,因为它跟踪每一次分配,但我不知道如何让它告诉我


有谁能建议如何使用Valgrind报告此信息,或者使用其他工具来完成我想要的任务吗?

据我所知,您不想查看当前内存使用情况的“快照”, 但您需要查看堆栈跟踪所完成的累积分配,甚至 如果释放了大部分分配的内存

为此,您可以尝试选项--xtree memory=full

The xtrees produced by the option --xtree-memory or the xtmemory monitor command are showing the following events/resource consumption describing heap usage:

    curB current number of Bytes allocated. The number of allocated bytes is added to the curB value of a stack trace for each allocation. It is decreased when a block allocated by this stack trace is released (by another "freeing" stack trace)

    curBk current number of Blocks allocated, maintained similary to curB : +1 for each allocation, -1 when the block is freed.

    totB total allocated Bytes. This is increased for each allocation with the number of allocated bytes.

    totBk total allocated Blocks, maintained similary to totB : +1 for each allocation.

    totFdB total Freed Bytes, increased each time a block is released by this ("freeing") stack trace : + nr freed bytes for each free operation.

    totFdBk total Freed Blocks, maintained similarly to totFdB : +1 for each free operation.

Note that the last 4 counts are produced only when the --xtree-memory=full was given at startup.
此选项将与各种工具以及生成的文件一起使用 可以通过kcachegrind在a.o.中可视化

看 和更多信息


您还可以尝试使用--tool=dhat,这是一种专门用来报告您的程序如何处理分配的内存的工具。

您是否使用Fortran的
指针
属性?如果是,则停止使用它,除非您正在跟踪目标的所有分配/解除分配。有趣的是,您应该提到这一点。我开始用Valgrind研究这个程序,以去除所有指针,我现在已经这样做了,但这就是为什么我看到内存使用量有多大。正如您可能发现的那样,
allocate(ptr(10))
将分配10个实体的匿名目标。如果您未首先解除分配
ptr
而将
ptr
指针分配给其他对象,则会导致内存泄漏。这在与memcheck一起使用时效果非常好。左侧的函数列表表示每个函数的生存期分配,可以通过“Self”列进行排序,以快速找到最大的罪魁祸首。在每个函数中,右侧的“源代码”选项卡逐行列出了每行的生存期分配。