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

如何在DPDK构建报错时通过回溯查看具体代码行与函数

解决GDB回溯无法显示代码行号及文件路径的问题

一、确保编译时包含完整调试信息

  • 编译自有业务代码时,必须添加-g编译选项以保留调试符号,同时建议使用-O0关闭优化(过高优化等级会混淆行号、移除局部符号)。示例编译命令:
    gcc -g -O0 -o your_application your_source_code.c ...
    
  • 若使用DPDK源码编译,需开启调试模式:
    • 执行配置时设置CONFIG_RTE_BUILD_DEBUG=y
    • 或直接在编译阶段附加调试参数:
      make EXTRA_CFLAGS="-g" EXTRA_LDFLAGS="-g"
      
    注意:避免使用预编译的stripped版本DPDK库(这类库会主动移除调试符号)。

二、检查GDB符号加载状态

  • 启动GDB后,执行info sharedlibrary查看所有加载的库及符号加载情况,确认自有代码和DPDK库的符号已正常加载。
  • 若符号未加载,手动指定符号搜索路径:
    set solib-search-path /path/to/your/debug/libs:/path/to/dpdk/debug/libs
    
  • 确保auto-solib-add功能开启(默认开启),执行:
    set auto-solib-add on
    

三、修复符号被剥离的库文件

如果已有的DPDK库是stripped状态(调试符号被移除),可以通过以下方式恢复符号:

# 从未stripped的库中提取调试符号
objcopy --only-keep-debug libdpdk.so libdpdk.so.debug
# 将调试符号链接到原库
objcopy --add-gnu-debuglink=libdpdk.so.debug libdpdk.so

也可以直接在GDB中指定符号文件:

symbol-file /path/to/libdpdk.so.debug

四、验证回溯效果

完成上述设置后,重新运行程序触发报错,执行bt(或bt full查看更详细上下文),即可看到包含文件路径和行号的回溯信息,示例如下:

#0  pci_uio_map_resource (dev=0x555555a02200, res_idx=0) at /path/to/dpdk/lib/librte_eal/linux/eal/pci_uio.c:123
#1  0x000055555572c7ba in pci_plug.cold.0 () at /path/to/dpdk/lib/librte_eal/linux/eal/pci_plug.c:456
#2  local_dev_probe (bus=0x5555559f8000, dev=0x555555a02200) at /path/to/your/code/local_dev.c:789
...

内容的提问来源于stack exchange,提问作者Abhir Raj Shrivastava

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 10:53:22