双机调试和windbg的命令

2023-05-16

各位大牛以及和我一样还是菜鸟的朋友们,大家好,今天在调试驱动程序时,由于要做双机调试,所以顺便再论坛发给以后需要的朋友,相对网上其他教程我的这个
算是比较详细了,因为我是看了网上很多相关文章,他们多多少少都还是存在一些问题,可能导致我们无法正常调试。
我通过结合自己的实践,做个教程叫大家,Windebug双机调试是任何做驱动的程序员都必须会的。。。。。。。。。。
废话不多说,直接来教程:

(1)
1.配置VMware(windows XP)   >>>>>为VMware工作站添加串口

添加完毕,然后在设置时把I/O模式勾了,如果添加完毕没有出来如图右边的选项(虚拟机禁用了什么什么的)我们可以在编辑--->首选项---->设备

2.修改boot.ini文件完成配置

如果找不到就设置下查看文件加属性显示受保护的文件。

直接打开C:\boot.ini(如果看不见的同学需要在文件夹选项中打开显示隐藏文件),然后在文件末尾另起一行添加如下启动参数:

multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional Debug" /fastdetect /debugport=COM1 /baudrate=115200

3.配置宿主机windbg

在开始里面找到我们安装的Windebug图标,创建桌面快捷方式,鼠标右键,选择属性。


在目标后面 空格添加 -b -k com:pipe,port=\\.\pipe\com_1,baud=115200,pipe(记住打空格)。

5.下载调试所需符号

打开windbg
现在已经是完事具备,只欠符号.接下来点击 File – Symbol File Path…,填入 SRV*D:\symbol*http://msdl.microsoft.com/download/symbols 后,选中reload.单击OK(如果是平时调试您自己的程序,或者存有本地 Symbol,这里也可填写本地符号文件路径).

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

#重要说明

(1) windbg命令分为标准命令元命令扩展命令

     标准命令提供最基本的调试功能,不区分大小写。如:bp  g  dt  dv  k等

     元命令提供标准命令没有提供的功能,也内建在调试引擎中,以.开头。如.sympath  .reload等

     扩展命令用于扩展某一方面的调试功能,实现在动态加载的扩展模块中,以!开头。如!analyze等

(2) 进入调试状态时,直接回车可重复执行上一条命令;按上下方向键可以浏览和选择以前输入过的命令

(3) 神奇的Tab键,进行命令补全;ESC清除当前命令输入框中的文本

(4) 使用;作为分隔符,可以在同一行输入多条命令

(5) 上图红色框中的“0:000”。0当前调试会话的进程号000调试会话的线程号

(6) 当命令提示符显示*BUSY*时,即使命令输入框可以输入命令,但输入的命令不会立即被执行,要等windbg空闲时才能执行。

     可使用Ctrl + Break来终止一个长时间未完成的命令

(7) 一次可以执行多条命令,命令间用分号;分隔 【:bp main;bp `view.cpp:120`】,一次打2个断点

(8) 为了保证windbg流畅运行,在调试时,尽量不要开启Watch、Locals、Registers、Call Stack、Processes and Threads窗口,直接用command来获取信息

#启动调试

windbg -I  // 将windbg设置成默认调试器

windbg "notepad.exe" arguments  // 使用windbg启动调试notepad.exe

windbg -p 4200  // 将windbg附加到一个正在运行的pid为4200的进程上

windbg -pn "notepad.exe"  // 将windbg附加到一个正在运行的名为notepad.exe的进程上

windbg –z "c:\mydumpfile.dmp" // 调试mydumpfile.dmp文件

.opendump "c:\mydumpfile.dmp"  // 调试mydumpfile.dmp文件

.attach 0n4220  // 4220为十进制pid,使用该命令附加调试时,必须先存在一个调试会话

.detach   // 分离调试

.restart  // 重启并调试

.kill  // 强制结束当前调试

q  // 结束当前调试会话,回到基础工作空间,并结束调试进程

qd  // 结束当前调试会话,回到基础工作空间,但不结束调试进程

#获取帮助

?   // 打印出所有标准命令

.help  // 打印出所有元命令

.hh  // 打开windbg的chm帮助文件

.hh bp  // 打开windbg的chm帮助文件bp命令介绍页

command /?  // 打印命令command具体参数用法

#注释符

*  // 注释整行

$$ // 注释(遇到分号结束)

#配置调试环境

:如果被调试的模块(无论移动到本机的何处)是用本机代码编译产生的,都不需要进行符号和源代码的路径设置

.sympath   // 查看当前符号查找路径

.sympath c:\symbols   // 将符号查找路径设为:c:\symbols

.sympath+ c:\symbols  // 将c:\symbols添加到符号查找路径集合中

.symfix // 将符号查找路径设为:SRV*WinDbg安装目录\Sym*http://msdl.microsoft.com/download/symbols

.symfix f:\symbols // 将符号查找路径设为:SRV*f:\symbols*http://msdl.microsoft.com/download/symbols

.symfix+ f:\symbols  // 将SRV*f:\symbols*http://msdl.microsoft.com/download/symbols添加到符号查找路径集合中

.srcpath // 查看当前源文件查找路径

.srcpath f:\src // 将源文件查找路径设为:f:\src   注:必须勾选上菜单“Debug”-“Source Mode”;另外pdb须与exe、dll等执行模块匹配上

.srcpath+ f:\src  // 将f:\src添加到源文件查找路径集合中

.exepath // 查看可执行文件查找路径

.exepath f:\bin // 将可执行文件查找路径设为:f:\bin

.exepath+ f:\bin  // 将f:\bin添加到可执行文件查找路径集合中

#系统信息

vertarget // os信息

!cpuid  // cpu信息

#wow64模式  【x64版windbg调试win32程序】

.effmach  // 查看当前调试mode:x86、x64等

