GDB无法打印汇编代码中value2的原因排查求助
问题原因与修复方案
1. 调试符号缺失是核心问题
你没有在汇编阶段生成调试符号,导致GDB只能依赖ELF符号表的基础信息,无法正确关联.short类型的value2到.data段,进而出现地址显示错误、无法打印值的情况。
修复步骤
汇编时添加-g选项生成调试信息:
as -g your_asm.s -o asm.o
再用ld链接生成可执行文件:
ld asm.o -o asm_exec
重新启动GDB调试,此时print &value2会显示正确的.data段内地址,print value2也能正常输出值。
2. 段对齐机制的误解
x86 ELF的.data段默认按4字节(32位环境)/8字节(64位环境)对齐,汇编器会自动插入填充字节以满足对齐要求:
value1(.int,4字节)占据.data起始的4字节空间value2(.short,2字节)紧跟在value1之后,地址为value1 + 4,完全属于.data段value3(.byte,1字节)之后会被填充1字节,凑够8字节对齐
你可以在GDB中执行info sections查看.data段的地址范围,对比print &value2的结果,就能确认它在.data段内。
3. 验证符号存在性
用readelf检查可执行文件的符号表,确认value2确实存在:
readelf -s asm_exec | grep value2
如果能看到对应的符号条目,说明链接器没有丢弃该变量,只是GDB缺少调试信息无法正确解析。
内容的提问来源于stack exchange,提问作者Victoria Hwang
相关产品推荐
相关产品推荐

