gdb no symbol 问题

gdb no symbol 问题

最近在rhel6上发现奇怪的问题,g++ -g 编译的程序,在gdb中打印不出任何变量的值。直到搜到了[这个]

  • 原因
    原版装的gcc低于4.8,因为项目中需要c++11的功能,将gcc升级到了4.8.2,而没有升级gdb,而gcc4.8生成的默认调试信息格式改为了DWARF4,老版的gdb不能解析。

  • 解决方法
    gcc -gdwarf-3

<think>好的,我现在需要解决用户在GDB调试时遇到的“info args”命令显示“No symbol table info available”的问题。首先,我得了解这个错误的原因。用户可能是在调试程序时没有正确生成符号表信息,导致GDB无法显示函数的参数信息。 根据用户提供的引用内容,特别是引用[1],里面提到了在GDB中查看内存映射的方法,涉及使用info program和shell命令。这可能和符号表的加载有关。另外,引用[3]提到.globl指示符的作用,确保符号被链接器识别,这可能关系到编译时是否正确生成符号表。 首先,用户可能没有在编译时加上调试信息。通常,使用GCC编译时需要加上-g选项,例如gcc -g -o program program.c。如果没有这个选项,生成的二进制文件将不包含调试符号,GDB自然无法获取参数信息。需要建议用户检查编译命令,确保包含调试信息。 其次,用户可能在优化编译时使用了-O2或更高级别的优化选项,这可能导致某些符号信息被优化掉。此时,建议用户降低优化级别,比如使用-O0,并重新编译程序。 另外,如果程序是动态链接库或第三方提供的,可能未附带调试符号。用户需要确认是否在编译时链接了带有调试信息的库,或者是否能够获取对应的调试版本。 还有可能用户在加载可执行文件时没有正确指定符号表。在GDB中,使用file命令重新加载带有调试信息的可执行文件,或者使用symbol-file命令手动加载符号表。例如,在GDB中执行file ./program。 此外,检查GDB是否正确识别了调试信息。用户可以在GDB中使用命令readelf -S program | grep debug来查看是否存在.debug_info等段,确认符号表是否存在。 最后,确保程序在编译后未被strip命令处理过,因为strip会删除符号表。如果被strip过,需要重新编译并保留调试信息。 总结解决步骤:检查编译选项是否包含-g,降低优化级别,确认符号表存在,重新加载符号文件,避免使用strip。如果这些步骤都正确,问题应该可以解决。</think>### GDB中`info args`显示无符号表信息的解决方案 当使用GDB的`info args`命令时出现`No symbol table info available`,通常是由于调试信息缺失或未正确加载导致的。以下是分步解决方法: 1. **检查编译选项是否包含调试信息** - 确保编译时添加`-g`选项以生成调试符号,例如: ```bash gcc -g -o program program.c ``` - 若使用Makefile或构建工具,需确认编译参数中是否包含`-g`[^3]。 2. **避免优化选项影响符号信息** - 高优化级别(如`-O2`)可能移除部分调试信息,建议调试时使用`-O0`: ```bash gcc -g -O0 -o program program.c ``` 3. **验证二进制文件是否包含符号表** - 使用`readelf`命令检查调试段是否存在: ```bash readelf -S program | grep debug ``` - 若输出包含`.debug_info`等段,则符号表已生成;否则需重新编译。 4. **重新加载符号表** - 在GDB中执行`file`命令重新加载可执行文件: ```gdb (gdb) file ./program ``` - 若调试动态库,使用`add-symbol-file`手动加载符号表。 5. **检查是否误用`strip`命令** - `strip`会删除符号表,若已执行过此操作,需重新编译并保留调试信息。 6. **验证GDB环境配置** - 确认GDB版本支持当前编译器生成的调试格式(如DWARF),可通过`gdb --version`查看兼容性。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值