如何在GDB中查看inline函数地址及对应回溯显示原理问询
GDB中显示的il()函数地址的本质
你在GDB栈回溯、调试过程中看到的il()对应的地址分两种场景:
- 若il()被inline展开到il2()或其他调用方的代码段中,显示的地址是该inline函数的代码在调用方
.text段展开后,对应运行指令的实际内存地址,属于调用方函数的地址范围,不是il()的独立全局入口地址 - 若编译器为il()生成了独立的out-of-line实例(比如代码中存在取il()地址的逻辑、或是低优化等级下编译器默认保留独立实例),此时看到的地址就是这个独立实例的入口地址
GDB识别并展示inline函数的逻辑
该能力完全依赖编译时生成的DWARF调试信息:
- 只要你编译时添加了
-g参数,编译器会把inline函数的名称、定义位置(il.h第123行)、每一处展开位置对应的指令地址范围、参数和局部变量的映射关系都写入DWARF调试条目 - GDB加载程序时会解析调试信息,建立「指令地址范围→所属函数」的映射表,哪怕是inline展开的代码段对应的地址,也能匹配到il()的对应条目,因此栈回溯、单步调试时都可以正常显示函数名,也支持打断点、查看变量等操作
- 你直接执行
print &il拿不到地址的原因也很简单:如果il()没有生成全局可见的独立实例,它就不存在唯一的全局入口地址,自然无法直接获取全局符号地址。如果需要查看所有il()展开位置的地址范围,可以执行info line il.h:123命令。
内容的提问来源于stack exchange,提问作者ניר שץ
相关产品推荐
相关产品推荐

