像GDB这样的调试器如何一次运行一个指令的程序?

凯文·蒙巴特(Kevin Montambault)

我可以理解专门为调试而编译的程序如何在代码中插入断点和陷阱,但是像GDB这样的程序如何在预编译的程序中做到这一点?他们在每条指令之后如何才能停止程序的执行?

我正在Windows机器上工作,但是我也愿意学习它在Linux上如何工作。

任何方向或资源将不胜感激,因为Googling返回有关如何使用GDB的说明,而不是有关其在低级如何工作的说明。

受雇于俄罗斯

他们在每条指令之后如何才能停止程序的执行?

大多数处理器(包括所有处理器)都i*86支持单步执行。

当要求GDB在这样的处理器上执行单条机器指令时,这是一个非常简单的过程:

  1. 安排处理器以单步模式执行(这是特定于处理器的,请在此处阅读有关i*86实现的信息)。
  2. 恢复下等过程
  3. 等待中断(如果第1步有效,它将在1条指令完成后立即出现)。

在没有单步支持的处理器上,GDB的工作要复杂一些:

  1. 分解当前指令(要知道下一条指令从哪里开始;这在固定指令大小的RISC处理器上是微不足道的),
  2. 在下一条指令上插入一个临时断点(由于控制转移指令,这有点复杂-下一条指令可能很远)
  3. 恢复下等过程
  4. 等待中断(如果第2步有效,它将在1条指令完成后立即出现)。
  5. 删除在步骤2中插入的临时断点。

资源:

  • 您可以阅读GDB源代码,尽管它不是最容易浏览的代码。
  • 约瑟夫·凯恩(Joseph Kain)撰写了一系列博客文章,解释了事情如何进行,尽管事情似乎停滞了。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在GDB中调试多线程程序时,如何一次继续一个线程?

我是初学者,我想在我的计算器程序中添加一个循环,这样我就不需要一次又一次地运行它。我能做什么?

JDI:如何像调试器中一样暂停Java应用程序(JVM)

如何允许一次只运行一个Java程序实例?

什么是一个好的Java调试器?

MULTI 调试器通过一个断点关闭

从XCode的调试器调用一个块

为一个函数创建一个队列,这样它一次只能在python中运行一次

我如何有一个实时计时器,每秒更新一次,以查看我的程序正在运行多少?蟒蛇

一次显示一个指令AngularJS

调试器如何窥视另一个进程的内存?

如何让多个指令在一个服务中仅调用一次相同的诺言?

如果不是在第一次运行,如何使应用程序转到另一个页面

一次从Django 1.4升级一个复杂的应用程序一个版本,运行服务器segfaults带有1.5.12

如何确保一次只允许一个Azure Functions事件网格触发器实例运行?

有选择地防止调试器在第一次机会异常时停止

ByeBug调试器仅工作一次[Rails 4]

一个 DebugBreak 版本,可以在不使应用程序崩溃的情况下中断调试器

一次只运行一个applescript

像Sidekiq的调试器一样撬动?

如何创建一个像这样的无限全屏滑块?

程序运行时如何运行调试器命令?

如何从一个文件夹中一次运行5个文件,一次运行一批文件?

如何限制“气流”一次只运行一个DAG实例?

如何确保一次仅运行一个Bash脚本实例?

如何在Jmeter中一次运行一个线程组

如何让一个if循环内只运行一次?

GitLab Runner-如何一次只允许一个管道运行

如何使用Scrapy一次运行一个蜘蛛的多个版本?