如何在GDB中查看或列出被__stdcall修饰的C函数
定位GDB中__stdcall修饰的foo函数
问题原因
__stdcall调用约定下,MinGW GCC会对函数名进行命名修饰:C语言函数会被处理为_函数名@参数总字节数的格式。你在info function中看到的foo@4是简化显示,实际符号表中的完整名称是_foo@4,直接用foo操作会找不到对应符号。
解决方法
1. 使用完整修饰符号名直接操作
在GDB中直接使用带下划线的完整符号名执行命令:
- 打印函数地址:
print &_foo@4 - 反汇编函数代码:
disassemble _foo@4 - 查看函数对应源码:
list _foo@4 - 设置断点:
break _foo@4
2. 通过调用处跳转定位
如果记不住完整符号名,可以通过main函数中的调用位置进入目标函数:
- 在
main函数的foo(42)行设置断点并启动程序:break main run - 执行单步进入命令跳转到
foo函数:stepi # 或简写si - 此时已进入
foo函数上下文,直接用list查看源码,或用info frame查看当前函数的符号信息。
3. 确认实际符号名(可选)
如果不确定修饰后的符号名,可在GDB中执行以下命令查看:
info symbols foo
该命令会输出符号表中与foo相关的完整符号名称,示例输出:
_foo@4 in section .text of stdcall
内容的提问来源于stack exchange,提问作者Johannes Thoma
相关产品推荐
相关产品推荐