.load wow64exts  // [!load wow64exts] 加载wow64exts.dll模块  注:!sw就是wow64exts中的命令

.unload wow64exts  // [!unload wow64exts] 卸载wow64exts.dll模块

!sw  // [!wow64exts.sw]  在多个mode:x86、x64上进行循环切换  注:如果win32程序在x64的mode下,会看到地址是64位的

!k  // [!wow64exts.k]  打印32位、64位堆栈

!k 5 // [!wow64exts.k 5]  打印32位、64位堆栈,栈帧个数为5

!info // [!wow64exts.info]  输出wow64相关的PEB、TEB和TLS基本信息

!r // [!wow64exts.r]  输出处理器当前上下文信息

!r dumpTest!main  // [!wow64exts.r dumpTest!main]  输出main函数地址的上下文信息

#符号加载与查看

除了使用ld和.reload命令直接加载符号文件,某些使用符号的命令也可以触发调试器来加载符号,如:栈回溯命令(k*)和反汇编命令(u)等。

值得说明的是,windbg缺省使用的是懒惰式符号加载策略,当它收到模块加载事件时,它通常是不会加载符号的,符号状态显示为deferred(延迟加载)。

.symopt // 显示当前所有符号选项

.symopt+ flags // 添加符号选项

.symopt- flags // 删除符号选项

!sym noisy   // 激活详细符号加载(noisy symbol loading)显示

!sym quiet   // 禁止详细符号加载显示

ld * // 为所有模块加载符号

ld kernel32 // 加载kernel32.dll的符号

.reload // 为所有已加载模块载入符号信息

.reload /i // 重新加载不匹配符号的模块【dmp文件没有对应的pdb时使用

.reload /i TGame.exe // 重新加载不匹配符号的TGame.exe

.reload /f /v // f:强制立即模式(不允许延迟载入)  v:详细模式

.reload /f @"c:\windows\System32\verifier.dll" // 为指定模块加载符号信息

.reload /f TGame.exe // 为TGame.exe加载符号信息

.reload /u TGame.exe // 卸载TGame.exe及其载符号信息

.chain  // 显示已经加载进来的模块

x *! // 列出所有模块对应的符号信息

lm // 列出所有模块(加载和未加载)对应的符号信息

lmv // 列出所有模块(加载和未加载)对应的符号信息

lmvm ntdll  // 查看ntdll.dll的详细信息(注意exe、dll等都不要带后缀名)

x ConsoleTest!* // 列出ConsoleTest模块中的所有符号

x ConsoleTest!add* // 列出ConsoleTest模块中的所有add开头的符号

x /t /v ConsoleTest!* // 带数据类型、符号类型和大小信息,列出ConsoleTest模块中的所有符号

x kernel32!*LoadLib* // 列出kernel32模块中所有含LoadLib字样的符号

#进程

|   // 列出调试进程

|*  // 列出调试进程

|N  // 参看序数为N的调试进程

|Ns // 切换序数为N的进程为当前调试进程

#线程

~   // 列出线程

~*  // 所有线程

~* k // 所有线程堆栈信息

~* r // 所有线程寄存器信息

~.  // 查看当前线程

~0s // 查看主线程

~# // 查看导致当前事件或异常的线程

~N  // 查看序数为N的线程

~~[n]  // 查看线程ID为n的线程

~Ns   // 切换序数为N的线程为当前调试线程

~N f  // 冻结序数为N的线程

~N u // 解冻序数为N的线程

~N n  // Suspend序数为N的线程

~N m // Resume序数为N的线程

~* e !gle // 显示所有线程最后的一个错误信息  e后可以为任意windbg命令

.ttime  // 查看当前线程时间信息

!runaway  //显示当前进程的所有线程时间信息

 

#断点

bl   // 列出所有断点

bc * // 清除所有断点

bc 1 // 清除1号断点

bc 1 2 5  // 清除1号、2号、5号断点

be *  // 启用所有断点

be 1  // 启用1号断点

be 1 2 5 // 启用1号、2号、5号断点

bd *  // 禁用所有断点

bd 1  // 禁用1号断点

bd 1 2 5 // 禁用1号、2号、5号断点

bp 7c801b00  // 在7c801b00地址处放置一个断点

bp `ConsoleTest.cpp:36`  // 在ConsoleTest.cpp的36行处放置一个断点

bp main // 在main函数的起始处放置一个断点

bp CSecondLoader::CSecondLoader  // 在CSecondLoader的构造函数处放置一个断点

bp TestCommon! CTest::add  // 在TestCommon.dll的Test.cpp文件的CTest::add()函数起始处放置一个断点

bp `ConsoleTest.cpp:40` ".if (poi(pVar)>5) {}; {g}" // ".if (Condition) {Optional Commands}; {g}"    条件断点 pVar指针指向的值>5,执行空语句;),断住  否则继续执行

bp `ConsoleTest.cpp:40` "j (poi(pVar)>5) ' ''g'" // "j (Condition) 'Optional Commands'; 'g'"    j为条件表示式:条件断点 pVar指针指向的值>5,执行空语句;,断住  否则继续执行

注:Condition表达式语法默认的是MASM表达式语法。使用复杂C++表达式时我们需要用@@c++()将表达式包围住;如:"j @@c++(*pVar>5) ' '; 'g'"

---------------------------------

x表示的一个地址
hi(x) 高16 bits
low(x) 低16 bits
by(x) 返回第一个byte
wo(x) 返回第一个word
dwo(x) 返回第一个dword
qwo(x) 返回第一个4 word(Quad-word)
poi(x) 返回第一个指针所指向的值

---------------------------------

bp `ConsoleTest.cpp:40` "j @eax = 0xa3 ''; 'g'" // j为条件表示式:条件断点 寄存器eax的值为0xa3时断住

bp kernel32!CreateFileA  // 在系统API的CreateFileA函数处放置一个断点

