一、Windbg简介
WinDBG是一个非常强大的调试器,它设计了极其丰富的功能来支持各种调试任务,包括用户态调试,内核态调试,调试转储文件,远程调试等。WinDBG具有非常大的灵活性和可扩展性,用来满足各种各样的调试需求,比如用户可以自由定义调试事件的处理方式,编写调试扩展模块来定制和补充WinDBG的调试功能。
尽管WinDBG是个典型的窗口程序,但是它的大多数调试功能还是以手工输入命令的方式来工作。WinDBG提供了20多条标准命令,140多条元命令,和大量扩展命令,学习和灵活使用这些命令是学习WinDBG的关键,也是难点。
二、WinDBG配置
1.配置WinDBG软件标识路径
(1)打开WinDBG软件,如下图所示。
(2)点击File菜单,选择Symbol File Path菜单项,在弹出的对话框中输入WinDBG标识的路径,如下图所示。
(3)输入以上符号路径后,点击OK,设置完成。
2.配置WinDBG软件搜索代码路径
(1)点击File菜单,选择Source Search Path菜单项,在弹出的对话框中输入要进行调试系统的代码路径(代码设置的路径到解决方法一级),如下图所示。
(3)输入代码路径后,点击OK,设置完成。
二、WinDBG调试系统
1.系统崩溃识别
当发生系统崩溃时,不要急着关掉程序或关掉提示对话框,系统崩溃时的状况如下图所示。
2.打开WinDBG与崩溃的系统进行链接
(1)打开WinDBG软件,并确认是否正确设置标识和代码搜索路径,点击File菜单,选择Attach to a Process菜单项,如下图所示。
(2)在弹出的对话框中选择要调试的系统进程,如下图所示。
(3)此时WinDBG进入用户态调试,如下图所示。
3.输入命令进行调试
(1)在Command窗口下输入:~* kb并点击回车键,显示所有的线程,如下图所示。
(2) 显示的所有线程中寻找Kernel32! UnhandledExceptionFilter信息,如下图所示。
(3) 根据以上信息可以知道系统崩溃所在的线程是16号线程,在WinDBG的线程窗口中,用鼠标选中第16号线程,如下图所示。
(4)在Command窗口中输入:dd0358d890命令,显示第一个参数的内存信息,此时指向EXCEPTION_POINTERS结构,如下图所示。
(5) 显示EXCEPTION_POINTERS 结构内存信息详细,如下图所示。
(6) 在Command窗口中输入:.exr 0358d840命令,获取有关异常的类型信息,如下图所示。
(7) 在Command窗口中输入:.cxr 0358d898命令,获取上下文的信息,如下图所示。
(8) 在Command窗口中输入:kv命令,获得实际的异常的调用堆栈,如下图所示。
kv命令显示异常调用堆栈信息
0:016> kv
*** Stack trace for last set context - .thread/.cxr resets it
ChildEBP RetAddr Args to Child
WARNING: Stack unwind information not available. Following frames may be wrong.
0358dbb0 026ff8ac 0358dc2c 00000001 00000008 MSVCR80!fwrite+0x39
0358ec34 02700d82 03460000 000027d8 03478f1c 123::ReadData+0x7c [123.cpp @ 176]
(9) 根据以上信息可知,崩溃的文件是123.cpp。崩溃的函数是fwrite。