使用GDB调试时无法加载外部文件中的调试符号
GDB无法加载外部调试符号的问题排查与解决
问题重现
编译带调试信息的可执行文件与共享库后,执行以下符号分离操作:
# 提取可执行文件调试符号 objcopy --only-keep-debug Executable symbols/Executable.debug # 添加debuglink指向符号文件 objcopy --add-gnu-debuglink=symbols/Executable.debug Executable # 剥离可执行文件符号 strip Executable
通过readelf确认.gnu_debuglink段存在后,启动GDB调试:
(gdb) set debug-file-directory symbols (gdb) file Executable Reading symbols from Executable... (No debugging symbols found in Executable)
GDB无法识别外部调试符号。
核心错误原因
操作顺序颠倒:先添加debuglink再执行strip,会导致剥离后的可执行文件校验和与debuglink中记录的校验和不匹配。GDB会通过校验和验证符号文件与目标文件的对应关系,校验失败则不会加载符号。
修复步骤
1. 修正可执行文件的符号处理流程
# 备份原始带调试信息的可执行文件 cp Executable Executable.orig # 从原始文件提取调试符号 objcopy --only-keep-debug Executable.orig symbols/Executable.debug # 剥离可执行文件的调试符号(保留必要段) objcopy --strip-debug Executable.orig Executable # 为剥离后的文件添加debuglink(这一步必须放在最后) objcopy --add-gnu-debuglink=symbols/Executable.debug Executable
2. 对共享库执行相同操作
cp libSharedLib.so libSharedLib.so.orig objcopy --only-keep-debug libSharedLib.so.orig symbols/libSharedLib.so.debug objcopy --strip-debug libSharedLib.so.orig libSharedLib.so objcopy --add-gnu-debuglink=symbols/libSharedLib.so.debug libSharedLib.so
3. 验证校验和匹配
用以下命令查看debuglink中的校验和:
readelf -n Executable | grep -A2 "GNU debuglink"
再计算符号文件的CRC32校验和,确认两者一致:
eu-strip --debug-crc symbols/Executable.debug
4. 重新启动GDB调试
(gdb) set debug-file-directory ./symbols (gdb) file Executable Reading symbols from Executable... Reading symbols from ./symbols/Executable.debug...
额外注意事项
debug-file-directory建议使用绝对路径,避免GDB工作目录变化导致路径失效- 确保
symbols目录下的.debug文件权限正确,GDB有权限读取
内容的提问来源于stack exchange,提问作者Klaus Holst Jacobsen
相关产品推荐
相关产品推荐

