2017-11-25 522 views
-1

我遇到了一个错误,而调试我的程序,甚至阅读汇编代码 image为什么mov指令没有正确执行?

下面是从GDB的图像后,我解决不了,0x4070a1之前,%RDX是0x61b130,并且这个数字应该移到-0x18(%rbp)。但是,在这个指令之后,我发现-0x18(%rbp)变成了0x61b7d0,这让我感到困惑。

由于这个问题,我的程序无法正常运行,谁能告诉我原因?谢谢!

的C代码:

E_enventry t = E_FunEntry(level,label,NULL,NULL); //t here is 0x61b130 
S_enter(venv,S_Symbol("flush"), t); 
...... 
void S_enter(S_table t, S_symbol sym, void *value) { 
    //while value here is 0x61b7d0 
    TAB_enter(t,sym,value); 
} 
+2

您如何显示您的C代码,以便我们可以看到它有什么问题? – dbush

+0

欢迎来到stackoverflow.com。请花些时间阅读[帮助页面](http://stackoverflow.com/help),尤其是名为[“我可以问些什么话题?”]的章节(http://stackoverflow.com/help/)讨论话题)和[“我应该避免问什么类型的问题?”](http://stackoverflow.com/help/dont-ask)。还请[参观](http://stackoverflow.com/tour)和[阅读如何提出好问题](http://stackoverflow.com/help/how-to-ask)。最后,请学习如何创建[最小,**完整**和可验证示例](http://stackoverflow.com/help/mcve)。 –

+0

@dbush谢谢,我在问题中加入了它,但我认为C代码没有意义,它很奇怪。 –

回答

2

p/x $rdx表示0x61b130是没有意义的。显示功能输入值value的堆栈框架内容与您在内存中看到的内容相匹配,并在存储后与x匹配。

我认为你的GDB是越野车,但它显示错误的东西可能是$rdx的值,因为这与其他两个来源不一致。 (并根据您的意见,也不符合溢出/重新加载后p/x $rdx)。

尝试不同版本的gdb,或尝试使用不同的调试器(这不是GDB的前端)。例如尝试lldb


从堆栈溢出/重装所有3个参数传递给/后,最终使一个函数调用TAB_enter与C源的前3 ARGS相同的,并且所述第四ARG = 2RD ARG(sym

或者,也许没有第四个参数,它只是使用%rcx作为临时代替直接加载到%rsi,就像它使用%rax一样。

gcc -O0极其新空房禁地,并且只有一些是故意(溢出/重载C语句之间的所有内容以支持修改存储器变量与调试器,或源极线之间的连跳。)

TL :DR:不出所料,您所展示的asm正好实现了您为void S_enter(S_table t, S_symbol sym, void *value)展示的来源,不多也不少。

+0

@ T.Chen:您是否安装了任何信号处理程序?或者其他任何会异步修改你的进程的寄存器或内存的东西?我一直在看你的gdb会话,它没有任何意义。你可以在不同的运行中重现这一点吗?什么值重新加载回'%rdx'? –

+0

不,只有一个线程,我没有添加任何信号处理程序。结果每次都是一样的。 –

+0

@ T.Chen:可能你的'gdb'是越野车吗?也许尝试一个不同的调试器,比如'lldb'。请注意,即使在将堆栈帧信息存储到堆栈之前,堆栈帧信息也具有“value = 0x61b7d0”,因此它具有正确的“%rdx”值。 –