2010-10-11 62 views
25

我想知道gdb如何在内部工作。 例如我知道一个简单的想法,它使用ptrace()系统调用来监视跟踪的程序。 但我想知道它如何处理信号,它如何插入新的代码,以及其他如此神话般的事情。gdb如何工作?

+6

这包括一些GDB内部的重要方面:www.gnuarm.com/pdf/gdbint.pdf – zengr 2010-10-11 05:05:54

+3

@zengr:你为什么不张贴,作为一个答案? – DarkDust 2010-10-11 05:39:20

回答

6

你会发现的唯一方法是通过研究source

您也可以构建它并自行调试它。通过代码,你会知道究竟是它是如何做的。

读取GDB源代码虽然不是心存隐晦 - 它充满了宏,并且大量使用libbfd,这本身很难理解。

它必须,因为它是可移植的(并且特别是在没有ptrace()的平台上构建和工作)。

+0

我想你的意思是[chock full](http://en.wiktionary.org/wiki/chock_full) – sje397 2010-10-11 05:02:09

+0

http://www.cs.utah.edu/dept/old/texinfo/gdb/gdbint.html#SEC1 – zengr 2010-10-11 05:03:11

16

查看GDB Internals Manual,其中涵盖了一些重要方面。本文档中还有一个较旧的PDF version

从手册:

该文件记录了GNU调试器,GDB的内部。它包括gdb关键算法和操作的描述,以及将gdb调整到特定主机和目标的机制。

+0

[GDB Internals Manual](https://sourceware.org/gdb/download/onlinedocs/gdbint/)未找到zengr .. – sree 2014-02-11 12:39:01

+2

感谢Sree!固定。 – zengr 2014-02-11 19:24:46

3

从gdbint.pdf摘自:

这是可以做到无论是作为硬件断点或软件断点 :

  • 硬件断点有时可与一些一个内置调试功能芯片。通常这些工作是通过专用的 寄存器来存储断点地址。如果PC (程序计数器的简写)匹配了断点 寄存器中的值,则CPU引发异常并将其报告给GDB。
  • 另一种可能性是仿真器在使用中;许多模拟器包括手表从 处理器出来的地址线电路,并迫使其停止如果地址断点的 地址匹配。
  • 第三种可能性是目标已经有能力以某种方式做断点;例如,一个ROM监视器可能会自己做出 软件断点。因此,尽管这些并不是字面意义上的硬件断点,但从GDB的观点来看,它们的工作原理是一样的;
  • 软件断点需要GDB做更多的工作。基本原理是,GDB将取代程序指令与陷阱, 非法鸿沟,或其他一些指令将导致 异常,然后遇到的真实时,GDB将采取例外 并停止该程序。当用户说继续,GDB将恢复 原始指令,单步,重新插入陷阱, 继续。