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。
WinDbg运算符,是Windows操作系统上的一个调试器工具,常用于分析和诊断应用程序的错误和问题。
WinDbg提供了丰富的命令和运算符,用于在调试会话中执行各种操作。
以下是一些常见的WinDbg 运算符的解释:1. `+` 和 `-` 运算符:在WinDbg中,可以使用加号和减号运算符来进行指针的偏移计算。
例如,`eax+4`表示将`eax`寄存器的值加上4,得到一个新的内存地址。
2. `*` 运算符:用于从内存地址中读取数据。
例如,`*eax`表示从`eax`寄存器指向的内存地址读取数据。
3. `&` 运算符:用于获取变量的地址。
例如,`&myVar`表示获取`myVar`变量的内存地址。
4. `->` 运算符:用于从指向结构体的指针中访问成员。
例如,`myStructPtr->member`表示从指针`myStructPtr`指向的结构体中访问成员`member`。
5. `<<` 和 `>>` 运算符:位移运算符,用于对二进制数据进行位移操作。
例如,`value << 2`表示将`value`左移2位。
6. `=` 运算符:在WinDbg中,可以使用等号运算符来设置变量的值。
例如,`eax = 0`将`eax`寄存器的值设置为0。
7. `!` 运算符:用于执行调试器命令。
例如,`!analyze -v`表示执行一个分析命令,并提供更详细的信息。
这些运算符在WinDbg中用于执行不同的操作,帮助调试人员分析内存、寄存器和程序状态。
在使用这些运算符时,需要理解它们的功能和语法,以便在调试过程中更准确地分析问题。
Windows调试⼯具⼊门3(WinDbg基本调试操作)Windows调试⼯具⼊门3—基本调试操作Windows调试⼯具⼊门-3基本调试操作基本调试操作⼀、调试器命令窗⼝1、简介使⽤Windows调试⼯具进⾏调试,⼤部分和调试器之间的交互都是通过调试器命令窗⼝来进⾏的。
命令的输⼊、输出都是在调试器命令窗⼝中显⽰出来。
对WinDbg来说,调试器命令窗⼝是名为”Command”的窗⼝;对于KD、CDB和NTSD来说,整个命令⾏窗⼝就是调试器命令窗⼝。
这⾥主要介绍WinDbg中的调试器命令窗⼝。
⼀般来说WinDbg运⾏之后都会打开⼀个标题为Command的⼦窗⼝,在没有调试⽬标的时候,这个窗⼝是不能接受输⼊输出的,这时WinDbg处于静⽌模式,只有在打开调试⽬标之后,才能够使⽤它和调试器交互。
窗⼝分为三个部分:位于上部的⾯积最⼤的是命令输出窗⼝。
所有的命令输出、⽬标程序的调试信息输出等等都会在⾥⾯显⽰出来。
上⼀篇中介绍的调试器⽇志中记录的就是显⽰在这⾥的内容。
下半部分左边是提⽰符窗⼝。
这⾥通过提⽰符能够快速知道调试器⽬前的状态。
上图中0:000>,冒号前的数字表⽰当前的进程号,同时调试多个进程时,每个进程都会被指派⼀个进程号;冒号后的000表⽰线程号。
进⾏内核调试时,如果是单处理器系统,提⽰符是kd>的形式;如果是多处理器系统,则是0: kd>的形式,前⾯的0表⽰处理器号。
提⽰符还可能是*BUSY*这样的字符串,以表⽰调试器正忙。
也可以通过命令来⾃定义提⽰符。
下半部分右边是命令输⼊窗⼝。
需要执⾏的命令就在这⾥输⼊。
调试器命令窗⼝中输⼊命令时可以使⽤⼀些快捷操作:上下⽅向键可以查找先前的命令。
ESC键⽤于清除当前⾏的命令。
TAB键⽤于⾃动补完命令。
例如⼀些符号可以只输⼊⼀部分,然后通过按下TAB⼀次或多次来找到需要的符号。
⿏标右键点击命令窗⼝,可以将剪贴板中的内容粘贴到命令输⼊框中。
直接按下ENTER键重复上⼀条命令。
windb 调试原理(一)windbg 调试什么是 windbgWindbg是一款强大的Windows调试工具,原本是微软内部使用的调试工具,后来逐渐开放给外部开发人员使用。
它能够对Windows操作系统及各种应用程序进行调试,是开发人员进行低级别调试的首选工具。
windbg 的工作原理1.首先,windbg通过运行attach或者以调试进程的方式加载到目标程序中。
2.然后,windbg通过与目标程序进行交互,获取和修改目标程序的内存状态、寄存器状态和调用堆栈等信息。
3.接着,windbg根据调试者的指示,执行调试命令,如设置断点、步进执行等。
4.最后,windbg将执行结果返回给调试者,并展示在调试界面上。
windbg 的常用命令以下是windbg的一些常用命令:1.g:继续运行,当程序遇到断点时,使用该命令可以继续程序的执行。
2.bp:设置断点,可以根据地址、函数名、源文件名和行号等设置断点。
3.bl:列出所有断点。
4.p:查看变量的值。
5.r:查看和修改寄存器的值。
6.kb:查看调用堆栈。
windbg 的高级用法除了基本的调试功能,windbg还提供了一些高级用法,以帮助开发人员更深入地分析和解决问题。
1.内存和对象分析:windbg可以通过!address命令查看内存的使用情况,通过!heap命令查看堆内存的使用情况,还可以使用!dumpheap命令分析对象的内存布局。
2.异常和崩溃分析:windbg可以从Dump文件中加载崩溃信息,使用!analyze -v命令分析崩溃的原因,可以帮助开发人员找到崩溃的根源。
3.调试扩展:windbg支持调试扩展,使用扩展可以扩展windbg的功能。
以Python为例子,可以使用Python脚本编写调试扩展,从而实现更复杂的调试功能。
总结windbg是一款功能强大的调试工具,可以帮助开发人员更方便地找到和解决问题。
它具有丰富的调试命令和高级用法,可以满足开发人员的各种需求。
Windbg 使用简明指南2014/2/26 19:55:45第一章1.1. 环境配置准备_NT_DEBUGGER_EXTENSION_PATH=C:\WINDOWS\\Frame work\v2.0.50727 _NT_SYMBOL_PATH=SRV*c:\Symbols*/download/s ymbolsPath add: C:\WINDOWS\\Framework\v2.0.50727 C:\Program Files\Debugging Tools for Windows (x86)1.2 .Net CLR 知识第二章序号 命令 1. .chain 1. 解释常用命令显示有哪些调试扩展。
.load DLLName 加载调试扩展。
DLLName 要是全路径名,包括”.dll” !DLLName.load 1. .loadby DLLNam 加载调试扩展。
DLLName 是短文件名,不包括”.dll”。
e ModuleName ModuleName 是调试进程中的模块名,表示通过它所在的 路径查找 DLLName。
1. .unload DLLNam 卸载调试扩展。
e !DLLName.unloa d 1. .setdll DLLNam 设置缺省的调试扩展。
e !DLLName.setdl l 1. ![ext.]address 显示 VM 的分配状况 1. ![sos.]vmmap 1. ![uext.]vadump 输出虚拟地址映射信息 1. ![uext.]vprot 显示给出的虚拟地址所在内存的映射信息。
address 1. .logfle 1. .logopen .logappend 1. .logclose 1. dt 1. ![ntsdexts.]he 察看 Win32 堆的运行状况。
ap 0 0 1. ![ext.]dlls 1. ![sos.]threads 可以列出所有的托管线程,并在栈顶给出异常对象的地 址。
WinDBG调试命令⼤全转载收藏于:#调试命令窗⼝+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#使⽤gflags.exe⼯具(在windbg所在⽬录下),让某个进程启动时,拉取windbg进⾏调试如下截图:当名称为captcomm.exe的进程启动时,拉起windbg调试也可通过脚本命令来实现:// 运⾏captcomm.exe时,启动windbg调试reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\captcomm.exe" /v Debugger /t REG_SZ /d "C:\Program Files\Debugging Tools for Windows (x86)\windbg.exe" /f// 解除启动时windbg调试reg delete"HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\captcomm.exe" /f// 64位系统上,也可以设置以下注册表节点reg add "HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\captcomm.exe" /v Debugger /t REG_SZ /d "C:\Program Files\Debugging Tools for Windows (x86)\windbg.exe" /f// 解除启动时windbg调试reg delete"HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\captcomm.exe" /f// 测试发现:HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options和HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Image File Execution Options指向的是同⼀数据,修改其中任何⼀安全软件可能会禁⽌修改注册表的Image File Execution项:-- 对于360安全卫⼠,在“设置”中去掉“开启360⾃我保护”的勾选来关闭-- 对于McAfee,需要禁⽌IPS(Intrusion Prevension Systems)。
Windbg⽤法详解⼯作空间WinDBG的⼯作空间中保存了以下⼏种信息调试会话状态: 包括断点,打开的源⽂件,⽤户定义的别名(alias)等。
调试器设置:包括符号⽂件路径,可执⾏映像⽂件路径,源⽂件路径,⽤I+/I-命令设置的源⽂件选项,⽇志⽂件设置,通过启动内核调试对话框设置内核调试连接设置,最近⼀次打开⽂件对话框所使⽤的路径和输出设置。
WinDBG图形界⾯信息:包括WinDBG窗⼝的标题,是否⾃动打开反汇编窗⼝,默认字体,WinDBGM窗⼝在桌⾯的位置,打开的WinDBGM⼦窗⼝,每个打开窗⼝的详细信息等。
WinDBGM默认使⽤注册表来保存⼯作空间设置,其路径为:HKEY_CURRENT_USER\Software\Microsoft\WinDBG\Workspaces命令概览WinDBG包括3类命令:标准命令、元命令、扩展命令。
标准命令提供适⽤于所有调试⽬标的基本调试功能,都是WinDBGM调试器内部实现的,不需要加载任何扩展模块。
标准命令第⼀个字符不分⼤⼩写,第⼆个字符可能区分。
元命令是内建在调试器引擎或者WinDBG程序⽂件中的。
所有元命令都以⼀个点.开始,所以也被称为点命令。
扩展命令是是现在动态加载的扩展模块中的。
扩展命令,以叹号!开始,叹号在英⽂中读作bang,因此扩展命令也被称为Bang Command扩展命令的完整格式是![扩展模块名].<扩展命令名> [参数]扩展模块名可以省略。
输⼊和执⾏命令要点可以在同⼀⾏输⼊多条命令,⽤分号;作为分隔符直接按回车键可以重复上⼀条命令。
可以使⽤Ctrl+Break来终⽌⼀个长时间未完成的命令。
如果使⽤KD或者CDB,那么⽤Ctrl+C.按Ctrl+Alt+V热键可以启⽤WinDBGM的详细输出模式,再按⼀次恢复到本来的模式。