c - 如何让 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
。
解决方案
我想要的不是“分配的地方”,而是“那块可怜的内存泄露的地方”。
不,Valgrind 只报告内存分配的位置,而不是何时泄露或泄露的原因。这种行为记录在Memcheck 手册中:
如果指定了 --leak-check=full,Memcheck 将提供每个确定丢失或可能丢失的块的详细信息,包括分配位置。(实际上,它将具有相同泄漏类型和足够相似的堆栈跟踪的所有块的结果合并到单个“丢失记录”中。--leak-resolution 可以让您控制“足够相似”的含义。)它无法告诉您指向泄露块的指针何时、如何或为何丢失;你必须自己解决这个问题。
也--track-origins
与内存泄漏无关。它用于跟踪未初始化值的来源。
推荐阅读
- java - 无法初始化代理 [###] - 没有会话
- elasticsearch - 可视化文档是否每周发生变化的最佳方式
- php - 电子邮件正文不接受回车
- php - PHP所有命令都非常慢
- c# - Unity3D-是否可以使用 linerenderer 基于两个顶点绘制圆/椭圆?
- jupyter-notebook - 从 Jupyter Lab 启动 IPython Kenel 时仅运行启动文件
- go - Webview 在某些 Windows 系统上不呈现页面
- javascript - 加入站点的电报组时如何处理从Web应用程序登录的用户ID?
- reactjs - 如何隐藏/取消隐藏密码 Material ui
- node.js - 有没有办法创建具有设置类型参数和返回值的方法?