Valgrind输出显示???而非函数名,如何获取内存泄漏详情?
解决Valgrind调用栈无符号信息的问题
你的问题核心是目标程序/usr/bin/dash没有保留调试符号,导致Valgrind无法把内存地址映射为函数名、代码文件和行号,只能显示地址和???。以下是具体解决方法:
一、优先安装带调试符号的官方包
大部分Linux发行版都提供了带调试符号的软件包,直接安装是最快的方式:
- Debian/Ubuntu系发行版:
安装dash的调试包:sudo apt install dash-dbg
同时建议安装系统库的调试包(很多内存泄漏可能来自libc等系统库):sudo apt install libc6-dbg - 安装完成后,重新用你原来的Valgrind命令运行检测,就能看到完整的调用栈信息了。
二、手动编译带调试符号的dash
如果官方没有提供调试包,或者你需要自定义编译版本:
- 从GNU或发行版的源码仓库下载dash的源代码;
- 编译时添加
-g参数开启调试符号:./configure make CFLAGS="-g" - 直接运行编译生成的本地dash二进制文件进行Valgrind检测,或者替换系统的
/usr/bin/dash(替换前建议备份原文件)。
三、Valgrind参数补充说明
你当前使用的--leak-check=full、--show-leak-kinds=all已经是检测内存泄漏的标准有效参数,不需要调整。额外可以添加:
--track-origins=yes:追踪未初始化内存的来源,能帮你定位更隐蔽的内存问题,但前提是目标程序有调试符号;- 注意不要使用
--strip-debug这类会丢弃调试信息的Valgrind参数,默认情况下Valgrind会自动读取程序的符号表。
内容的提问来源于stack exchange,提问作者pio1dcaqr
相关产品推荐
相关产品推荐