bp kernel32!CreateFileA ".echo;.printf\"CreateFileA(%ma,%p,%p), ret=\",poi(esp+4),dwo(esp+8),dwo(esp+c);gu;.printf\"%N\",eax;.echo;g" // 不断住进程情况下,打印所有的CreateFileA调用

bp advapi32!RegOpenKeyExA ".echo;.printf\"RegOpenKeyExW(%p,\\\"%ma\\\",%N,%N,%p) returned: \", dwo(esp+4), poi(esp+8), dwo(esp+c), dwo(esp+10), dwo(esp+14);gu;.printf\"%N\",eax;.echo;g"  // 不断住进程情况下,打印所有的RegOpenKeyExA调用(打开注册表键值)

bu  // 保存断点,其用法和bp一样

bm add_*  // 匹配add_开头的函数,并在这些函数起始处都打上断点

ba w4 0x0483dfe0 // 当对0483dfe0地址写操作时停下,前面要带上0x,否则会报错

                          // ba [r|w|e] [Size] Addr      [r=read/write, w=write, e=execute], Size=[1|2|4 bytes]

#调试执行控制

g  // Go(F5)

gH // 执行gH命令强制让调试器返回已经处理了这个异常。【Go with Exception Handled

     // 系统收到这个回复后会停止分发异常(因为调试器声称已经处理了异常),恢复调试目标继续执行,

     //  但由于异常条件仍在,所以还会产生异常,于是再次分发,WinDBG再次中断到命令模式。

gN // 【Go with Exception Not Handled

     // 执行gN命令强制让调试器返回没有处理了这个异常,那么系统会进一步分发该异常,

     // 如果没有其他调试器也不处理,最后系统会弹出程序终止对话框。

gu  // 执行到当前函数完成时停下Go Up

Ctrl+Break  // 暂停正在运行的程序

p    // 单步执行(F10)  【Step

p 2 // 2为步进数目

pc   // 执行到下一个函数调用处停下Step to  Next Call

pa 7c801b0b // 执行到7c801b0b地址处停下  【Step to Adress

t     // Step into(F11) 【Trace

tc    // 执行到下一个进入点处停下 【Trace to Next Call

ta 7c801b12  // 执行到7c801b12地址处停下 【Trace to Adress

# 查看句柄

!handle  // 查看所有句柄的ID

!handle 000007f8 1  // 查看ID为000007f8的句柄的类型

!handle 000007f8 4  // 查看ID为000007f8的句柄的名称

!handle 0 5  // 查看所有句柄的类型和名称

 

# 查看变量

===  0n(十进制)  0x(十六进制)  0t(8进制)  0y(2进制)    可以使用n [8|10|16]命令来修改数值进制表示方式(输入n可查看当前进制,默认为16进制)===

-- VC6.0的Link选项需要将/pdbtype:sept改为/pdbtype:con, 否则生成的pdb文件中将不包含如自定义结构体,类等信息

dt nRet  // 查看局部变量nRet的类型与值(函数参数变量请用dv命令)

dt myApp!g_app // 表示显示myApp进程里全局变量g_app的内存布局(注:vc6见上述说明)

dt WindbgTest!CTest // 查看模块WindbgTest的CTest的内存布局(注:vc6见上述说明)

dt WindbgTest!CTest 0x0041f8d4  // 将0x0041f8d4地址处内容按照模块WindbgTest的CTest的内存布局来解析(注:vc6见上述说明)

Windbg默认会用寄存器ECX里面的值作为this指针地址,其实这样是有时候是错误的。
有些C++编译器在做代码优化之后会把 this指针放在其他寄存器里面,比如ESI。
所以在调试的时候还需要读一下汇编代码来确定this 在哪个寄存器里面。
比如我们看到 MOV EAX, dword ptr [ESI + 0x48h](获取当前对象内存偏移为0x48h处的4字节成员变量),就可以判断ESI 是this 指针。
这时可以通过如下命令打印this的内存结构:dt -b 模块名!类名 @esi

dt this // 查看this指针的类型及成员变量(注:vc6见上述说明)

dt -b this  // 查看this指针的类型及成员变量,如果某一成员变量为结构体,则把其结构成员也一一打印出来

dt _PEB @$PEB // 查看PEB(process's environment block)内存结构

?? this->m_nPen  // 查看成员变量的值(注:vc6见上述说明)

?? this // 查看this指针中的成员变量(注:vc6见上述说明)

? nCount // 显示局部变量nCount的地址(前面4198608为10进制表示地址,004010d0为16进制表示地址) 形如:Evaluate expression: 4198608 = 004010d0

? HeapTest!CTest::Add  // 显示HeapTest模块中CTest类中的Add函数地址

dv   // 显示当前函数内所有局部变量,函数参数的值

dv n*  // 显示当前函数内n开头的所有局部变量,函数参数的值

dv nCount // 查看局部变量nCount的值

dv a // 查看函数参数变量a的值

dv /t /i /V /a|/n|/z

/***************************************** 

更加详细地显示当前函数内所有局部变量,函数参数信息
i = type (local, global, parameter)
t = data type
V = memory address or register location
-----------------------
a = sort by Addr, n = sort by name, z = sort by size

*****************************************/

x  // 用法和dv命令一致,显示当前函数内所有局部变量,函数参数的地址与值

#调用堆栈

k  // 显示当前调用堆栈

kn // 带栈编号显示当前调用堆栈

kb  // 打印出前3个函数参数的当前调用堆栈

02a9ffec 00000000 01e511f9 0174c570 00000000 kernel32!BaseThreadStart+0x37
----------------------------------------------
kernel32!BaseThreadStart+0x37 当前函数kernel32!BaseThreadStart执行的指令地址。
01e511f9 0174c570 00000000  参数相关的数值【从左到右 -- 参数1  参数2:offset为sizeof(参数1)  参数3:offset为sizeof(参数1)+sizeof(参数2)  ...】。注:如果是成员函数,this指针通过ecx或其他寄存器来传递
02a9ffec 00000000是 ebp 和 上层函数返回地址。

