转载请注明出处:http://blog.youkuaiyun.com/ecjtu_luowei/article/details/43974727
一、前言
WinDBG作为Microsoft的御用工具,其强大之处使我这等小辈难以望其项背,它设计了极其丰富的功能来支持各种调试任务,包括用户态调试、内核态调试、dump文件调试、远程调试等。其灵活性和可扩展性能极大满足调试要求。所以对于WinDBG,读者非常有必要花费一些业余时间来学习研究。
本文主要是通过调试C#编写的NET程序来对WinDBG作一个片面的介绍,由于笔者真正开始使用Windbg的时间并不长,所以文中难免有许多谬误之处,如在阅读本文过程中遇到问题或错误,可直接联系笔者(sbcd3760@gmail.com)。
二、概述
尽管Windbg是个GUI程序,但是大部分工作都是通过命令的方式。Windbg共支持三种命令:标准命令、元命令、和扩展命令。在接下来的文章中,这三种命令都会有所涉及。
标准命令往往都非常简单,通常一两个字符或符号,用来提供使用各种调试目标的最基本调试功能。如:g、t、p、q等。
元命令用来提供标准命令没有提供的调试功能,元命令和标准命令都是内建在调试器或Windbg程序文件中。
扩展命令用于扩展某一方面的调试功能。扩展命令是通过加载第三方的DLL来实现调试任务的。调试net程序大部分使用的都是扩展命令,主要的扩展dll就是SOS.dll和SOSEX.dll。
这三种命令有个明显的区分方式就是元命令都是以点(.)开始,扩展命令通常以感叹号(!)开始,如果一个有效的命令既不是扩展命令也不是元命令那么它就是标准命令了。
三、开始调试
3.1 调试符号(Symbol)
看大部分Windbg的基础教程和Windbg的官网首页上都首先提到Symbol路径的设置,Symbol其实主要起一个辅助作用,在调试分析的过程中对内存中的机器代码翻译成对应的源代码的信息或是Win32 API的信息,如函数名,数据结构名,变量名、机器指令对应的源文件名和行号等。一般我们在组建编译文件的时候生成exe或dll文件的同时也会生成一个对应的pdb文件,这个文件就包含了exe或dll的辅助信息。
是否加载Symbol的区别如下:
| 没有加载Symbol |
| 0:000> u D20108 *** ERROR: Module load completed but symbols could not be loaded for notepad.exe notepad+0x108: 00d20108 8936 mov dword ptr [esi],esi 00d2010a 0000 add byte ptr [eax],al 00d2010c 0010 add byte ptr [eax],dl 00d2010e 0000 add byte ptr [eax],al 00d20110 00c0 add al,al 00d20112 0000 add byte ptr [eax],al 00d20114 0000 add byte ptr [eax],al 00d20116 d200 rol byte ptr [eax],cl |
| 加载Symbol |
| 0:000> u D20108 notepad!_imp__RegSetValueExW <PERF> (notepad+0x108): 00d20108 8936 mov dword ptr [esi],esi notepad!_imp__RegSetValueExW <PERF> (notepad+0x10a): 00d2010a 0000 add byte ptr [eax],al notepad!_imp__RegSetValueExW <PERF> (notepad+0x10c): 00d2010c 0010 add byte ptr [eax],dl notepad!_imp__RegSetValueExW <PERF> (notepad+0x10e): 00d2010e 0000 add byte ptr [eax],al notepad!_imp__RegSetValueExW <PERF> (notepad+0x110): 00d20110 00c0 add al,al notepad!_imp__RegSetValueExW <PERF> (notepad+0x112): 00d20112 0000 add byte ptr [eax],al notepad!_imp__RegSetValueExW <PERF> (notepad+0x114): 00d20114 0000 add byte ptr [eax],al notepad!_imp__RegSetValueExW <PERF> (notepad+0x116): 00d20116 d200 rol byte ptr [eax],cl |
如果Symbol文件和对应的dll或exe在同一目录下,那么在调试的过程中,当dll或exe文件被加载的时候,对应的Symbol文件也会自动加载,所以一般情形下我们不需要设置Symbol路径。如果pdb文件和dll文件不再同一目录下,我们也可以手动的设置Symbol的路径。一般设置Symbol的方式有两种:
1. 通过菜单设置

2. 通过命令设置:
| 0:004> .sympath d:\symbol Symbol search path is: d:\symbol Expanded Symbol search path is: d:\symbol
************* Symbol Path validation summary ************** Response Time (ms) Location OK d:\symbol 0:004> .reload Reloading current modules ........................ |
注意:设置了Symbol路径需要重新加载,否则设置的Symbol路径无效。
Symbol路径的设置同样可以指定多个路径,多个路径通过分号(;)隔开, 例如:

本文介绍了如何使用WinDbg调试C#编写的.NET程序,涵盖了调试符号、调试目标、调试环境设置、SOS与SOSEX扩展命令的加载等内容,是初学者了解WinDbg调试.NET程序的入门指南。
最低0.47元/天 解锁文章
1029





