如何在GDB中查找指定代码或函数所属的共享对象名称
GDB 中根据源码行号定位所属共享对象的操作方法
最简便的操作步骤
适用于已知源码文件名和对应行号的场景:
- 执行GDB命令
info line 源码文件名:行号,例如你已知行号信息为transport.c:187,则输入:info line transport.c:187 - 命令返回结果会直接显示该行代码对应的指令起始地址,以及所属的共享对象完整路径。如果输出中没有直接显示共享对象信息,取返回的指令地址,执行:
info symbol 指令地址
返回结果中of后面的内容就是对应的共享对象路径。
栈回溯场景的更快捷操作
如果你是在backtrace输出中看到的未知源码行,无需手动输入文件名和行号,直接按如下操作:
- 先切换到对应栈帧,例如对应帧编号为3,执行
f 3 - 再执行
info frame,输出结果中的library字段即为该栈帧代码所属的共享对象路径
示例操作
假设backtrace输出如下:
#3 0x00007ffff7f68129 in init (x=0x5555555692a0) at transport.c:187
执行命令info line transport.c:187,返回示例:
Line 187 of "transport.c" starts at address 0x7ffff7f68120 <init+16> and ends at 0x7ffff7f68135 <init+37>.
Located in /usr/local/lib/libusb-1.0.so
即可直接得到对应共享库为/usr/local/lib/libusb-1.0.so。
注意事项
查询前需确保对应共享对象已经被动态加载到进程地址空间,如果查询返回无结果,可以先对目标行号打临时断点,触发断点后再执行上述查询操作即可。
内容的提问来源于stack exchange,提问作者Grigory Rechistov
相关产品推荐
相关产品推荐

