MINGW64环境下如何用GDB调用共享对象库中的函数
在MINGW64的GDB中调试共享库函数的方法
你遇到的错误193,本质是因为.so是共享库而非可执行程序,Windows系统无法直接运行它,所以starti命令会执行失败。下面提供两种可行的调试方案:
方法一:编写测试主程序调用共享库
这是最常规的调试方式,通过一个可执行程序加载共享库,进而调试其中的函数:
- 新建主程序
main.c,调用共享库中的add函数:
#include <stdio.h> // 声明共享库中的add函数 long add(long x, long y); int main() { long res = add(2, 4); printf("Result: %ld\n", res); return 0; }
- 编译带调试信息的共享库和主程序:
# 重新编译带调试符号的共享库 gcc -shared -o libadd.so -fPIC -g add.c # 编译主程序并链接共享库,-Wl,-rpath=.用于指定运行时库路径 gcc -o test_main main.c -L. -ladd -g -Wl,-rpath=.
- 用GDB调试生成的可执行文件:
gdb test_main
在GDB中设置断点并运行:
# 在add函数处设置断点 break add # 启动程序 run
程序运行到add函数时会自动停下,此时可进行单步调试、查看变量等操作。
方法二:用GDB直接加载共享库(无需主程序)
如果不想编写主程序,可利用GDB的dlopen/dlsym手动加载共享库并调用函数:
- 直接启动GDB:
gdb
- 在GDB中加载共享库并获取函数地址:
# 加载共享库,1对应RTLD_NOW参数 set $handle = dlopen("./libadd.so", 1) # 获取add函数的内存地址 set $add_func = dlsym($handle, "add")
- 设置断点并调用函数:
# 在add函数处设置断点 break add # 强制类型转换后调用函数,传入参数3和5 set $res = ((long(*)(long, long))$add_func)(3, 5) # 查看函数返回结果 print $res
执行调用命令后,GDB会触发断点进入add函数,即可开始调试。
注意事项
- 编译共享库时必须加
-g参数,否则GDB无法关联源码,只能调试汇编指令。 - MINGW64环境下,共享库也可使用
.dll后缀,编译时指定-o libadd.dll即可,调试方法与.so完全一致。
内容的提问来源于stack exchange,提问作者sdbbs
相关产品推荐
相关产品推荐

