You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MINGW64环境下如何用GDB调用共享对象库中的函数

在MINGW64的GDB中调试共享库函数的方法

你遇到的错误193,本质是因为.so是共享库而非可执行程序,Windows系统无法直接运行它,所以starti命令会执行失败。下面提供两种可行的调试方案:

方法一:编写测试主程序调用共享库

这是最常规的调试方式,通过一个可执行程序加载共享库,进而调试其中的函数:

  1. 新建主程序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;
}
  1. 编译带调试信息的共享库和主程序:
# 重新编译带调试符号的共享库
gcc -shared -o libadd.so -fPIC -g add.c

# 编译主程序并链接共享库,-Wl,-rpath=.用于指定运行时库路径
gcc -o test_main main.c -L. -ladd -g -Wl,-rpath=.
  1. 用GDB调试生成的可执行文件:
gdb test_main

在GDB中设置断点并运行:

# 在add函数处设置断点
break add
# 启动程序
run

程序运行到add函数时会自动停下,此时可进行单步调试、查看变量等操作。

方法二:用GDB直接加载共享库(无需主程序)

如果不想编写主程序,可利用GDB的dlopen/dlsym手动加载共享库并调用函数:

  1. 直接启动GDB:
gdb
  1. 在GDB中加载共享库并获取函数地址:
# 加载共享库,1对应RTLD_NOW参数
set $handle = dlopen("./libadd.so", 1)
# 获取add函数的内存地址
set $add_func = dlsym($handle, "add")
  1. 设置断点并调用函数:
# 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 17:01:19