You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ARM平台下Valgrind检测内存泄漏无法显示源码行的问题排查

如何让ARM平台的Valgrind显示内存泄漏对应的源码行?

可以获取内存分配对应的源码行,你的操作可能存在调试信息生成不完整、源码路径未指定或调用栈显示深度不足等问题,以下是具体解决方法:

核心问题分析

你的Valgrind输出仅显示malloc在Valgrind预加载库中的地址,未展开到用户代码行,原因通常是:

  • 编译时未生成完整的调试符号
  • 目标机器上Valgrind无法找到源码文件
  • 调用栈显示深度不够,未包含用户代码层

解决步骤

1. 重新编译,生成完整调试信息

将编译命令中的-g替换为-g3(生成更详细的调试信息),确保保留-O0(关闭优化,避免代码行号错乱):

arm-buildroot-linux-gnueabi-gcc -g3 -O0 -o test test.c

可以用以下命令验证调试符号是否生成:

arm-buildroot-linux-gnueabi-readelf -S test | grep -E "\.debug_"

如果输出包含.debug_info、.debug_line等段,说明调试符号已生成。

2. 确保Valgrind能访问到源码文件

将test.c复制到ARM机器上与test程序相同的目录,或者在运行Valgrind时通过--source-path参数指定源码所在路径:

valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes --verbose --source-path=/path/to/your/source ./test

3. 增加调用栈显示深度

Valgrind默认的调用栈显示深度可能不足以展开到用户代码,添加--num-callers参数增加深度:

valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes --verbose --num-callers=20 ./test

4. 确认程序未被剥离符号

如果编译后执行过strip test,会移除调试符号,导致Valgrind无法解析源码行,确保不要对程序执行剥离操作。

预期输出

调整后,Valgrind的泄漏报告应显示类似以下内容,包含对应的源码行:

==1221== 1,048,576 bytes in 1 blocks are definitely lost in loss record 1 of 1
==1221==    at 0x4864DE4: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-arm-linux.so)
==1221==    by 0x10878: main (test.c:4)

内容的提问来源于stack exchange,提问作者bui3

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 22:53:08