随笔 - 37  文章 - 0  评论 - 150  阅读 - 29万
04 2011 档案
[Win32]一个调试器的实现(十一)显示函数调用栈
摘要:本文讲解如何在调试器中显示函数调用栈,如下图所示:原理首先我们来看一下显示调用栈所依据的原理。每个线程都有一个栈结构,用来记录函数的调用过程,这个栈是由高地址向低地址增长的,即栈底的地址比栈顶的地址大。ESP寄存器的值是栈顶的地址,通过增加或减小ESP的值可以缩减或扩大栈的大小。上一篇文章已经简略地介绍过在调用函数时线程栈上会发生什么事情,现在我们再来详细地看看这个过程:①在栈上压入参数。②执行CALL指令,在栈上压入函数的返回地址。③压入EBP寄存器的值。④将ESP寄存器的值赋给EBP寄存器。⑤减小ESP寄存器的值,为局部变量分配空间。⑥执行函数代码。⑦将EBP寄存器的值赋给ESP寄存器,等 阅读全文
posted @ 2011-04-23 11:19 Zplutor 阅读(9890) 评论(13) 推荐(7) 编辑
[Win32]一个调试器的实现(十)显示变量
摘要:上回介绍了微软的符号模型,有了这个基础知识,这回我们向MiniDebugger中添加两个新功能,分别是显示变量列表和以指定类型显示内存内容。显示变量列表用于列出当前函数内的局部变量或者全局变量;以指定类型显示内存内容用于读取指定地址处的内存内容,然后将这些二进制数据按照类型的格式解析成可读的内容并显示出来。如下面的截图所示:使用lv命令显示局部变量时,每一列从左到右分别是:类型,名称,长度,地址,值。只有基本类型、枚举类型以及指针类型的变量才会显示它的值,对于数组类型和UDT类型的变量则不显示它的值。获取这些变量的值需要使用f命令,该命令遵守同样的显示规则。下面介绍这两个命令的实现方法。枚举全 阅读全文
posted @ 2011-04-22 18:44 Zplutor 阅读(7123) 评论(5) 推荐(3) 编辑
[Win32]一个调试器的实现(九)符号模型
摘要:在接下来的文章中会讲解如何在调试器中显示局部变量和全局变量的类型和值。实现这个功能一定要有调试符号的支持,因为调试符号记录了每个变量的名称,类型,地址,长度等信息。这不是一件轻松的事情,因为你首先要对符号模型有一定的了解。所以本文的主要目的就是介绍DbgHelp中的符号模型。符号模型这里所说的“符号模型”指的是各种符号之间的逻辑关系,虽然微软定义了各种不同格式的符号文件,但是它们使用的符号模型都是相同的。正因为如此,使用DbgHelp可以读取各种格式的符号文件,而且DIA文档中关于符号模型的那部分内容也适用于DbgHelp,正好弥补了DbgHelp文档中缺少的内容。遗憾的是,这部分内容非常少, 阅读全文
posted @ 2011-04-14 12:42 Zplutor 阅读(6295) 评论(4) 推荐(4) 编辑
[Win32]一个调试器的实现(八)单步执行
摘要:上回讲解了如何实现断点功能,这回讲解如何实现与断点紧密相关的单步执行功能。单步执行有三种类型:StepIn,StepOver和StepOut,它们的实现方式比较多样化,单独实现它们的话并不困难,但是将它们整合到一起就比较困难了,特别是加上断点功能之后,程序的逻辑更加难以理解。本文首先单独讲解每种单步执行的原理,最后讲解如何将它们整合到一起。这都是我个人的实现方法,大家可以用来参考。(注意:本文所讲的单步执行是源代码级别的,而不是指令级别的。)StepIn原理StepIn即逐条语句执行,遇到函数调用时进入函数内部。当用户对调试器下达StepIn命令时,调试器的实现方式如下:①通过调试符号获取当前 阅读全文
posted @ 2011-04-09 19:35 Zplutor 阅读(8094) 评论(1) 推荐(3) 编辑
[Win32]一个调试器的实现(七)断点
摘要:断点是最基本和最重要的调试技术之一,本文讲解了如何在调试器中实现断点功能。什么是断点在进行调试的时候,只有被调试进程暂停执行时调试器才可以对它执行操作,例如观察内存内容等。如果被调试进程不停下来的话,调试器是什么也做不了的。要使被调试进程停下来,除了几个在特定时刻才发生的调试事件外,唯一的途径就是引发异常。断点正是用来达到上述目的的异常,在第三篇文章的异常代码表中,有一种EXCEPTION_BREAKPOINT异常,它就是断点异常。虽然断点是一种异常,但并不意味着被调试进程发生了问题,它只是用来调试的一种手段,所以调试器应该将它和别的异常明显区分开来。实际上Windows对断点异常的处理也有一 阅读全文
posted @ 2011-04-02 23:10 Zplutor 阅读(10827) 评论(0) 推荐(3) 编辑

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示