为何GDB在调试符号存在时提示‘未找到调试符号’?
以下是可能导致该问题的几个核心原因:
调试符号分离存储
Chromium Debug版本默认会将调试符号单独存储在.dwp(Debugging With Packaging)文件中,而非嵌入主二进制文件。nm和file仅能检测主二进制内的符号表,但GDB需要找到对应的.dwp文件才能加载完整调试信息。需确保.dwp文件与主二进制在同一目录,或通过set debug-file-directory <符号文件路径>命令告知GDB符号位置。GDB对超大规模符号的加载限制
Chromium的调试符号量近478万,远超普通程序。GDB默认配置可能因内存或安全限制未完整加载符号。可尝试:- 在
~/.gdbinit中添加set max-user-call-depth 100000提升内存限制 - 启动GDB时执行
set auto-load safe-path /,避免安全策略阻止符号加载
- 在
调试格式兼容性问题
Chromium通常用Clang编译,默认生成DWARF5格式的调试符号,而GDB 12.1对DWARF5的支持存在部分兼容性问题。可尝试编译Chromium时指定-gdwarf-4生成DWARF4格式符号,或升级GDB至13及以上版本以获得更好的DWARF5支持。系统安全机制限制
Ubuntu 22.10的AppArmor可能阻止GDB读取调试符号文件。可临时关闭GDB的AppArmor限制(执行sudo aa-disable /usr/bin/gdb),或将Chromium二进制及符号文件所在目录添加到AppArmor允许列表。二进制与符号文件不匹配
即便file显示未剥离符号,仍可能存在编译后二进制被意外修改,或.dwp文件与主二进制的构建ID不匹配的情况。用readelf -n <Chromium二进制路径>查看构建ID,对比.dwp文件的对应ID,确保两者为同一编译产物。
内容的提问来源于stack exchange,提问作者Bram

