如何在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"
- 执行配置时设置
二、检查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
相关产品推荐
相关产品推荐

