我在调试程序时遇到了一个错误,即使在读取asm代码后也无法解决问题
这里是来自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);
}
答案 0 :(得分:2)
p/x $rdx
的 0x61b130
毫无意义。显示value
的函数入口值的堆栈框架事物与商店后面的x
内容相匹配。
我认为您的GDB存在问题,但它显示的错误可能是$rdx
的价值,因为这与其他两个来源不一致。 (根据你的评论,在溢出/重新加载后也与p/x $rdx
不一致。)
尝试使用不同版本的gdb,或尝试使用其他调试器(它也不是GDB的前端)。例如试试lldb
。
将所有3个args溢出/重新加载到堆栈之后,它最终向TAB_enter
调用函数,前3个args相同,第4个arg = 2rd arg(sym
在您的C源中)
或者可能没有第4个arg,它只是使用%rcx
作为临时代码,而不是直接加载到%rsi
,就像使用%rax
一样。
gcc -O0
非常头脑,只有其中一些是故意的(在C语句之间溢出/重新加载所有内容以支持使用调试器修改内存中的变量,甚至在源代码之间跳转线。)
TL:DR:不出所料,你展示的asm正好实现了你为void S_enter(S_table t, S_symbol sym, void *value)
展示的来源,不多也不少。