首页 > 解决方案 > 如何让 valgrind 报告“绝对丢失”发生的“位置”

问题描述

有没有办法让 valgrind 报告“肯定丢失”的“哪里”发生?

我想要的不是“分配的地方”,而是“那块可怜的内存泄露的地方”。

例如,这段代码在f()返回时有一个“肯定丢失”的泄漏:

#include <stdlib.h>

void f () {
    void *ptr = malloc(42);
}

int main () {
    f();
    return 0;
}

但是 valgrind 只报告分配的来源:

==9772== HEAP SUMMARY:
==9772==     in use at exit: 42 bytes in 1 blocks
==9772==   total heap usage: 1 allocs, 0 frees, 42 bytes allocated
==9772==
==9772== 42 bytes in 1 blocks are definitely lost in loss record 1 of 1
==9772==    at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==9772==    by 0x40053E: f (test.c:4)
==9772==    by 0x400552: main (test.c:8)
==9772==
==9772== LEAK SUMMARY:
==9772==    definitely lost: 42 bytes in 1 blocks
==9772==    indirectly lost: 0 bytes in 0 blocks
==9772==      possibly lost: 0 bytes in 0 blocks
==9772==    still reachable: 0 bytes in 0 blocks
==9772==         suppressed: 0 bytes in 0 blocks
==9772==
==9772== For counts of detected and suppressed errors, rerun with: -v
==9772== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)

我正在使用--leak-check=full--track-origins=yes

标签: cmemory-leaksvalgrind

解决方案


我想要的不是“分配的地方”,而是“那块可怜的内存泄露的地方”。

不,Valgrind 只报告内存分配的位置,而不是何时泄露或泄露的原因。这种行为记录在Memcheck 手册中:

如果指定了 --leak-check=full,Memcheck 将提供每个确定丢失或可能丢失的块的详细信息,包括分配位置。(实际上,它将具有相同泄漏类型和足够相似的堆栈跟踪的所有块的结果合并到单个“丢失记录”中。--leak-resolution 可以让您控制“足够相似”的含义。)它无法告诉您指向泄露块的指针何时、如何或为何丢失;你必须自己解决这个问题。

--track-origins与内存泄漏无关。它用于跟踪未初始化值的来源。


推荐阅读