如何编译代码并通过Valgrind获取文件及行号信息
让Valgrind输出显示具体文件和行号的配置方法
一、编译阶段添加调试符号
Valgrind需要依赖编译生成的调试符号才能关联到源代码的文件和行号,因此必须在编译时开启调试信息生成:
修改你的构建命令,添加-g编译选项:
make BUILD=TARGET_ CFLAGS="-g"
或者直接在Makefile的编译规则中加入-g参数,确保gcc/clang这类编译器生成包含行号、文件名等调试信息的可执行文件。如果编译时未添加该选项,Valgrind只能识别二进制文件路径(如示例中的/bin/bash),无法定位到具体源代码位置。
二、Valgrind运行命令配置
保持核心检测参数不变,无需额外调整即可解析调试符号:
valgrind --tool=memcheck --leak-check=yes --show-reachable=yes ./<你的可执行文件名>
若需要更精准的内存错误根源定位,可额外添加--track-origins=yes参数。
三、调整后的输出示例
添加调试符号后,Valgrind的输出会显示对应的源代码文件和行号,示例如下:
==12345== 80 bytes in 1 blocks are definitely lost in loss record 1 of 4 ==12345== at 0x4004405: malloc (vg_replace_malloc.c:149) ==12345== by 0x8095A91: xmalloc (memory_utils.c:15) ==12345== by 0x806AC84: execute_command_internal (main.c:207) ==12345== by 0x806C72F: execute_command (main.c:312) ==12345== by 0x805DE1A: reader_loop (main.c:45) ==12345== by 0x805CEE1: main (main.c:18)
内容的提问来源于stack exchange,提问作者Sharon Deborah
相关产品推荐
相关产品推荐

