windbg常用命令列表
- 格式:xls
- 大小:71.00 KB
- 文档页数:15
WinDbg内核调试常用命令(2)接上一章继续介绍内核调试下的常用命令,这一章主要涉及内存相关、对象相关、驱动设备相关以及蓝屏Dump 相关命令。
介绍每个命令的主要作用,以及常用方式,不会涉及详细的命令参数,目的是能快速上手熟悉内核调试下的常用操作,而不是替代帮助文件。
内存相关内存操作应该是调试最常用的,比如查看内存、修改内存等。
本节介绍内核模式下常用的内存操作命令,大部分是内核模式下特有的命令,诸如db/eb/dt/s等基本内存命令则不会介绍。
!address!address命令显示内存信息,如内存范围、内存权限等。
这条命令在用户模式下也能用,而且显示的信息比较丰富。
!address命令不带参数时,显示所有内存信息。
kd>!address80800000-0026b000Usage KernelSpaceUsageImageImageName ntoskrnl.exe80a6b000-0001f000Usage KernelSpaceUsageImageImageName halacpi.dll......f51d9000-00005000Usage KernelSpaceUsageKernelStackKernelStack81827020:340.7ac......f894f000-00002000Usage KernelSpaceUsageImageImageName swenum.sysf8951000-00256000Usage KernelSpaceUsageNonPagedSystemf8ba8000-07038000Usage KernelSpaceUsageNonPagedPoolExpansionUsage表示内存用途,如内核映像、非分页内存、内核栈、会话空间等。
通过Usage就能大概了解某段内存的使用情况,也为进一步分析内存指明了方向。
!address xxxxxxxx显示指定地址的内存信息。
Windbg命令学习3(lmf和r)以下的所有⽰例都是加载calc程序1 lmflmf可以列出当前进程中加载的所有DLL⽂件和对应的路径给个例⼦:0:001> lmfstart end module name01000000 0101f000 calc C:\WINDOWS\system32\calc.exe10000000 100b0000 safemon C:\Program Files\360\360Safe\safemon\safemon.dll58fb0000 5917a000 AcGenral C:\WINDOWS\AppPatch\AcGenral.DLL5adc0000 5adf7000 UxTheme C:\WINDOWS\system32\UxTheme.dll5cc30000 5cc56000 ShimEng C:\WINDOWS\system32\ShimEng.dll62c20000 62c29000 LPK C:\WINDOWS\system32\LPK.DLL71a10000 71a18000 WS2HELP C:\WINDOWS\system32\WS2HELP.dll71a20000 71a37000 WS2_32 C:\WINDOWS\system32\WS2_32.dll73640000 7366e000 msctfime C:\WINDOWS\system32\msctfime.ime73fa0000 7400b000 USP10 C:\WINDOWS\system32\USP10.dll74680000 746cc000 MSCTF C:\WINDOWS\system32\MSCTF.dll759d0000 75a7f000 USERENV C:\WINDOWS\system32\USERENV.dll76300000 7631d000 IMM32 C:\WINDOWS\system32\IMM32.DLL765e0000 76673000 CRYPT32 C:\WINDOWS\system32\CRYPT32.dll76680000 76726000 WININET C:\WINDOWS\system32\WININET.dll76990000 76ace000 ole32 C:\WINDOWS\system32\ole32.dll76b10000 76b3a000 WINMM C:\WINDOWS\system32\WINMM.dll76bc0000 76bcb000 PSAPI C:\WINDOWS\system32\PSAPI.DLL76db0000 76dc2000 MSASN1 C:\WINDOWS\system32\MSASN1.dll770f0000 7717b000 OLEAUT32 C:\WINDOWS\system32\OLEAUT32.dll77180000 77283000 comctl32 C:\WINDOWS\WinSxS\x86_mon-Controls_6595b64144ccf1df_6.0.2600.6028_x-ww_61e65202\comctl32.dll 77bb0000 77bc5000 MSACM32 C:\WINDOWS\system32\MSACM32.dll77bd0000 77bd8000 VERSION C:\WINDOWS\system32\VERSION.dll77be0000 77c38000 msvcrt C:\WINDOWS\system32\msvcrt.dll77d10000 77da0000 USER32 C:\WINDOWS\system32\USER32.dll77da0000 77e49000 ADVAPI32 C:\WINDOWS\system32\ADVAPI32.dll77e50000 77ee3000 RPCRT4 C:\WINDOWS\system32\RPCRT4.dll77ef0000 77f39000 GDI32 C:\WINDOWS\system32\GDI32.dll77f40000 77fb6000 SHLWAPI C:\WINDOWS\system32\SHLWAPI.dll77fc0000 77fd1000 Secur32 C:\WINDOWS\system32\Secur32.dll7c800000 7c91e000 kernel32 C:\WINDOWS\system32\kernel32.dll7c920000 7c9b3000 ntdll C:\WINDOWS\system32\ntdll.dll7d590000 7dd84000 SHELL32 C:\WINDOWS\system32\SHELL32.dll2.rr命令显⽰或修改寄存器、浮点寄存器、标志位、伪寄存器和预定义别名直接⽤r,会显⽰当前线程的寄存器状态~0 r表⽰显⽰0号线程的寄存器状态~* r会显⽰所有线程的寄存器状态~0 r eax = 0x1可以对1线程进⾏eax赋值~* r eax =0x1,可以对所有线程进⾏eax赋值给个例⼦:0:001> reax=00000009 ebx=00000001 ecx=00000002 edx=00000003 esi=00000004 edi=00000005eip=7c92120e esp=00c1ffcc ebp=00c1fff4 iopl=0 nv up ei pl zr na pe nccs=001b ss=0023 ds=0023 es=0023 fs=0038 gs=0000 efl=00000246ntdll!DbgBreakPoint:7c92120e cc int 30:001> ~1 reax=00000009 ebx=00000001 ecx=00000002 edx=00000003 esi=00000004 edi=00000005eip=7c92120e esp=00c1ffcc ebp=00c1fff4 iopl=0 nv up ei pl zr na pe nccs=001b ss=0023 ds=0023 es=0023 fs=0038 gs=0000 efl=00000246ntdll!DbgBreakPoint:7c92120e cc int 30:001> ~0 reax=00000009 ebx=00000000 ecx=002e3a80 edx=0000c0f1 esi=0007fee8 edi=01014018eip=7c92e4f4 esp=0007fde0 ebp=0007fdfc iopl=0 nv up ei pl zr na pe nccs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246ntdll!KiFastSystemCallRet:7c92e4f4 c3 ret0:001> ~* reax=00000009 ebx=00000000 ecx=002e3a80 edx=0000c0f1 esi=0007fee8 edi=01014018 eip=7c92e4f4 esp=0007fde0 ebp=0007fdfc iopl=0 nv up ei pl zr na pe nccs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246ntdll!KiFastSystemCallRet:7c92e4f4 c3 reteax=00000009 ebx=00000001 ecx=00000002 edx=00000003 esi=00000004 edi=00000005 eip=7c92120e esp=00c1ffcc ebp=00c1fff4 iopl=0 nv up ei pl zr na pe nccs=001b ss=0023 ds=0023 es=0023 fs=0038 gs=0000 efl=00000246ntdll!DbgBreakPoint:7c92120e cc int 30:001> r eax = 10:001> reax=00000001 ebx=00000001 ecx=00000002 edx=00000003 esi=00000004 edi=00000005 eip=7c92120e esp=00c1ffcc ebp=00c1fff4 iopl=0 nv up ei pl zr na pe nccs=001b ss=0023 ds=0023 es=0023 fs=0038 gs=0000 efl=00000246ntdll!DbgBreakPoint:7c92120e cc int 30:001> ~0 r eax =00:001> reax=00000001 ebx=00000001 ecx=00000002 edx=00000003 esi=00000004 edi=00000005 eip=7c92120e esp=00c1ffcc ebp=00c1fff4 iopl=0 nv up ei pl zr na pe nccs=001b ss=0023 ds=0023 es=0023 fs=0038 gs=0000 efl=00000246ntdll!DbgBreakPoint:7c92120e cc int 30:001> ~* reax=00000000 ebx=00000000 ecx=002e3a80 edx=0000c0f1 esi=0007fee8 edi=01014018 eip=7c92e4f4 esp=0007fde0 ebp=0007fdfc iopl=0 nv up ei pl zr na pe nccs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246ntdll!KiFastSystemCallRet:7c92e4f4 c3 reteax=00000001 ebx=00000001 ecx=00000002 edx=00000003 esi=00000004 edi=00000005 eip=7c92120e esp=00c1ffcc ebp=00c1fff4 iopl=0 nv up ei pl zr na pe nccs=001b ss=0023 ds=0023 es=0023 fs=0038 gs=0000 efl=00000246ntdll!DbgBreakPoint:7c92120e cc int 30:001> ~* r eax=90:001> ~* reax=00000009 ebx=00000000 ecx=002e3a80 edx=0000c0f1 esi=0007fee8 edi=01014018 eip=7c92e4f4 esp=0007fde0 ebp=0007fdfc iopl=0 nv up ei pl zr na pe nccs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246ntdll!KiFastSystemCallRet:7c92e4f4 c3 reteax=00000009 ebx=00000001 ecx=00000002 edx=00000003 esi=00000004 edi=00000005 eip=7c92120e esp=00c1ffcc ebp=00c1fff4 iopl=0 nv up ei pl zr na pe nccs=001b ss=0023 ds=0023 es=0023 fs=0038 gs=0000 efl=00000246ntdll!DbgBreakPoint:7c92120e cc int 3。
调试程序WindbgWinDbg是微软开发的免费源码级图形界面调试工具,可以调试Win32应用程序,服务器应用程序调试和Kernel模式驱动调试。
本文介绍Windbg在调试Win32应用程序时的常用命令。
1、Windbg的启动Windbg可以从命令行启动,启动命令格式为:windbg [-a] [-g] [-h] [-i] [-k [platform port speed]] [-l[text]] [-m] [-p id [-e event]] [-s[pipe]] [-v] [-w name] [-y path][-z crashfile] [filename[.ext] [arguments]]在WindowsXP/2000操作系统下,可以直接双击Windbg图标启动。
2、打开应用程序被调试的应用程序在汇编和连接时应加入调试信息。
汇编时使用参数/Zi;连接程序使用参数/debug。
开始调试一个应用程序时,首先选择File菜单下的Open Executable命令,在对话框中选择可执行文件。
出现Command 窗口,点击工具栏按钮后,在Command 窗口中显示一组信息,再次点击按钮后,在Command 窗口后出现Source窗口。
3、显示存储单元显示存储单元的按钮是。
点击该按钮后,出现对话框在Address Expression编辑框中填入要察看的地址信息。
地址信息有两种常用的输入方式:(1)指定内存单元地址例如:在Address Expression 中填入0x0040103f,点击按钮OK后出现指定地址开始的内存单元的内容:其中0x0040103F至0x004010BF是Windbg显示以十六进制表示的单元地址,中间用十六进制表示每个字节,右边用ASClI字符表示每个字节。
(2)通过变量名表示例如:在Address Expression 中填入&b_var1,点击按钮OK后出现b_var1开始的内存单元的内容:其中0x00404000地址是变量b_var1所在的单元。
使⽤Windbg解析dump⽂件WinDbgOllyDbgSoftICE (已经停⽌更新)虽说WinDbg在⽆源码调试⽅⾯确实⽐较困难,但在调试内核⽅⾯却真的有独到之处。
使⽤Windbg解析dump⽂件1 常⽤的Windbg指令①!analyze -v②kP 可以看函数的⼊参③!for_each_frame dv /t 可以看函数中的局部变量④dc , db 产看某⼀内存中的值可以直接接变量名不过可能需要回溯栈⑤!threads 显⽰所有线程⑥~0s , ~1s 进⼊某个线程⑦!frame ProcessA!FunctionA 查看某⼀变量有时需要。
回溯栈⑧!uniqstack 扩展命令显⽰当前进程中所有线程的调⽤堆栈,除开重复的那些。
⑨!teb 扩展以的格式化后的形式显⽰线程环境块(TEB)的信息。
⑩s-sa 和 s-su 命令搜索未指定的 ASCII 和 Unicode 字符串。
这在检查某段内存是否包含可打印字符时有⽤。
dds、dps 和 dqs 命令显⽰给定范围内存的内容。
该内存被假定为符号表中的⼀连串地址。
相应的符号也会被显⽰出来。
命令显⽰给定范围内存的内容,它们是把内存区域转储出来, 并把内存中每个元素都视为⼀个符号对其进⾏解析,dds是四字节视为⼀个符号,dqs是每8字节视为⼀个符号,dps是根据当前处理器架构来选择最合适的长度.kframes 命令设置堆栈回溯显⽰的默认长度。
默认20k, kb, kd, kp, kP, kv (Display Stack Backtrace) k*命令显⽰给定线程的调⽤堆栈,以及其他相关信息。
通常要结合12)使⽤否则显⽰出来的东西很少.reload /i xxx.dll 忽略.pdb ⽂件版本不匹配的情况。
2 Symbol的设置⽅法2.1 将远程的系统函数的PDB⽂件拷贝到本地「D:\mysymbol」⽬录下SRV*D:\mysymbol*/download/symbols2.2 加载设置的符号⽂件.reload可以使⽤菜单中的 Debug -> Modules 查看有没有加载进来第三章实例实例1 如何调查堆被破坏问题。
详解用法详解第30章WinDBG用法WinDBG是个非常强大的调试器,它设计了极其丰富的功能来支持各种调试任务,包括用户态调试、内核态调试、调试转储文件、远程调试等等。
WinDBG具有非常大的灵活性和可扩展性,用来满足各种各样的调试需求,比如用户可以自由定义调试事件的处理方式,编写调试扩展模块来定制和补充WinDBG的调试功能。
尽管WinDBG是个典型的窗口程序,但是它的大多数调试功能还是以手工输入命令的方式来工作的。
目前版本的WinDBG共提供了20多条标准命令,140多条元命令(Meta-commands),和难以计数的大量扩展命令。
学习和灵活使用这些命令是学习WinDBG的关键,也是难点。
上一章我们从设计的角度分析了WinDBG,本章将从使用(用户)的角度介绍WinDBG。
我们先介绍工作空间的概念和用法(第1节),然后介绍命令的分类和不同种类的命令提示符(第2节)。
第3节介绍不同的调试模式,也就是如何与不同特征的调试目标建立调试会话。
第4节介绍上下文的概念和在调试时应该如何切换和控制上下文。
第5节介绍调试事件和如何定制调试事件的处理方式。
从第6节到第9节我们将分别介绍如何在WinDBG中完成典型的调试操作,比如控制调试目标(第6节)、设置断点(第7节)、观察栈(第8节)以及如何观察和修改数据(第9节)。
30.1 工作空间WinDBG使用工作空间(Workspace)来描述和存储一个调试项目的属性、参数、以及调试器设置等信息。
其功能类似于集成开发环境的项目文件。
分类30.1.1分类WinDBG定义了两种工作空间,一种称为缺省的工作空间(Default Workspace),另一种称为命名的工作空间(Named Workspace)。
当没有明确使用某个命名的工作空间时,WinDBG总是使用缺省的工作空间,因此缺省的工作空间也叫隐含的(implicit)工作空间,命名的工作空间也叫显式的(explicit)工作空间。
如何手工抓取dump文件在生产环境下进行故障诊断时,为了不终止正在运行的服务或应用程序,有两种方式可以对正在运行的服务或应用程序的进程进行分析和调试。
首先一种比较直观简洁的方式就是用Wi nDbg等调试器直接attac h到需要调试的进程,调试完毕之后再det ach即可。
但是这种方式有个缺点就是执行debug ger命令时必须先b reak这个进程,执行完deb ug命令之后又得赶紧F5让他继续运行,因为被你br eak住的时候意味着整个进程也已经被你挂起。
另外也经常会由于FirstChan ce Ex cetpi on而自动break,你得时刻留意避免长时间bre ak整个进程。
所以这样的调试方式对时间是个很大的考验,往往没有充裕的时间来做仔细分析。
另一种方式则是在出现问题的时候,比如CP U持续长时间100%,内存突然暴涨等非正常情况下,通过对服务进程sna pshot抓取一个d ump文件,完成du mp之后先deatc h,让进程继续运行。
然后用wi ndbg等工具来分析这个抓取到的dump文件。
那么如何在不终止进程的情况下抓取dump文件呢?D ebugg ing T oolsfor W indow s 里提供了一个非常好的工具,a dplus.vbs。
从名字可以看出,实际上是一个v b脚本,只是对cdb调试器作的一个包装脚本。
其路径与De buggi ng To ols f or Wi ndows的安装路径相同,使用的方法也很简单,如下所示:adplu s.vbs -han g -p1234-o d:\dump其中-hang指明使用ha ng模式,亦即在进程运行过程中附加上去s napsh ot抓取一个dump文件,完成之后det ach。
WinDbg 命令(主题分组)原作:Robert Kuster 写于2007年11月。
版权归属于原作者。
翻译:不死怨灵1)内置帮助命令9)例外、事件与事故分析17)变量信息常用Windbg 命令(清空屏幕,……)10)加载模块与映像信息18)内存调试会话(附加,分离……)11)进程相关信息19)操作内存范围表达式与命令12)线程相关信息20)内存:堆调试器标记语言(DML )13)断点21)应用程序验证工具主扩展14)步入与步过(F10,F11)22)记录扩展(logexts.dll )符号15)调用栈源16)寄存器返回顶部.formats.formats 表达式显示数字格式=求一个数值表达式或符号的值,并用多种数值格式表达它(16进制、10进制、8进制、2进制、时间……)例1:.formats 5例2:.formats poi(nLocal1)==.formats @@($!nLocal1).cls 清空屏幕.lastevent显示最近一次发生的例外或事件(为什么调试器要等待?).effmach.effmach .effmach ..effmach #.effmach x86|amd64|ia64|ebc转储有效机器(x86,amd64,...):使用目标电脑本身的处理器模式使用执行最近事件代码的处理器模式使用x86,amd64,ia64或ebc 处理器模式该设置影响许多调试器的功能:->这些处理器的辗转开解器用于栈跟踪->这些处理器的寄存器是激活的.time显示时间(系统启动、进程启动、内核时间、用户时间)dy[b|d]...w=字(2字节)W=字(2字节)+ASCIId=双字(4字节)c=双字(4字节)+ASCIIq=四字(8字节)f=浮点(单精度——4字节)D=浮点(双精度——8字节)b=二进制+字节d=二进制+双字e*e[b|w|d|q|f|D]地址值e[a|u|za|zu]地址"字符串"编辑内存b=字节w=字(2字节)d=双字(4字节)q=四字(8字节)f=浮点(单精度——4字节)D=浮点(双精度——8字节)a=ASCII字符串za=ASCII字符串(NULL结尾)u=Unicode字符串zu=Unicode字符串(NULL结尾)ds,dS ds[/c#][地址]dS[/c#][地址]转储字符串结构(结构!不是无间隔的字符序列)s=字符串或ASCII字符串S=Unicode字符串d*s dds[/c#][地址]dqs[/c#][地址]显示字和符号(地址处的内存被认定为符号表中的一系列地址)dds=双字(4字节)dqs=四字(8字节)dd*,dq*,dp*dd*dq*dp*d*ad*ud*p显示引用内存=显示指定地址处的指针,解引用它并显示多种格式结果位中的内存第二个字符决定使用的指针大小dd*->使用32位指针dq*->使用64位指针dp*->标准大小:32位或64为,取决于CPU的结构第三个字符决定如何显示解引用内存d*a->以ASCII字符形式显示解引用内存d*u->以Unicode字符形式显示解引用内存d*p->双字或四字显示解引用内存,取决于CPU结构如果值与已知符号匹配,则同时显示对应符号dl dl[b]地址最大计数大小显示链接单(LIST_ENTRY或SINGLE_LIST_ENTRY)b=倒叙转储(按照BLinks而非FLinks)地址=列表的起始地址最大计数=转储最多#元素大小=每个元素的大小使用!list为列表中的每个元素执行命令版权所有©Robert Kuster 。
Windbg调试命令详解(4)5. 内存命令这一节里面,我们学习如何查看内存信息。
内存是存储数据、代码的地方,通过内存查看命令可以分析很多问题。
相关命令可以分为:内存查看命令和内存统计命令。
内存统计命令用来分析内存的使用状况。
5.1 查看内存有非常丰富的内存查看命令,它们被统一为d*格式,如下所示:▪d[类型] [地址范围]d代表Display,类型包括:字符、字符串、双字等。
具体来说,d*命令共有这几种:d、da、db、dc、dd、dD、df、dp、dq、du、dw、dW、dyb、dyd、ds、dS。
解释如下:内存类型基本类型:▪dw = 双字节WORD格式;▪dd = 4字节DWORD格式;▪dq = 8字节格式;▪df = 4字节单精度浮点数格式;▪dD =8字节双精度浮点数格式;▪dp = 指针大小格式,32位系统下4字节,64位系统下为8字节。
基本字符串:▪da = ASCII字符串格式;▪du = UNICODE字符串格式;▪db =字节 + ASCII字符串;▪dW = 双字节WORD + ASCII字符串;▪dc = 4字节DWORD + ASCII字符串。
高级字符串:▪ds = ANSI_STRING类型字符串格式;▪dS = UNICODE_STRING类型字符串格式。
二进制 + 基本类型:▪byb = 二进制 + 字节;▪byd = 二进制 + DWORD值如果读者对此感觉不明白,特别是组合模式究竟是何种情形?看下例应能清楚。
下例将同一个ASCII字符串,分别以ASCII字符串、Unicode字符串以及组合模式等共五种方式显示:此系列命令还有一些可加利用的开关选项,介绍如下:/c 列数:指定列数。
默认情况下,列数等于16除以列长,如dd 命令的默认列数即为4列(=16/4)。
例:▪dd /c 8此命令每列显示8个DWORD数,即32字节内容。
/p:此选项用来显示物理内存信息,只能用于内核模式中。
windbg常用命令
Windbg是微软开发的一款全功能调试器,它为开发人员提供了许多有用的调试功能。
Windbg可以针对 Windows台的应用程序和驱动程序进行高级调试,并且可以支持多种调试模式,具有非常强大的调试功能。
Windbg拥有众多的命令,其中一些命令特别的常用,在日常调试中经常用到。
下面我们就来介绍一些Windbg中特别常用的命令。
首先,为了能够便捷地使用Windbg,我们可以使用命令“.快捷键”,使用这个命令可以查看所有可以使用的快捷键,能明显提高Windbg的调试效率。
其次,Windbg拥有一些非常有用的查看命令,如“dt”(使用这个命令可以查看一个结构体的字段),“.foreach”使用此命令可以遍历一个范围内的所有地址),“dV”查看当前进程的环境变量)。
使用这些命令可以查看内存地址中的数据,从而更好地分析调试程序。
另外,Windbg还支持设置断点,可以使用“bp”命令设置断点。
它允许开发人员在一个程序的任意位置设置断点,用来暂停或者终止程序的执行。
同时,还有一些断点命令,如“ba”(数据断点),“bu”(更改标志断点),“bm”(内存断点)等,可以让你更好地控制调试过程。
此外,Windbg还支持“.ecxr”命令,使用这个命令可以重建程序的栈帧,从而比较清楚地查看程序的执行情况。
最后,Windbg也支持“!analyze”(分析命令),使用这个命令
可以进行系统崩溃或者崩溃栈的分析,从而快速定位程序崩溃的位置,方便开发人员对程序进行修复。
总之,Windbg拥有众多有用的调试功能和命令,以上介绍的这
些命令在调试中是非常常用的,希望上述介绍可以帮助大家更好地利用Windbg。