Step in Glibc Source Code
在 Ubuntu 22.04 下,想要在 gdb 调试时 step in 到 printf
函数内部,需要满足两个条件:
- glibc(libc)必须带有调试符号,否则只能看到汇编或提示“no source available”。
- gdb 能找到 glibc 的源码路径,这样才能显示 C 语言源码而不是汇编。
步骤一:安装调试符号和源码
sudo apt update
sudo apt install libc6-dbg glibc-source
步骤二:解压 glibc 源码
sudo tar -xf /usr/src/glibc/glibc-*.tar.xz -C /usr/src/glibc/
解压后源码路径通常为 /usr/src/glibc/glibc-<version>/
步骤三:配置 gdb 的源码路径映射
glibc 在编译时源码路径通常是 /build/glibc-*/
,而你本地源码在 /usr/src/glibc/glibc-<version>/
。
你需要告诉 gdb:把源码路径替换为本地实际路径。
在 gdb 里输入:
set substitute-path /build/glibc-*/ /usr/src/glibc/glibc-<version>/
请将 <version>
替换为实际解压出来的目录名,比如 2.35
.
注:上面的办法不管用。用下面的:
directory /usr/src/glibc/glibc-2.35/
有,可以通过以下方法让 gdb 每次自动加载源码路径,无需每次手动设置:
在你的主目录下创建或编辑 ~/.gdbinit
文件,加入如下内容:
directory /usr/src/glibc/glibc-2.35/
这样每次启动 gdb 时都会自动添加该源码路径。
如果只想对某个项目生效,可以在项目根目录下创建 .gdbinit
文件,内容同上。gdb 启动时会自动读取当前目录下的 .gdbinit
。
注意:
~/.gdbinit
影响所有 gdb 会话。- 项目目录下的
.gdbinit
只影响该目录下的调试。
步骤四:gdb 调试
- 启动 gdb 并运行你的程序。
- 当执行到
printf
时,使用step
或stepi
进入。 - 如果一切正常,gdb 会显示
printf
的 glibc 源码。
说明
set substitute-path <编译时路径> <本地路径>
这条命令告诉 gdb:当调试信息里出现<编译时路径>
时,去<本地路径>
查找源码。- 如果还是进不去源码,可能是优化级别太高(如
-O2
),可尝试用-O0 -g
重新编译你的程序。
总结:
只要安装了调试符号和源码,并正确配置 substitute-path,就可以 step in 到 printf
这样的 glibc 函数源码。