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
相关产品推荐
相关产品推荐

