调试器的实现
win32下实现简单的调试器
Eugene800
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Extending windbg with Page Fault Breakpoints (windbg页面断点)
IntroductionHave you ever needed to set a breakpoint on an entire module or memory region?This is particularly useful if you want break on code execution in a module without specifying any function na...转载 2018-06-21 20:59:05 · 427 阅读 · 0 评论 -
编写windbg调试器扩展 高级篇
其实,前面几篇文章已经可以写出一个调试器扩展,但是编写这样的调试器扩展,其所能提供的功能并不比windbg脚本多。通过这篇文章,我希望大家能从中了解一些调试器扩展所特有的能力(要不然还费神写什么代码)。 进阶篇中曾经提到过一个不怎么起眼的类:IDebugClient,当时我介绍说这个类的作用是"用户输入的来源和命令输出的目标"。这句话没错,当然更确切的定义还是需要读者移步到MSDN查阅原创 2017-08-15 22:15:23 · 1526 阅读 · 0 评论 -
编写windbg调试器扩展 进阶篇1
作为windbg调试器扩展的第三篇,这篇文章将结合代码,梳理调试器扩展的骨架脉络。 先附上代码片段:#include "dbgexts.h"extern "C" HRESULT CALLBACKDebugExtensionInitialize(PULONG Version, PULONG Flags) { *Version = DEBUG_EXTENSION_VERSION(原创 2017-08-15 00:11:57 · 1202 阅读 · 0 评论 -
编写windbg调试器扩展 入门篇2
前面一篇是用sources和nmake组合编译生成调试器扩展,步骤比较繁琐,我相信读者应该更倾向于用IDE来编写代码。本篇有2个主题:1.将前面的代码移植到VS上,用IDE编译;2.调试生成的扩展命令。1.移植代码到IDE 这部分相对简单,所以放在开头。要用IDE代替nmake编译调试器扩展,只要把sources文件中的编译/链接选项复制到VS对应的选项中就可以了。1.1.设置编原创 2017-08-10 22:18:18 · 908 阅读 · 0 评论 -
编写windbg调试器扩展 入门篇1
我博客的左侧专栏曾经转过windows下编写调试器的一系列文章,这类文章是从零打造调试器,而这篇文章是介绍如何为windbg编写调试器扩展命令。0.前言 windbg的命令有很多,其中以"!"开始的命令就是所谓的扩展命令。这些扩展命令由Dll以导出函数的形式提供给windbg加载。一般跟在"!"后面的字符串就是dll中导出的函数。以!htrace命令为例,查看windbg帮助文档,它原创 2017-08-10 00:13:38 · 1889 阅读 · 0 评论 -
Debugger APIs - Writing a Debugging Tools for Windows Extension (编写Windbg扩展)
转自:https://msdn.microsoft.com/en-us/magazine/gg650659.aspxTroubleshooting production issues can be one of the most frustrating jobs that any engineer can do. It can also be one of the most rewar转载 2017-07-19 23:53:45 · 1643 阅读 · 0 评论 -
Debugger Engine API - Writing a Debugging Tools for Windows Extension, Part 2: Output (最无趣的一篇)
转自:https://msdn.microsoft.com/en-us/magazine/hh148143.aspxIn this second installment of my series about the Debugger API, I’m going to show you how you can enhance the output generated by your D转载 2017-07-19 23:56:17 · 1579 阅读 · 0 评论 -
Debugger Engine API - Writing a Debugging Tools for Windows Extension, Part 3: Clients and Callbacks
转自:https://msdn.microsoft.com/en-us/magazine/hh205613.aspxIn this third installment about the Debugger API, I’m going to delve deeper into the relationship a debugger extension can have with the d转载 2017-07-19 23:58:49 · 1260 阅读 · 0 评论 -
[Win32]一个调试器的实现(十一)显示函数调用栈
本文讲解如何在调试器中显示函数调用栈,如下图所示: 原理首先我们来看一下显示调用栈所依据的原理。每个线程都有一个栈结构,用来记录函数的调用过程,这个栈是由高地址向低地址增长的,即栈底的地址比栈顶的地址大。ESP寄存器的值是栈顶的地址,通过增加或减小ESP的值可以缩减或扩大栈的大小。上一篇文章已经简略地介绍过在调用函数时线程栈上会发生什么事情,现在我们再来详细地看看这个过程:转载 2016-09-30 13:37:37 · 1501 阅读 · 0 评论 -
[Win32]一个调试器的实现(十)显示变量
上回介绍了微软的符号模型,有了这个基础知识,这回我们向MiniDebugger中添加两个新功能,分别是显示变量列表和以指定类型显示内存内容。显示变量列表用于列出当前函数内的局部变量或者全局变量;以指定类型显示内存内容用于读取指定地址处的内存内容,然后将这些二进制数据按照类型的格式解析成可读的内容并显示出来。如下面的截图所示: 使用lv命令显示局部变量时,每一列从左到右分别是:类型,名称转载 2016-09-30 13:33:12 · 1588 阅读 · 0 评论 -
[Win32]一个调试器的实现(九)符号模型
在接下来的文章中会讲解如何在调试器中显示局部变量和全局变量的类型和值。实现这个功能一定要有调试符号的支持,因为调试符号记录了每个变量的名称,类型,地址,长度等信息。这不是一件轻松的事情,因为你首先要对符号模型有一定的了解。所以本文的主要目的就是介绍DbgHelp中的符号模型。 符号模型这里所说的“符号模型”指的是各种符号之间的逻辑关系,虽然微软定义了各种不同格式的符号文件,但是它们使用转载 2016-09-30 13:19:19 · 1617 阅读 · 0 评论 -
[Win32]一个调试器的实现(八)单步执行
上回讲解了如何实现断点功能,这回讲解如何实现与断点紧密相关的单步执行功能。单步执行有三种类型:StepIn,StepOver和StepOut,它们的实现方式比较多样化,单独实现它们的话并不困难,但是将它们整合到一起就比较困难了,特别是加上断点功能之后,程序的逻辑更加难以理解。本文首先单独讲解每种单步执行的原理,最后讲解如何将它们整合到一起。这都是我个人的实现方法,大家可以用来参考。(注意:本文所讲转载 2016-09-30 11:55:08 · 2380 阅读 · 0 评论 -
[Win32]一个调试器的实现(七)断点
断点是最基本和最重要的调试技术之一,本文讲解了如何在调试器中实现断点功能。什么是断点在进行调试的时候,只有被调试进程暂停执行时调试器才可以对它执行操作,例如观察内存内容等。如果被调试进程不停下来的话,调试器是什么也做不了的。要使被调试进程停下来,除了几个在特定时刻才发生的调试事件外,唯一的途径就是引发异常。断点正是用来达到上述目的的异常,在第三篇文章的异常代码表中,有一种EXCEPTI转载 2016-09-29 09:58:53 · 2357 阅读 · 0 评论 -
[Win32]一个调试器的实现(六)显示源代码
上一篇文章介绍了调试符号以及DbgHelp的加载和清理,这回我们使用它来实现一个显示源代码的功能。该功能的实际使用效果如下图所示:该功能不仅仅是显示源代码,还要显示每一行代码对应的地址。实现该功能大概需要进行以下的步骤:①获取下一条要执行的指令的地址。②通过调试符号获取该地址对应哪个源文件的哪一行。③对于其它的行,通过调试符号获取它对应的地址。 第一步可以通过获取E转载 2016-09-29 09:49:06 · 1278 阅读 · 0 评论 -
[Win32]一个调试器的实现(五)调试符号
一个调试器应该可以跟踪被调试程序执行到了什么地方,显示下一条将要执行的语句,显示各个变量的值,设置断点,进行单步执行等等,这些功能都需要一个基础设施的支持,那就是调试符号。 什么是调试符号我们知道,在exe、dll等可执行文件中保存的数据大部分都是二进制指令,CPU直接读取这些指令并执行。那么调试器是如何知道每条指令对应哪个源文件的哪一行代码呢?它又是如何知道每个变量和函数的名称,并显转载 2016-09-25 21:54:32 · 2976 阅读 · 0 评论 -
[Win32]一个调试器的实现(四)读取寄存器和内存
在前几篇文章中,我实现的那个调试器只能被动接收调试事件并输出这些事件的信息。现在,我要将它修改成可以接收命令,并根据命令对被调试进程进行各种操作。首先从最基本的操作开始。获取寄存器的值每个线程都有一个上下文环境,它包含了有关线程的大部分信息,例如线程栈的地址,线程当前正在执行的指令地址等。上下文环境保存在寄存器中,系统进行线程调度的时候会发生上下文切换,实际上就是将一个线程的上下文转载 2016-09-25 21:44:53 · 2906 阅读 · 0 评论 -
[Win32]一个调试器的实现(三)异常
这回接着处理上一篇文章留下的问题:如何处理EXCEPTION_DEBUG_EVENT这类调试事件。这类调试事件是调试器与被调试进程进行交互的最主要手段,在后面的文章中你会看到调试器如何使用它完成断点、单步执行等操作。所以,关于这类调试事件的处理很自由,调试器的作者可以根据需要进行不同的处理。但是,在对其进行处理之前必须要了解一些关于异常的知识,这也是本文的重点。(本文的内容参考了《软件调试》一书)转载 2016-09-23 13:27:19 · 2999 阅读 · 0 评论 -
[Win32]一个调试器的实现(二)调试事件的处理
上一篇文章说到了调试循环的写法,这回讲一下调试器应该如何处理各种调试事件。 RIP_EVENT关于这种调试事件的文档资料非常少,即使提到也只是用“系统错误”或者“内部错误”一笔带过。既然如此,我们也不需要对其进行什么处理,只要输出一条信息或者干脆忽略它即可。 OUTPUT_DEBUG_STRING_EVENT当被调试进程调用OutputDebugString时就会引发该类调转载 2016-09-23 13:22:31 · 960 阅读 · 0 评论 -
[Win32]一个调试器的实现(一)调试事件与调试循环
前言程序员离不开调试器,它可以动态显示程序的执行过程,对于解决程序问题有极大的帮助。如果你和我一样对调试器的工作原理很感兴趣,那么这一系列文章很适合你,这些文章记录了我开发一个调试器雏形的过程,希望对你有帮助。或许我写的代码很拙劣,还请大家多多见谅! 这个调试器使用Visual Studio 2010作为开发工具,是一个控制台程序。为了简化,一切输入输出都使用C++标准库的相关类,而且转载 2016-09-23 13:16:25 · 2139 阅读 · 0 评论
分享