======================================================

Windows 7 Ultimate Service Pack 1 [Build 6.1.7601]
CPU: Intel(R) Core(TM) i3-2100 CPU @ 3.10GHz
《Game》 20.15.1112 6EF76A43E6B1DD58907F3E066506E918
----------------------------------------
Type: EXCEPTION_ACCESS_VIOLATION//非法地址访问异常
Error: Read address 0x00074685//读取0x00074685地址出错(该地址对应的内存页,进程无读取权限)
Address: 64DCAF68//崩溃发生的指令地址

CallStack:

//0x64D90000为模块MSVCR90.dll的基地址,3AF68为崩溃指令在模块中的偏移值,(0492B5D0,00074685,0000000C,00462482)为参数信息
0x64D90000[3AF68] MSVCR90.dll: (0492B5D0,00074685,0000000C,00462482)
0X00400000[11158A] tgame.exe: (0492B5D0,00074685,00000000,00000000)

kb 5 // 只显示最上的5层调用堆栈

kv   // 在kb的基础上增加了函数调用约定等信息

kp  // 显示每一层函数调用的完整参数,包括参数类型、名字、取值(必须是完整符号的情况下,private symbols);注意:若程序被优化,这些值不一定对

kd  // 打印堆栈的地址

.frame // 显示当前栈帧

.frame n // 设置编号n的栈帧为当前栈帧(n为16进制数)

.frame /r n // 设置编号n的栈帧为当前栈帧(n为16进制数) 并显示寄存器变量

!uniqstack // 显示所有线程的调用堆栈

#查看汇编

u .  // 反汇编当前ip寄存器地址的后8条指令

u $ip  // 反汇编当前ip寄存器地址的后8条指令

ub .  // 反汇编当前ip寄存器地址的前8条指令

ub $ip  // 反汇编当前ip寄存器地址的前8条指令

u main+0x29 L30 // 反汇编main+0x29地址的后30条指令

u  // 反编译下8条指令

uf CTest::add  // 反汇编CTest类的add函数

uf /c main  // 反汇编main函数,通过/c可以查看main函数中的函数调用(call)都有哪些

ub 000c135d L20  // 查看地址为000c135d指令前的20条指令内容

 

#寄存器

r // 显示所有寄存器信息及发生core所在的指令

r eax, edx // 显示eax,edx寄存器信息

r eax=5, edx=6  // 对寄存器eax赋值为5,edx赋值为6

#内存

!address 7ffd8000  // 查看7ffd8000地址处内存页属性

dd /c 5 7c801e02  // 从7c801e02内存处开始以dword为单位显示内存(宽度为:5)【默认显示128字节长度的内容】

dd /c 5 7c801e02 L8  // 从7c801e02内存处开始以dword为单位显示内存(宽度为:5)【显示8个dword】

da /c 100 7c80ff03  // 从7c80ff03内存处开始显示Ascii字符串(宽度为:100)

du /c 100 7c8022f5  // 从7c8022f5内存处开始显示Unicode字符串(宽度为:100)

/*****************************************

d[a| u| b| w| W| d| c| q| f| D] [/c 列数] [地址]

a = ascii chars
u = Unicode chars
b = byte + ascii
w = word (2b)
W = word (2b) + ascii
d = dword (4b)
c = dword (4b) + ascii
q = qword (8b)
f = floating point (single precision - 4b)
D = floating point (double precision - 8b)

*****************************************/

dyb /c 3 7c801e02  // 从7c801e02内存处开始,显示byte及二进制(宽度为:3)

/*****************************************

dy[b | d] ..   // b = binary+byte     d = binary+dword

*****************************************/

s -w 522e0000 L0x100  0x1212 0x2212 0x1234 // 表示在起始地址522e0000之后的0x100个单位内搜索0x1212 0x2212 0x1234系列的起始地址

s -u 522e0000 527d1000 "web"  //表示在522e0000 和527d1000之间搜索Unicode 字符串”web”

ea 0x445634 "abc"  // 表示在0x445634地址写入Ascii字符串abc, 不包含结束符0

eza 0x445634 "abc"  // 表示在0x445634地址写入Ascii字符串abc, 包含结束符0

eu 0x445634 "abc"  // 表示在0x445634地址写入Unicode字符串abc, 不包含结束符0

ezu 0x445634 "abc"  // 表示在0x445634地址写入Unicode字符串abc, 包含结束符0

ed nCounter 80  // 将变量nCounter的值修改为80(注:80为10进制还是16进制,还是其他,取决于当前进制)

#查看堆(Heap)

!heap -s  // 显示进程堆的个数(每一项是一个堆,也就是_HEAP结构指针,对应的API是HeapCreate)

Heap Flags Reserv Commit Virt Free List UCR Virt Lock Fast
(k) (k) (k) (k) length blocks cont. heap
-----------------------------------------------------------------------------
00140000 50000062 1024 12 12 1 1 1 0 0 L
00240000 50001062 64 24 24 15 1 1 0 0 L
00250000 50008060 64 12 12 10 1 1 0 0
00380000 50001063 64 12 12 4 2 1 0 bad
-----------------------------------------------------------------------------

dt _HEAP 00140000  // 选取一个堆的地址,打印该堆的内存结构

