分类: 编写Linux调试器

高级主题 [第十节]

我们终于到了这个系列的最后一篇文章!这一次,我将对调试中的一些更高级概念进行一个高层次的概述:远程调试、共享库支持、表达式求值以及多线程支持。这些概……

处理变量 [第九节]

变量的情况很复杂。有时候它们会好好地待在寄存器中,但一旦你稍不留意,它们就会被存储到栈上。也许编译器为了优化会直接把它们舍弃掉。不管变量在内存中移动……

堆栈展开 [第八节]

有时,关于当前程序状态,你需要了解的最重要信息是程序是如何到达当前状态的。这通常通过 backtrace(回溯)命令来提供,该命令会给出导致程序处于当前状态的……

源代码级断点 [第七节]

在内存地址上设置断点固然不错,但它并不是最方便用户使用的工具。我们还希望能够在源代码行和函数入口地址上设置断点,这样我们就可以在与代码相同的抽象级别……

源代码级单步执行 [第六节]

在前几篇文章中,我们学习了 DWARF 信息,以及它如何让我们将机器代码与高级源代码关联起来。这次,我们将把这些知识付诸实践,为我们的调试器添加源代码级单……

源和信号 [第五节]

在上一部分中,我们学习了 DWARF 信息,以及如何利用它来读取变量,并将我们的高级源代码与正在执行的机器代码关联起来。在这一部分,我们将通过实现一些 DWAR……

精灵和矮人 [第四节]

到目前为止,你可能已经隐约听说过关于“小矮人(dwarves,这里指 DWARF 调试信息格式)”、调试信息,以及一种无需解析源码就能理解它的方法。今天,我们将深入……

寄存器与内存 [第三节]

在上一篇文章中,我们为调试器添加了简单的地址断点。这次,我们将添加读取和写入寄存器及内存的功能,这将使我们能够操作程序计数器,观察程序状态并改变程序……

断点 [第二节]

在本系列的第一部分,我们编写了一个小型进程启动器,作为调试器的基础。在本文中,我们将学习断点在 x86 Linux 系统中是如何工作的,并增强我们的工具以使其……

环境搭建 [第一节]

调试器是任何开发者工具包中最有价值的工具之一。然而,尽管这些工具被广泛使用,但却没有太多资料能告诉你它们是如何工作的以及如何编写一个调试器,尤其是与……