Cyc*_*hih 7 c valgrind memory-leaks
有没有办法让 valgrind 报告“绝对丢失”发生在“哪里”?
我想要的不是“它分配在哪里”,而是“那块可怜的内存被泄漏到哪里”。
例如,这段代码在f()返回时存在“肯定丢失”的泄漏:
#include <stdlib.h>
void f () {
void *ptr = malloc(42);
}
int main () {
f();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但 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)
Run Code Online (Sandbox Code Playgroud)
我正在使用--leak-check=full和--track-origins=yes。
我想要的不是“它分配在哪里”,而是“那块可怜的内存被泄漏到哪里”。
不,Valgrind 只报告内存分配的位置,但不报告内存泄漏的时间和原因。Memcheck 手册中记录了此行为:
如果指定了 --leak-check=full,Memcheck 将提供每个肯定丢失或可能丢失的块的详细信息,包括分配的位置。(实际上,它将具有相同泄漏类型和足够相似的堆栈跟踪的所有块的结果合并到单个“丢失记录”中。--leak-resolution 可以让您控制“足够相似”的含义。)它不能告诉您指向泄漏块的指针何时、如何或为何丢失;你必须自己解决这个问题。
也--track-origins与内存泄漏无关。它用于跟踪未初始化值的来源。