ntdll!_HEAP
+0x000 Entry : _HEAP_ENTRY
+0x008 Signature : 0xeeffeeff
+0x00c Flags : 0x50000062
+0x010 ForceFlags : 0x40000060
+0x014 VirtualMemoryThreshold : 0xfe00
+0x018 SegmentReserve : 0x100000
+0x01c SegmentCommit : 0x2000
+0x020 DeCommitFreeBlockThreshold : 0x200
+0x024 DeCommitTotalFreeThreshold : 0x2000
+0x028 TotalFreeSize : 0xaf
+0x02c MaximumAllocationSize : 0x7ffdefff
+0x030 ProcessHeapsListIndex : 1
+0x032 HeaderValidateLength : 0x608
+0x034 HeaderValidateCopy : (null)
+0x038 NextAvailableTagIndex : 0
+0x03a MaximumTagIndex : 0
+0x03c TagEntries : (null)
+0x040 UCRSegments : (null)
+0x044 UnusedUnCommittedRanges : 0x00140598 _HEAP_UNCOMMMTTED_RANGE
+0x048 AlignRound : 0x17
+0x04c AlignMask : 0xfffffff8
+0x050 VirtualAllocdBlocks : _LIST_ENTRY [ 0x140050 - 0x140050 ]
+0x058 Segments : [64] 0x00140640 _HEAP_SEGMENT
+0x158 u : __unnamed
+0x168 u2 : __unnamed
+0x16a AllocatorBackTraceIndex : 0
+0x16c NonDedicatedListLength : 1
+0x170 LargeBlocksIndex : (null)
+0x174 PseudoTagEntries : (null)
+0x178 FreeLists : [128] _LIST_ENTRY [ 0x142a90 - 0x142a90 ]
+0x578 LockVariable : 0x00140608 _HEAP_LOCK
+0x57c CommitRoutine : (null)
+0x580 FrontEndHeap : 0x00140688 Void
+0x584 FrontHeapLockCount : 0
+0x586 FrontEndHeapType : 0x1 ''
+0x587 LastSegmentIndex : 0 ''

!heap -a 00140000 // 选取一个堆的地址,打印该堆的信息,比上面打印内存命令更详细直观

Index Address Name Debugging options enabled
1: 00140000
Segment at 00140000 to 00240000 (00003000 bytes committed)
Flags: 50000062
ForceFlags: 40000060
Granularity: 8 bytes
Segment Reserve: 00100000
Segment Commit: 00002000
DeCommit Block Thres: 00000200
DeCommit Total Thres: 00002000
Total Free Size: 000000af
Max. Allocation Size: 7ffdefff
Lock Variable at: 00140608
Next TagIndex: 0000
Maximum TagIndex: 0000
Tag Entries: 00000000
PsuedoTag Entries: 00000000
Virtual Alloc List: 00140050
UCR FreeList: 00140598
FreeList Usage: 00000000 00000000 00000000 00000000
FreeList[ 00 ] at 00140178: 00142a90 . 00142a90
00142a88: 00050 . 00578 [14] - free
Segment00 at 00140640:
Flags: 00000000
Base: 00140000
First Entry: 00140680
Last Entry: 00240000
Total Pages: 00000100
Total UnCommit: 000000fd
Largest UnCommit:000fd000
UnCommitted Ranges: (1)
00143000: 000fd000

Heap entries for Segment00 in Heap 00140000
00140000: 00000 . 00640 [01] - busy (640)
00140640: 00640 . 00040 [01] - busy (40)
00140680: 00040 . 01818 [07] - busy (1800), tail fill - unable to read heap entry extra at 00141e90
00141e98: 01818 . 00040 [07] - busy (22), tail fill - unable to read heap entry extra at 00141ed0
00141ed8: 00040 . 00050 [07] - busy (36), tail fill - unable to read heap entry extra at 00141f20
00141f28: 00050 . 002f0 [07] - busy (2d8), tail fill - unable to read heap entry extra at 00142210
00142218: 002f0 . 00330 [07] - busy (314), tail fill - unable to read heap entry extra at 00142540
00142548: 00330 . 00330 [07] - busy (314), tail fill - unable to read heap entry extra at 00142870
00142878: 00330 . 00040 [07] - busy (24), tail fill - unable to read heap entry extra at 001428b0
001428b8: 00040 . 00028 [07] - busy (10), tail fill - unable to read heap entry extra at 001428d8
001428e0: 00028 . 00058 [07] - busy (40), tail fill - unable to read heap entry extra at 00142930
00142938: 00058 . 00058 [07] - busy (40), tail fill - unable to read heap entry extra at 00142988
00142990: 00058 . 00060 [07] - busy (44), tail fill - unable to read heap entry extra at 001429e8
001429f0: 00060 . 00020 [07] - busy (1), tail fill - unable to read heap entry extra at 00142a08
00142a10: 00020 . 00028 [07] - busy (10), tail fill - unable to read heap entry extra at 00142a30
00142a38: 00028 . 00050 [07] - busy (36), tail fill - unable to read heap entry extra at 00142a80
00142a88: 00050 . 00578 [14] free fill
00143000: 000fd000 - uncommitted bytes.

#虚拟内存

!vadump  // 查看虚拟内存布局 

#设置事件发生时windbg行为

sx // 显示windbg遇到每个异常和事件时的行为

sxr // 将所有异常和事件过滤器的状态重设为默认值

sxe  ld // 当加载模块时,立即中断(Break)到调试器中(第一次处理机会)

sxe ud // 当卸载模块时,windbg不会在第一次处理机会时中断(虽然会显示信息)。如果其他错误处理器没有处理掉该异常,执行会停止下来并中断(Break)到windbg中(第二次处理机会)

sxn et // 当线程退出时,windbg会打印出一条消息

sxi ct // 当线程创建时,windbg不中断也不打印消息

#dump输出

 .dump /ma "d:\mydmpfile.dmp" // 将当前调试进程输出Dump文件

#其他元命令

.tlist  // 显示所有进程

.cls  // 清除屏幕

.logopen c:\1.log   // 将command内容输出到c:\1.log文件中

#其他扩展命令

!analyze -v  // 详细显示当前异常信息

!peb // 格式化输出PEB信息(process's environment block)

 

