WINDBG的详细使用方法

使用虚拟 COM 端口手动设置虚拟机的内核模式调试 - Windows drivers | Microsoft Learn

值得细细阅读qwq

Vmware+windbg搭建双机内核调试环境

环境:虚拟机为win7

  1. 关闭虚拟机,添加硬件向导选择,选择添加串行端口
在这里插入图片描述
  1. 选择“ 使用命名的管道 ”,并单击“ Next >”按钮
    第一个输入框中输入“ \.\pipe\com_1”,表示该虚拟串口将要映射到 Host OS 的管道名称。
    第二个框中选择“该端是服务器”,表示 Guest OS 是被调试的系统
    第三个框中选择“另一端是应用程序”,表示 Host OS 将使用一个调试软件来作为管道的另一端。
    设备状态,勾选“启动时连接”,表示在开启虚拟机操作系统时,与这个虚拟设备(串口),建立连接。单击“ 完成”,按钮
在这里插入图片描述
  1. 启动OS

  2. 修改OS的启动配置文件

    命令行输入

    bcdedit /copy {current} /d "Win7 Debug"

    image-20240721163005298

对这个启动入口,启用内核调试

bcdedit /debug {ad2983ae-3010-11ee-b297-b234ec8321b1} on

这里括号的内容修改为 红框的内容,是启动入口

再输入bcdefit /dbgsettings

image-20240721163145398
  1. 先不要重启OS,先管理员模式打开windbg

    输入指令

    kd -k com:pipe,port=\\.\pipe\com_1,resets=0,reconnect

    或者使用图形化界面

    不过port要设置为\\.\pipe\com_1

  2. 打开OS,然后windbg等着连接内核

image-20240721163314390
  1. 待启动系统后,直接断点即可

    image-20240721165608312

windbg常用指令

调试应用程序之类的

基础指令

.load Psscor4/amd64/amd64/psscor4.dll #加载psscor4
.load SOS/SOS.dll
.sympath #设置符号路径
.cls #清屏
version #查看版本信息
lm #列出加载模块
!help #显示命令帮助
!help EEHeap #显示EEHeap命令帮助
!EEVersion #显示公共语言运行时版本

内存状态

!EEHeap -GC #显示托管堆统计信息
!EEHeap -loader #显示加载程序数据结构统计信息
!DumpHeap -stat #显示垃托管堆各类型统计信息
!DumpHeap -type Free -stat #显示所有碎片类型统计信息
!DumpHeap -type System.String -min 150 -max 200 #显示所有System.String类型 -min -max 字节统计信息
!DumpHeap -min 85000 -stat #显示大对象统计信息
!DumpHeap -mt #选项仅列出与指定的 MethodTable 结构对应的那些对象
!DumpHeap -mt 00000000022245b0 -min 85000 #查看MT 00000000022245b0中大对象
!DumpHeap -stat 023e1000 033db630 #按地址统计
!DumpArray #显示数组对象
!DumpObj (!do) #显示有关指定地址处的对象的信息
!ObjSize #显示指定对象的大小
!DumpStackObjects (!dso) #显示在当前线程内找到的所有托管对象
!GCRoot #显示有关对指定地址处的对象的引用(或根)的信息。
!CLRUsage #显示托管堆统计信息(GC堆大小,提交内存,虚拟内存),psscor4的扩展命令
!DumpMT #显示有关指定地址处的方法表的信息。
!DumpMT -MD #显示有关指定地址处的方法表所有方法的列表。
!address -summary #显示最大可用区域
!vmstat #最大可用区域是 MAXIMUM 列中的最大值

线程调用

!ThreadPool #显示有关托管线程池的信息,包括队列中工作请求的数目、完成端口线程的数目和计时器的数目
!Threads #显示进程中的所有托管线程
!Threads -live #选项显示与活动线程关联的线程
!Threads -pecial #选项显示由 CLR 创建的所有特殊线程
!ThreadState #显示线程的状态。 value 参数为 Threads 报告输出中的 State 字段的值。
~54s 转到54线程
!CLRStack #提供当前托管代码的堆栈跟踪。
!CLRStack -p #选项显示托管函数的参数。
!CLRStack -l #选项显示有关帧中的局部变量的信息。
!DumpStack #显示堆栈跟踪 包括非托管。
!DumpStack -EE #命令仅显示托管函数。
!EEStack #对一个进程中的所有线程运行 DumpStack 命令。
k #显示当前线程的call stack
kb #显示当前线程的call stack
~*kb #显示所有线程的call stack 可以 寻找线程中触发GC的函数(mscorwks!SVR::GCHeap::GarbageCollectGeneration)
!ASPXPages #显示当前处理的HttpContext,psscor4的扩展命令
!SyncBlk #显示同步块

其他

!runaway #显示线程cpu时间
vertarget #查看系统运行时间
!PrintException (!pe) #显示在当前线程上引发的最后一个异常
!address #命令显示某一地址上的页信息
!SaveModule #将加载到内存中指定地址的图像写入指定文件,lm 列出的
!SaveModule 081f0000 #d:\\commandobject.dll
!FinalizeQueue #显示所有已进行终结注册的对象。
!GCHandles #显示有关进程中的垃圾回收器句柄的统计信息。

S #可以搜索内存 在内存中搜索sina.com: s –u 0012ff40 L?8000000 “sina.com”
r #显示寄存器的信息
d #显示内存地址上的值 使用d命令显示esp寄存器指向的内存,默认为byte: d esp
#用dd命令直接指定054efc14地址,第二个d表示用DWORD格式: dd 054efc14
域,程序集,类
!DumpDomain #枚举在指定的 AppDomain 对象地址内加载的每个 Assembly 对象。若在调用 DumpDomain 命令时不提供任何参数,则将列出过程中的所有 AppDomain 对象
!DumpAssembly #显示有关程序集的信息。DumpAssembly 命令将列出多个模块(如果存在)。
!DumpModule  #显示有关指定地址处的模块的信息。 可以使用 DumpDomain 或 DumpAssembly 命令检索模块的地址
!DumpModule [-mt] #选项显示模块中定义的类型和模块所引用的类型
!FindAppDomain #确定指定地址处的对象的应用程序域

!IP2MD <Code address> #显示已 JIT 编译的代码中指定地址处的 MethodDesc 结构。
!DumpMD <MethodDesc address>
!U <MethodDesc address> | <Code address> #显示由方法的 MethodDesc 结构指针或方法体内的代码地址指定的托管方法的反汇编(带有批注)

qwq这只是很少的一部分 还是要多看文档