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

使用GDB调试Clang插件遇阻:无法调试插件代码求助

调试Qemu运行的Clang插件时断点不生效的解决思路

问题场景

通过Qemu运行Clang并加载插件,执行命令:

qemu-x86_64-static -g 1234 /home/llvm-project/build-16/bin/clang-16 -cc1 ... -load /path/to/plugin.so

远程GDB调试操作:

target remote localhost:1234
file /home/llvm-project/build-16/bin/clang-16
symbol-file /path/to/plugin.so
set follow-fork-mode child

当前问题:

  • Clang库内断点可正常触发
  • 手动加载插件符号后能设置断点,但断点无法生效
  • 执行info shared始终显示“此时未加载任何共享库”,即使在dlopen断点触发后检查依然如此

解决步骤

1. 修正Qemu运行参数

Qemu跨架构调试时需指定宿主系统库路径,确保共享库加载正常,同时确认调试端口无冲突:

qemu-x86_64-static -L /usr/x86_64-linux-gnu -g 1234 /home/llvm-project/build-16/bin/clang-16 -cc1 ... -load /path/to/plugin.so

注:/usr/x86_64-linux-gnu为x86_64架构标准库路径,需根据实际环境调整

2. 延迟加载插件符号

不要提前用symbol-file加载插件符号,改为dlopen触发后手动加载:

  1. 在GDB中设置dlopen断点:
    b dlopen
    
  2. 启动程序,触发断点后执行info shared,确认plugin.so是否出现在加载列表中
  3. 若已加载,用add-symbol-file手动加载符号(基地址从info shared输出中获取):
    add-symbol-file /path/to/plugin.so 0x<插件加载基地址>
    

3. 检查插件编译调试信息

确保插件编译时添加-g选项,生成包含完整调试符号的库文件,可通过以下命令验证:

readelf -S /path/to/plugin.so

若输出中无.debug_*相关段,需重新编译插件。

4. 开启GDB自动加载共享库符号

在GDB中开启自动加载动态库符号的功能,无需手动干预:

set auto-solib-add on

重启调试后,GDB会自动识别并加载所有动态加载的共享库符号。

5. 匹配GDB与目标架构

使用对应架构的GDB版本(如gdb-multiarch),避免因架构不匹配导致无法识别共享库:

gdb-multiarch

再执行远程连接命令进行调试。

内容的提问来源于stack exchange,提问作者Pietro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 16:57:06