PEB at 7efde000
InheritedAddressSpace: No
ReadImageFileExecOptions: No
BeingDebugged: No
ImageBaseAddress: 00f20000
Ldr 76fa0200
Ldr.Initialized: Yes
Ldr.InInitializationOrderModuleList: 003a4d78 . 003e4a00
Ldr.InLoadOrderModuleList: 003a4ce8 . 003e49f0
Ldr.InMemoryOrderModuleList: 003a4cf0 . 003e49f8
Base TimeStamp Module
f20000 54772f74 Nov 27 22:04:36 2014 C:\Program Files (x86)\Citrix\ICA Client\wfcrun32.exe
76ea0000 5684255b Dec 31 02:41:31 2015 C:\windows\SysWOW64\ntdll.dll
74790000 568425ff Dec 31 02:44:15 2015 C:\windows\syswow64\kernel32.dll
75b00000 56842600 Dec 31 02:44:16 2015 C:\windows\syswow64\KERNELBASE.dll
... ...
71d40000 55a5cad6 Jul 15 10:52:06 2015 C:\windows\System32\msxml6.dll
71d20000 4a5bdb38 Jul 14 09:11:20 2009 C:\windows\System32\bcrypt.dll
71ce0000 5600ce51 Sep 22 11:43:13 2015 C:\windows\SysWOW64\bcryptprimitives.dll
SubSystemData: 00000000
ProcessHeap: 003a0000
ProcessParameters: 003a2188
CurrentDirectory: 'C:\windows\system32\'
WindowTitle: '"C:\Program Files (x86)\Citrix\ICA Client\wfcrun32.exe"'
ImageFile: 'C:\Program Files (x86)\Citrix\ICA Client\wfcrun32.exe'
CommandLine: '"C:\Program Files (x86)\Citrix\ICA Client\wfcrun32.exe" -Embedding'
DllPath: 'C:\Program Files (x86)\Citrix\ICA Client;C:\windows\system32;C:\windows\system;C:\windows;
Environment: 003a07f0
=::=::\
ALLUSERSPROFILE=C:\ProgramData
APPDATA=C:\Users\kekec\AppData\Roaming
CommonProgramFiles=C:\Program Files (x86)\Common Files
CommonProgramFiles(x86)=C:\Program Files (x86)\Common Files
CommonProgramW6432=C:\Program Files\Common Files
COMPUTERNAME=KEKEC-PC1
ComSpec=C:\windows\system32\cmd.exe
DXSDK_DIR=D:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\
FP_NO_HOST_CHECK=NO
HOMEDRIVE=C:
HOMEPATH=\Users\kekec
include=D:\Program Files (x86)\Microsoft Visual Studio\VC98\atl\include;D:\Program Files (x86)\Microsoft Visual Studio\VC98\mfc\include;
lib=D:\Program Files (x86)\Microsoft Visual Studio\VC98\mfc\lib;D:\Program Files (x86)\Microsoft Visual Studio\VC98\lib
LOCALAPPDATA=C:\Users\kekec\AppData\Local
LOGONSERVER=\\GM-HEIJI
MSDevDir=D:\Program Files (x86)\Microsoft Visual Studio\Common\MSDev98
NUMBER_OF_PROCESSORS=8
OS=Windows_NT
Path=C:\ProgramData\Oracle\Java\javapath;C:\windows\system32;C:\windows;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
PROCESSOR_ARCHITECTURE=x86
PROCESSOR_ARCHITEW6432=AMD64
PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 60 Stepping 3, GenuineIntel
PROCESSOR_LEVEL=6
PROCESSOR_REVISION=3c03
ProgramData=C:\ProgramData
ProgramFiles=C:\Program Files (x86)
ProgramFiles(x86)=C:\Program Files (x86)
ProgramW6432=C:\Program Files
PSModulePath=C:\windows\system32\WindowsPowerShell\v1.0\Modules\
PUBLIC=C:\Users\Public
SESSIONNAME=Console
SystemDrive=C:
SystemRoot=C:\windows
TEMP=C:\Users\kekec\AppData\Local\Temp
TMP=C:\Users\kekec\AppData\Local\Temp
USERDNSDOMAIN=TENCENT.COM
USERDOMAIN=TENCENT
USERNAME=kekec
USERPROFILE=C:\Users\kekec
VS120COMNTOOLS=D:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\
VS80COMNTOOLS=D:\Program Files (x86)\Microsoft Visual Studio 8\Common7\Tools\
VS90COMNTOOLS=d:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\Tools\
windir=C:\windows

 

!gle  // 打印当前线程最近的错误信息LastError

!gle -all  // 打印所有线程的最近的错误信息

!error  897// 显示错误码为897的详细描述信息

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

