如何让GDB正确打印64位变量?NASM编译场景调试求助
解决GDB调试64位NASM代码时var_h符号显示异常的问题
我之前调试64位NASM汇编代码时也碰到过几乎一模一样的问题,给你几个针对性的解决思路:
明确符号的类型信息,让GDB正确识别64位变量
NASM默认生成的DWARF调试信息里,有时候不会明确告诉GDB变量的长度类型。你可以在代码里给var_h加上类型和大小声明:var_h: dq -1 .type var_h, @object ; 标记为对象类型 .size var_h, 8 ; 指定大小为8字节(64位)重新编译后,GDB就能正确识别
var_h是64位变量,直接执行print var_h就会输出完整的8字节值,不会再截断成32位。强制指定类型查看,无需修改代码
如果不想改动汇编代码,你可以在GDB里用强制类型转换来查看完整的64位值:print *(long long *)&var_h # 或者用标准的64位整数类型 print (int64_t)var_h这样GDB会忽略默认的类型猜测,按你指定的64位类型解析变量值。
修复
x命令的用法
你之前用的x \1gx $var_h有两个问题:- 语法错误:
x命令的格式符应该用正斜杠而非反斜杠,正确格式是x/<数量>/<格式>/<单位> - 逻辑错误:
$var_h是变量的值,而x命令需要的是内存地址。你应该用&var_h获取变量的内存地址,再用x命令读取该地址的8字节内容:x/1gx &var_h # 或者省略数量1,直接用x/gx &var_h(默认读取1个单位)
这样就能正确打印出
var_h的完整64位十六进制值了。- 语法错误:
内容的提问来源于stack exchange,提问作者Anding
相关产品推荐
相关产品推荐

