如何通过GDB进入,过渡和退出?


42

help在GDB时打过字,但没有发现任何有关跨入,跨入和跨出的信息。我在_startbreak _start)中的Assembly程序中放置了一个断点。之后,我输入next并完成调试。我想那是因为它完成了_start,没有按照我的意愿介入

有人可以帮忙吗?


阅读完整的GDB文档。我记得,当我第一次学习它时,他们对此很有帮助。不幸的是,几十年来我不需要在该级别调试任何程序,因此实际的命令似乎已经在我的脑海中换了出来。因此,我无法真正写出答案。但是,如果您确实从手册中弄清楚了,那么您可以回答自己的问题以获取奖金。
MAP

@MAP我会再试一次。我尝试使用更好的调试器(KDbg),但在Ubuntu中无法成功使用它
皮纳·瓦纳

Answers:


38

help running 提供了一些提示:

stepnext指示(以及nextistepi)。

(gdb) help next
Step program, proceeding through subroutine calls.
Usage: next [N]
Unlike "step", if the current source line calls a subroutine,
this command does not enter the subroutine, but instead steps over
the call, in effect treating it as a single source line.

因此,我们可以看到,step步骤进入子程序,但next会加强子程序。

stepstepi(以及nextnexti)由“线”或“指令”的增量进行区分。

step -- Step program until it reaches a different source line
stepi -- Step one instruction exactly

相关的是finish

(gdb) help finish
Execute until selected stack frame returns.
Usage: finish
Upon return, the value returned is printed and put in the value history.

更多有用的信息位于https://sourceware.org/gdb/onlinedocs/gdb/Continuing-and-Stepping.html


直到到达不同的源代码行是什么意思?
皮亚·瓦纳

1
for(i=0;i<10;i++) { printf("%d\n",i); }是一个源代码行,但有多个指令。
史蒂芬·哈里斯

3
有没有办法走出去?我在运行帮助中找不到它。
nukeguy

1
你说“走出去”是什么意思?该finish命令将完成当前的堆栈帧,通常将完成当前的子例程并返回到调用方。
史蒂芬·哈里斯

@PichiWuana gdb将逐步执行所有必要的汇编指令,直到到达表示下一行源代码的第一条指令为止
U007D

0

我来这里是因为我有同样的问题。我最终想到,出于我的目的,只要我可以在循环中使用“逐步退出”之类的东西,就可以在循环后设置另一个断点,然后让程序continue完成循环并随后运行到断点。抱歉,如果这对于大多数人来说都是显而易见的,但对于寻求该问题答案的人可能会有所帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.