双机调试和windbg的命令 的相关文章

  • 怎么在vscode上面使用git仓库管理工具

    如何在vscdoe中使用git仓库管理工具 为什么我们要用vscode上面操作git仓库管理工具呢 xff1f 因为我们安装了git后 xff0c 会在命令窗口 xff08 就是windows 43 r gt 输入cmd运行的命令窗口 xf
  • VMware安装linux镜像

    安装Linux详细教程 一 VMware安装linux镜像二 创建快照三 克隆镜像 一 VMware安装linux镜像 点击创建虚拟机 2 有两种安装方式 xff0c 典型有很多东西会自动配置好所以我们选择自定义安装 3 选择安装版本 4
  • 实施CMMI时必须解决的认识问题

    在基于 CMMI 实施软件过程改善时 xff0c 有些根本的思想认识问题解决不了 xff0c 往往会使实施的周期比较长 xff0c 效果不好 xff0c 甚至导致过程改善的失败或中止 软件企业的高层领导 企业的过程改进主管 项目经理及一般的
  • 使用 OpenCV与 HAAR 级联算法进行人脸检测和人脸识别

    AI人脸识别是一种从数字图像或视频帧中识别或验证人脸的技术 人类可以毫不费力地快速识别面部 这对我们来说是一项轻松的任务 xff0c 但对计算机来说却是一项艰巨的任务 因为存在各种复杂性 xff0c 例如低分辨率 遮挡 光照变化等 这些因素
  • Ubuntu 18.04扩展磁盘容量到单独分区

    vmvare下 扩展原有磁盘容量时 xff0c 一般情况下需要删除分区重新划分 xff0c 这样就删除了原有的数据 xff0c 为了保留原有数据 xff0c 把扩展的分区额外划分到一个分区 xff0c 自动挂载到一个目录 xff0c 减少风
  • Ubuntu 15.10使用vnc工具开启远程桌面

    1 在Ubuntu上首先需要安装vnc4server apt get install vnc4server 2 第一次执行vncserver的时候需要为客户端连接设置8位的密码 3 打开服务后 xff0c 根据客户端号连接 也可以指定客户端
  • n模块管理多个版本的node.js

    安装 homebrew方式 brew span class token function install span n github方式 span class token function curl span L https git io
  • 11.23总结

    今天除了上数学课和心里考试全部坐在电脑前刷题 启航oj 4 xff0c 菜鸟杯 oj3 因为我是一个入门比较晚的菜鸟所以我唯一能做的就是挤出所有的时间全部用来补别人已经明白的东西 今天主要的收获就是 字符串三个函数的应用 字符与二维数组的混
  • 11.24总结

    1 jsua oj 0 打算明后两天集中搞菜鸟杯题组 2 启航oj 5 今天上午满课下午都在敲代码 这真的是大一吗 有了昨天的刷题经验今天自己刷题快多了就是被那些提交语言折磨到窒息白白浪费了好多时间 主要学习了蛇形矩阵的算法根据题意判断从那
  • 11.25总结

    博客被吞了一遍 我吐了想一点前上床睡觉有这么难吗 虽然今天一天满课但是我还是学到了很多知识 今天启航oj 1 菜鸟杯补题 4 写了一篇关于党的19届六中全会的文章 主要学习了汉诺塔的数据变化原理 xff0c 递归 加深我对递归的理解 xff
  • 12.1日总结

    刷题数0 真的是挺无语的因为感觉指针链表栈的知识混成一团了 xff0c 只能各种百度 xff0c 最后发现书本里面的才是最香的 虽然没有做出来栈的题目但是大体的基本概念已经理清了 先从链表讲起 一说到结构体 xff0c 指针 xff0c 链
  • 12.2总结(纵使结局不如意,放弃实属下下签。)

    刷题数三 xff0c 菜鸟杯补题2 xff1b 启航栈1 xff1b 终于知道这两天为什么这么痛苦了 我一度难受到窒息因为我看的是链栈我看了两天硬是对这些题目无从下手 xff0c 因为他吧指针 结构体 链表 栈一起结合起来使用 我去搜各种博
  • 12.3日总结 单调栈

    今天就刷了两个题 xff0c 尝试了一个题 xff0c 主要看了单调栈 xff0c 单调栈分为两种一中是栈中元素从栈顶到栈顶呈从小到大的排序的栈这样的栈称为单调递增栈 另一种从栈顶到栈底数据从大到小称为单调递减栈 单调栈的应用一般可以用来求
  • 12.5总结

    开始着手于项目的编写 其实所有事情都是开头难 xff0c 项目也一样 xff0c 第一次写项目必定要接触到很多新东西 xff0c 今天主要遇到了两个新的头文件里面包含了写项目必备的几个函数 stdlib h里面定义了五种类型 一些宏和通用工
  • 搬运! Windbg调试命令详解

    转载注明 gt gt 作者 xff1a 张佩 原文 xff1a http www yiiyee cn Blog 1 概述 用户成功安装微软Windows调试工具集后 xff0c 能够在安装目录下发现四个调试器程序 xff0c 分别是 xff
  • 使用光盘安装Microsoft media foundation

    一 准备 系统 xff1a widnows server 2012 R2 Datacenter 准备文件 xff1a 安装光盘或iso 双击iso文件 xff0c windows server会自动虚拟出一个光驱 假如光驱或虚拟光驱的盘符为
  • 如何用MindManager将导图导出为HTML5交互式导图?

    最新版MindManager 2017中新增了一种导出方式 HTML5交互式导图 xff0c 相信很多人在了解MindManager 2017新功能的时候就已经知道了 本文 xff0c 小编将给大家演示 xff0c 如何将做好的思维导图导出
  • 判断两个IP是否属于同一个子网

    例如 xff1a 192 168 1 1 24和192 168 1 33 27 192 168 1 1 24的ip地址为192 168 1 1 xff0c 子网掩码为255 255 255 0 转化为二进制 xff1a IP地址为 xff1
  • 记录一次K8s-Flannel插件的坑

    版本 xff1a K8s版本1 17 6 部署方式 xff1a ansible 43 kubeadm部署 架构 xff1a master1 43 node2 43 registry私有仓库 执行kubectl apply f kube fl
  • opencv imencode和imdecode使用,用于网络传输图片

    这是C 43 43 版本的 程序首先读入一个图片 然后encode xff0c 之后把encode后的内容写入文件 xff08 实际应用可以发送到网络 xff09 第二步 xff0c 从文件读取encode的内容 然后解码decode 转换

