日期:2014-05-16  浏览次数:20565 次

Windbg培训笔记之一(基础篇)

Windbg培训笔记一(基础篇)主讲人:Nick Xiao

  • Windbg简介

Windbg是微软 提供的应用程序,可以在微软的官方网站上下载到。Windbg 提供了用户态和核心态的调试能力。

  • 为什么要用Windbg

VC6和VS2008都提供了Debug的功能,那为什么我们还需要用Windbg这个工具呢?简单来说,假如你的程序在客户那里出现了问题,比如说crash或者hang住,这个时候你该怎么办?到客户机器上装一个VC6或者VS2008,然后再把源代码拷贝过去?看起来似乎工程浩大,而且效果不是很好。想象一下,如果在程序Crash的时候,我们能对当前的内存、堆栈等等作一个快照,然后根据这个快照,我们就能很容易的分析出程序出现了什么问题,那生活似乎会美好很多。是的,Windbg就是提供了这个功能。唯一的问题是,Windbg没有Visual Stdio那么好用,它的功能都是基于命令行的,也许你一开始你会无所适从,你需要一段时间来适应它。

  • 如何调试

第一步,当然是安装Windbg,作为Debuging Tools for Windows的一部分,可以从微软网站免费下载到。安装很简单,你可以用默认设置安装。而且这个安装似乎是绿色的,你可以把安装后的目录直接拷贝到其他机器上运行。

第二步,配置Windbg,给它指定一个符号文件服务器。因为Windbg运行的时候需要知道你的EXE和DLL的符号文件包括操作系统DLL的符号文件。微软公开了他的一些比较重要的DLL的符号文件,Windbg会根据当前的DLL版本自己去查找对应的符号文件,如果没有找到的话,就从微软网站去下载,这一切都是Windbg自动完成的。当然,你自己程序的文件需要你自己放在服务器上。简单来说,就是新建_NT_SYMBOL_PATH这样一个环境变量。这个环境变量会告诉Windbg你的符号文件放在什么地方。例如,可以用如下路径:"srv*C:/LocalSymbolPath*http://msdl.microsoft.com/download/symbols"。值得注意的是,这个环境变量不仅仅Windbg会使用,VS2008也可能会用到,如果你发现你的VS2008调试起来很慢的话,十有八九是这个环境变量的问题。

第三步,设置Release版本的编译选项,编译出来PDB文件。应该说,PDB是Windbg的灵魂,离开了PDB,Windbg可以说什么也不是。我们平时应该都有过调试Debug版的经历,其实Release版本也是可以用来调试的。关键就在于要Enable两个编译选项。Enable这两个选项以后,不会对生成的目标文件有太大的影响,最多size会大一点点而已。

第四步,有了PDB以后,同时也设置好符号服务器的位置。我们就可以对release版本的程序进行调试。

VS2008 PDB设置1

VS2008 PDB设置2

  • 如何输出dump文件

似乎一切看起来都差不多了,但是,怎么才能在程序crash的时候记录下dump文件呢?其实很简单,我们主要注册UnhandledExceptionHandler来捕捉程序crash的时间,然后调用windbg的方法来写dump文件。

 

当发生异常时,比如内存访问违例时,CPU硬件会发现此问题,并产生一个异常(你可以把它理解为中断) 
然后CPU会把代码流程切换到异常处理服务例程。操作系统异常处理服务例程会查看当前进程是否处于调试状态 
如果时,则通知调试器发