分类: C/C++
2011-06-02 22:33:14
Windbg是微软的一款免费且功能超强大的调试工具,可用于内核态和用户态的调试,还可用于调试dump文件。
由于其可以在内核模式调试,因此Windbg在驱动等底层程序的调试中应用相当广泛。相比而言,虽然Windbg也可以用来调试用户态下的程序,但是由于Windbg调试程序是通过命令行进行,使用起来相当麻烦,因此在有VS(VS本身提供的条件测试功能已经很强大)等功能强大的IDE的情况下用户态程序很少会使用Windbg进行调试。
下面是一个简单的用户态程序调试的例子:
1. 用VS创建一个工程HelloWorld,生成一个HelloWorld.cpp文件,内容如下:
#include
void fun()
{
int a = 10;
int b = 20;
int c = 5;
c= a+b;
printf("%d",c);
}
int main()
{
fun();
return 0;
}
2. 运行工程,生成一个HelloWorld.exe文件.
3. 打开Windbg,在Edit菜单下选择open/close Log file, 在弹出的对话框中输入HelloLog,会在Windbg的安装目录下生成一个HelloLog的日志文件,日志文件将会记录Command窗口中的所有内容。
4. 在File菜单下选择 Open Executable..打开HelloWold.exe
5. Windbg这时会弹出一个Command窗口,在窗口下方的输入框中可以输入命令,这里我们输入bp fun,在fun函数这里设置断点。(Windbg关于设置断点的命令还有bu,bm等,详细可以查看其帮助文档)。
6. 接下来和VS调试类似,使用Windbg工具栏上的按钮进行调试。
7. 调试完后可以查看HelloLog文件,可以看出其中记录了调试过程中Command窗口的所有内容,这些内容比较详细,包括了各个时刻寄存器的内容。
当然,对于上面如此简单的程序,完全没必要用Windbg。实际上,个人觉得,对于用户态程序,只要不牵涉到多线程,甚至一般复杂的多线程程序,都没有必要使用Windbg。
但是对于偶发缺陷和复杂的多线程程序,Windbg是一种调试选择。Windbg基于命令行调试,具有灵活和强大的特点,至少以下的功能貌似VS还不能实现。
1. Windbg具有Log文件:虽然VS下进行调试也会生成BuildLog.htm文件,但是根据其内容基本上只能判别出程序运行没运行这种很粗显的错误,用处不大,而Windbg的Log文件(如HelloLog)记录了到寄存器级别的信息,对于debug时分析程序错误还是很有帮助的。
2. 通过Windbg的命令可以决定哪些信息写入Log文件:比如Windbg通过命令可以在断点处设置当变量满足某一条件时,将此时的callstack和任何你关心的信息写入Log文件。
3. 通过Windbg通过命令可以实现程序运行多遍(调试偶发缺陷可能有用)。
(文章转自:http://blog.csdn.net/yuzhouhenan/archive/2009/10/04/4632096.aspx)