随机推荐

  • 云计算&云存储

    云计算技术 云计算技术主要分为以下几个部分 xff1a 编程模式海量数据分布存储技术海量数据管理技术虚拟化技术云计算平台管理技术 云计算应用 云计算应用主要包含以下六个部分 xff1a 密码优先检查安全问题加密方法管理密码双重认证备份 云存
  • 用C语言实现字符串反转函数strrev的经典方法

    字符串反转函数strrev不是C语言标准库函数 xff0c 很多C语言编译器并没有提供对它的支持 xff0c 比如你在Linux下输入Shell命令man 3 strlen xff0c 屏幕上会显示 xff0c STRLEN 3 Linux
  • OSPFv3报文格式与作用分析

    OSPFv3报头 xff1a 实际抓包 xff1a 具体内容 xff1a Version xff1a 3 Type xff1a 报文类型 1 Hello 2 DD 3 LSR 4 LSU 5 LSAck Packet length xff1
  • IPv6基础知识

    概述 xff1a IPv6 xff08 Internet Protocol Version 6 xff09 是网络层协议的第二代标准协议 xff0c 也被称为IPng xff08 IP Next Generation xff09 它是Int
  • BGP在数据中心的应用1——数据中心网络介绍

    注 xff1a 本文根据 BGP in the Datacenter 整理 xff0c 有兴趣和英文阅读能力的朋友可以直接看原文 xff1a https www oreilly com library view bgp in the 978
  • 意法nucleo-h723zg原理图,stm32h723zg原理图

    兄弟们 xff1a 我之前一直都在找这个图 xff0c 废了老大的劲才找到 xff0c 并且找到就马上给大家分享了 xff0c 希望能顺手点个赞 Introduction xff1a The STM32H7 Nucleo 144 board
  • MAX30102学习笔记(上)

    MAX30102学习笔记 xff08 上 xff09 一 小简介 max30102是一个将脉搏血氧仪的心率检测仪融为一体的一个传感器模块 简单的说就是一个可以采集心率和血氧数据的小模块 xff0c 使用者只需将其佩戴于手指 xff0c 手腕
  • java---爬虫

    提示 xff1a 以下代码仅能用于学习使用 xff0c 部分代码已脱敏 前言 为了帮助女朋友完成作业从没接触过爬虫的我被赶鸭子上架 xff0c 硬着头皮code 索性是不负所托 xff0c 虽然代码很垃圾但是所期望的功能也完整实现 下面进入
  • 【详细教程】zmq c++ cmake 实现发布订阅

    前言 ZMQ是一种性能极高的通信框架 xff0c 吞吐量大延迟低 xff0c 使用简便 本文手把手讲解如何用c 43 43 实现zmq的订阅和发布 xff0c 编译环境我们选择了cmake 环境准备 zmq 可以参考我写的这篇 xff1a
  • 职场分身术:从给答案到做引导

    在学校读书的时候 xff0c 偶尔作业不会做 xff0c 很可能会问同学 xff0c 他很可能会把答案直接给出来 但是 xff0c 如果去问老师 xff0c 他很可能给一些启发和引导 这正是对不同帮助类型最初的感受 进入职场之后 xff0c
  • DNS及mDNS 名字(名称)压缩规则

    Author Shawn Lee WebSite http blog csdn net twelvelee Email xff1a xiaofengoffice 64 163 com Update Time 2011年8月24日星期三 Sh
  • 、做最好的自己--【我的2014】

    花开花落 xff0c 云卷云舒 不平凡的 2014年也接近尾声了 xff0c 留给我们的是无尽的感慨和反思 回首这一年 xff0c 自己在慢慢的成长 经过这一年 xff0c 我渐渐意识到专业技术的重要性 于是 xff0c 在2014年10月
  • 最新版22.04Linux系统下配置Go语言开发环境

    Linux系统下配置Go语言环境过程 1 先进入root超级用户2 查看Linux系统的版本 xff1a 3 根据系统版本找到对应的Go语言安装包4 切换到 usr local 目录下 xff0c 下载Go语言安装包 xff0c 并解压缩
  • VDO虚拟数据优化及RAID

    VDO虚拟数据优化 Virtual Data Optimize是一种通过压缩或删除存储设备上的数据来优化存储空间的技术 xff0c 简称VDO xff0c 中文名叫虚拟数据优化 第1步 xff1a 创建一个全新的VDO卷 vdo creat
  • Ubuntu20.4系统下安装kvm并创建虚拟机

    Ubuntu20 4系统下安装kvm并创建虚拟机 一 安装Ubuntu20 4系统二 在Ubuntu20 4系统下安装KVM三 kvm虚拟机及其磁盘映像文件 xff08 CentOS 7 9 xff09 制作 一 安装Ubuntu20 4系
  • 回首16,展望17。

    我是一名在校的大学生 xff0c 时光流逝转眼就到了该毕业的时间了 xff0c 大学的四年对于我们来说却只有三年 学校的压缩式教学让我们三年学完了四年的东西 xff0c 无论你学的怎样都要出去找工作 现在的我也将面临这样的抉择了 大学是轻松
  • 树莓派4B装安卓11系统 可超频到2GHZ 运行流畅

    树莓派4B安装安卓系统需要下载安卓镜像和烧写器 xff0c 安卓镜像我目前知道的有两种 xff0c 一种是基于LineageOS的魔改版 xff0c 另外一种是omni官方制作的 下面我把地址贴出 xff0c 大家根据需要下载 树莓派安卓下
  • 在12864液晶上显示任何图像

    一 xff0c 所需软件 xff1a Any to Icon 作用 xff1a 用来把随意彩图 xff0c 转化成黑白2色图 windows画图软件 作用 xff1a 用来编辑DIY2色图片 xff0c 并可改属性改成128X64像素 字模
  • 关于openstack错误-cirros镜像-无法启动

    链接 xff1a https www cnblogs com learn2teach p 12456635 html
  • 双机调试和windbg的命令

    各位大牛以及和我一样还是菜鸟的朋友们 xff0c 大家好 xff0c 今天在调试驱动程序时 xff0c 由于要做双机调试 xff0c 所以顺便再论坛发给以后需要的朋友 xff0c 相对网上其他教程我的这个 算是比较详细了 xff0c 因为我