《Windows 用户态程序高效排错》市场价元 特价元 购买>>
这一部分主要介绍用户态调试相关的知识和工具包括汇编异常(exception)内存布局堆(heap)栈(stack)CRT(C Runtime)handle/Criticalsection/thread context/windbg/ dump/live debug和Dr Watson等
书中不会对知识点作全面的介绍而是针对知识点在调试中过程中应该如何使用进行说明知识点本身在下面两本书中有非常详细的介绍
Programming Applications for Microsoft Windows
Debugging Applications for Windows
排错的工具调试器Windbg
本节介绍调试器Windbg的相关知识Windbg的使用贯穿本书很多章节它是分析问题的高效工具
Windbg的下载地址是
Install Debugging Tools for Windows bit Version
http://wwwmicrosoftcom/whdc/devtools/debugging/installxmspx
建议安装到C:\Debuggers目录后面的例子默认用这个目录
开发人员写完代码通常会在Visual Studio中按F直接进行调试使用Visual Studio自带调试器能够非常方便地在源代码上设定断点检查程序的中间变量单步骤执行在完成代码阶段Visual Studio自带的调试器能够非常方便地做源代码级别的排错
Visual Studio调试器的典型用例是源代码级别的排错与其相比Windbg并不是一款针对特殊用例的调试器Windbg提供了一个GUI界面也可以在源代码上直接用F设定断点但更多的情况下调试人员会直接用文本的方式输入调试命令Windbg执行对应的操作用文本的方式返回对应的结果 Windbg的调试命令覆盖了Windows平台提供的所有调试功能
本节首先对调试器和符号文件作大致的介绍然后针对常用的Windbg调试命令作演示接下来介绍Windbg中强大而灵活的条件断点最后介绍调试器目录下的相关工具
对调试器深入的了解后相信读者就能体会到Windbg和Visual Studio调试器设计上的区别选用最合适的调试器来解决问题
书中不会从Windbg的基本使用方法说起而是着重介绍调试器原理常用的命令Windbg的高级用法和相关的工具如果读者从来没有使用过Windbg下面的文章可以提供帮助
DebugInfo:
http://wwwdebuginfocom/
Windows Debuggers: Part : A WinDbg Tutorial
http://wwwcodeprojectcom/debug/windbg_partasp
调试器的功能检查代码和资料保存dump文件控制程序的执行
调试器无论是Visual Studio调试器还是Windbg都是用来观察和控制目标进程的工具对于用户态的进程调试器可以查看用户态内存空间和寄存器上的资料对于不同类型的数据和代码调试器能方便地把这些信息用特定的格式区分和显示出来调试器还可以把一个目标进程某一时刻的所有信息写入一个文件(dump)直接打开这个文件分析调试器还可以通过设置断点的机制来控制目标程序什么时候停下来接受检查什么时候继续运行
关于调试器的工作原理请参考Debugging Applications for Windows这本书
Windbg及其相关工具的下载地址
http://wwwmicrosoftcom/whdc/devtools/debugging/installxmspx
在安装好Windbg后可以在windbgexe的主窗口按F弹出帮助这是了解和使用Windbg的最好文档每个命令的详细说明都可以在里面找到
调试器可以直观地看到下面一些信息
进程运行的状态和系统状态比如进程运行了多少时间环境变量是什么
当前进程加载的所有EXE/DLL的详细信息
某一个地址上的汇编指令
查看内存地址的内容和属性比如是否可写
每个的call stack(需要symbol)
Call stack上每个函数的局部变量
格式化地显示程序中的数据结构(需要symbol)
查看和修改内存地址上的资料或者寄存器上的资料
部分操作系统管理的数据结构比如HeapHandleCriticalSection等
在Visual Studio调试器中要查看上面的信息需要在很多调试窗口中切换而在Windbg中只需要简单的命令就可以完成
调试器的另外一个作用是设定条件断点可以设定在某一个指令地址上停下来也可以设定当某一个内存地址等于多少的时候停下来或者当某一个exception/notification发生的时候停下来还可以进入一个函数调用的时候停下来或跳出当前函数调用的时候停下来停下来后可以让调试器自动运行某些命令记录某些信息然后让调试器自动判断某些条件来决定是否要继续运行通过简单的条件断点功能可以很方便地实现下面一些任务
当某一个函数被调用的时候在调试器输出窗口中打印出函数参数
计算某一个变量被修改了多少次
监视一个函数调用了哪些子函数分别被调用了多少次
每次抛C++异常的时候自动产生dump文件
在Visual Studio调试器中也能够设定条件断点但灵活性和功能远不能跟Windbg相比
符号文件(Symbol file)把二进制和源代码对应起来
当用VC/VB编译生成EXE/DLL后往往会同时生成PDB文件PDB里面包含的是EXE/DLL的符号信息
符号是指代码中使用到的类型和名字比如下面这些都是符号包含的内容
代码所定义的Class的名字Class的所有成员的名字和所有成员的类型
变量的名字和变量的类型
函数的名字函数所有参数的名字和类型以及函数的返回值
PDB文件除了包含符号外还负责把符号和该符号所处的二进制地址联系起来比如有一个全局变量叫做gBufferPDB文件不仅仅记录了gBuffer的类型还能让调试器找到保存gBuffer的内存地址
有了符号文件当在调试器中试图读取某一个内存地址的时候调试器会尝试在对应的PDB文件中配对看这个内存地址是否有符号对应如果能够找到调试器就可以把对应的符号显示出来这样极大程度上方便了开发人员的观察对于操作系统EXE/DLL微软也提供了对应的符号文件下载地址
默认情况下符号文件中包含了所有的结构函数以及对应的源代码信息微软提供的Windows符号文件去掉了源代码信息函数参数定义和一些内部数据结构的定义