You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GDB调试中寄存器值与栈值不一致问题求助

寄存器值与栈值不一致的调试问题

调试无源码可执行文件时,碰到$rdi寄存器的值和栈上-0x68(%rbp)位置存储的值不匹配的情况。程序本该输出1 2 3 4 5 6,实际却显示乱码P\231UUUU。已确认没有内存覆盖,断点也设置在正确地址0x0000555555555909。

断点处汇编指令

0x00005555555558fd <+0>: push %rbp 
0x00005555555558fe <+1>: mov %rsp,%rbp 
0x0000555555555901 <+4>: sub $0x70,%rsp 
0x0000555555555905 <+8>: mov %rdi,-0x68(%rbp) 
=> 0x0000555555555909 <+12>: lea 0x3970(%rip),%rax 

GDB调试输出

  • 执行(gdb) x/s $rdi 0x555555559950的结果:
input_strings+400: "1 2 3 4 5 6"
  • 执行(gdb) x/s $rbp -0x68的结果:
0x7fffffffe1a8: "P\231UUUU"

问题排查方向

  • GDB命令语法错误:你用的x/s $rbp -0x68写法有问题,GDB会把它解析成「先打印$rbp指向的字符串,再做数值减法-0x68」,而不是访问$rbp-0x68这个地址。正确的命令应该是x/s $rbp-0x68(不要加空格),或者直接用计算后的地址x/s 0x7fffffffe1a8。当前显示的乱码其实是$rbp指向的内容,而非-0x68(%rbp)的存储值。
  • 手动验证栈地址:先执行p $rbp获取当前基地址,手动计算$rbp-0x68的具体地址,再用x/s直接访问该地址,确认是否和$rdi指向的字符串一致。
  • 确认指令执行状态:虽然断点在mov %rdi,-0x68(%rbp)之后,但可以再检查下该指令是否确实执行完毕——不过x86架构下这类简单mov指令不会出现未执行的情况,优先级最高的排查点还是命令语法问题。

内容的提问来源于stack exchange,提问作者sollex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 06:28:38