如何调试跳转到错误地址?

时间:2016-02-10 00:10:55

标签: debugging assembly gdb

我目前正在使用GDB调试一些汇编代码,并且遇到了以下问题。不知何故,我最终在一个虚假的指令地址,可能是因为我调用了一个虚假的函数指针,或者我在父堆栈框架上修改了返回地址。

GDB非常棒,当它检测到这种情况发生时,正好停止。但是,它没有告诉我的是发送我到这个虚假地址的指令地址。所以现在我被卡住了。我知道我现在处于一个虚假的地址,但我无法知道我是怎么来到这里的。我认为我需要的是$ rip所采用的最后n个值的列表。但我无法在GDB的文档中找到任何方法,我很确定它是不可能的。

所以如果其他人对他们可以共享的低级调试有任何好的建议,我将不胜感激。谢谢!   -Patrick

2 个答案:

答案 0 :(得分:0)

我认为GDB的跟踪可能会有所帮助

https://sourceware.org/gdb/onlinedocs/gdb/Tracepoints.html

答案 1 :(得分:0)

当代码崩溃时,陷阱被引发并且指令指针跳转到陷阱表,跳转取决于引发的陷阱。​​

您想要确定哪个指令导致此陷阱,因此您可以在跳转到陷阱表之前执行命令backtrace (bt)以显示最新的exectuted函数。识别该功能时,请逐步执行以识别导致错误的指令。

如果在远程模式下使用带有gdb的目标,则需要为gdb提供一个强符号表,以便能够识别整个代码符号。