使用WinDbg —— .NET篇 (一)

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

转载请注明出处:http://blog.youkuaiyun.com/ecjtu_luowei/article/details/43974727

一、前言

WinDBG作为Microsoft的御用工具,其强大之处使我这等小辈难以望其项背,它设计了极其丰富的功能来支持各种调试任务,包括用户态调试、内核态调试、dump文件调试、远程调试等。其灵活性和可扩展性能极大满足调试要求。所以对于WinDBG,读者非常有必要花费一些业余时间来学习研究。

本文主要是通过调试C#编写的NET程序来对WinDBG作一个片面的介绍,由于笔者真正开始使用Windbg的时间并不长,所以文中难免有许多谬误之处,如在阅读本文过程中遇到问题或错误,可直接联系笔者(sbcd3760@gmail.com)。

二、概述

尽管Windbg是个GUI程序,但是大部分工作都是通过命令的方式。Windbg共支持三种命令:标准命令、元命令、和扩展命令。在接下来的文章中,这三种命令都会有所涉及。

标准命令往往都非常简单,通常一两个字符或符号,用来提供使用各种调试目标的最基本调试功能。如:gtpq等。

元命令用来提供标准命令没有提供的调试功能,元命令和标准命令都是内建在调试器或Windbg程序文件中。

扩展命令用于扩展某一方面的调试功能。扩展命令是通过加载第三方的DLL来实现调试任务的。调试net程序大部分使用的都是扩展命令,主要的扩展dll就是SOS.dllSOSEX.dll

这三种命令有个明显的区分方式就是元命令都是以点(.)开始,扩展命令通常以感叹号(!)开始,如果一个有效的命令既不是扩展命令也不是元命令那么它就是标准命令了。

三、开始调试

3.1 调试符号(Symbol

看大部分Windbg的基础教程和Windbg的官网首页上都首先提到Symbol路径的设置,Symbol其实主要起一个辅助作用,在调试分析的过程中对内存中的机器代码翻译成对应的源代码的信息或是Win32 API的信息,如函数名,数据结构名,变量名、机器指令对应的源文件名和行号等。一般我们在组建编译文件的时候生成exedll文件的同时也会生成一个对应的pdb文件,这个文件就包含了exedll的辅助信息。

是否加载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文件和对应的dllexe在同一目录下,那么在调试的过程中,当dllexe文件被加载的时候,对应的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路径的设置同样可以指定多个路径,多个路径通过分号(;)隔开, 例如:

 

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值