GDB调试perf:__fprintf_chk断点归属及info args无输出问题咨询
调试perf的__fprintf_chk相关问题解答
问题1:断点位于perf自身还是系统共享库?
__fprintf_chk是glibc(GNU C库)提供的安全格式化输出函数,绝大多数情况下你的断点命中的是系统glibc中的实现,而非perf二进制自身的函数。
你可以在GDB里直接验证:
- 触发断点后,执行
where查看调用栈,栈帧会显示函数所在的模块(比如/lib/x86_64-linux-gnu/libc.so.6) - 或者执行
info break查看断点地址,再用info sharedlibrary对比地址范围,确认所属的共享对象 - 也可以执行
print __fprintf_chk,输出的地址如果属于libc的加载地址区间,就说明是系统库的实现
perf作为用户态工具,只会调用标准库提供的__fprintf_chk,不会自行实现这个函数。
问题2:info args无输出的原因及编译带调试信息的perf
原因
info args无输出确实是因为你当前使用的perf二进制没有包含调试符号信息。调试符号存储了函数参数、变量名等调试所需的元数据,缺少这些信息时,GDB无法解析并显示参数。
编译带调试信息的perf方法
方法1:从Linux内核源码编译
perf是Linux内核源码树的一部分,位于tools/perf目录:
- 获取与当前系统内核版本匹配的Linux内核源码(避免兼容性问题)
- 进入
tools/perf目录 - 执行编译命令生成带调试信息的二进制:
make clean make CFLAGS="-g -O0"-g用于生成调试符号,-O0关闭编译优化(避免参数/变量被优化掉,方便调试) - 编译完成后,当前目录下的
perf二进制就带有完整调试信息
方法2:安装发行版提供的调试包
如果你使用Debian/Ubuntu类发行版,可以直接安装对应内核版本的perf调试包:
sudo apt install linux-tools-$(uname -r)-dbg
安装后,系统自带的perf会关联调试符号,GDB即可正常解析参数信息。
内容的提问来源于stack exchange,提问作者Milan
相关产品推荐
相关产品推荐

