WINDBG常用命令

作者:Chdon 发布时间: 2025-08-29 阅读量:25 评论数:0

WINDBG配置

Source Path:srv*
			D:\dream\runtime-8.0.13\coreclr\gc 
			D:\dream\runtime-8.0.13\coreclr\vm
Symbol Path:srv*c:\mysymbols*https://msdl.microsoft.com/download/symbols

WINDBG相关命令

命令

描述

来源

备注

示例

.cls

清空界面显示

WINDBG

.chain

显示WINDBG加载的插件

WINDBG

.hh

查看WINDBG命令帮助信息

WINDBG

.hh !dh

.load

加载插件

WINDBG

一般.NET程序运行会自动加载SOS

.reload

重新加载/下载符号文件

WINDBG

~0s

切换到0号线程

WINDBG

~* k

查看所有线程非托管栈

WINDBG

~*e

在所有线程执行自定义命令

WINDBG

~*e !clrstack

!address

查看目标进程内存使用情况

WINDBG

!address -summary

bp

添加断点

WINDBG

bm <code addr>(需经编译后的代码,未经JIT编译无法跳到)

bc

清除断点

WINDBG

bc *

da

以ASCII编码显示内存地址

WINDBG

dd

显示4个字节数据

WINDBG

后接L1(Lxx)可只显示1个字节数据

dq

显示8个字节数据

WINDBG

dp

根据32位/64位程序,显示一个指针的数据。

WINDBG

32位显示4个字节;64位显示8个字节。

dp xxxx L2 其中L2为显示2组指针数据

dt

显示非托管类型结构

WINDBG

dt coreclr!MethodTable XXX XXX为对象地址

du

以Unicode编码显示内存地址

WINDBG

dv

显示当前局部变量

WINDBG

!dlls

显示所有加载模块的基地址、入口点

WINDBG

!dh

显示指定模块的文件头

WINDBG

参数为模块的基地址,可使用!dlllm获取模块基地址

g

被调试程序继续运行

WINDBG

k

显示当前线程非托管堆栈

WINDBG

lm

显示当前加载模块

WINDBG

Microsoft.ML.OnnxRuntime模块对应模块名称为Microsoft_ML_OnnxRuntime

lm v m *CodePages*

p

step

WINDBG

逐过程调试

pc

step to next call

WINDBG

跳到下一个call

pt

step to next ret

WINDBG

跳到下一个ret

poi

对指针进行解引用

WINDBG

poi(XXX)获取该内存地址的值

q

退出(quit)

WINDBG

退出调试,并且关闭被调试的程序

qd

退出并分离(quit and detach)

WINDBG

退出调试,并且分离被调试的程序。不会关闭被调试程序

r

显示所有寄存器信息

WINDBG

rr rax显示rax寄存器信息

sxe ld

在加载指定模块时中断

SX

sxe ld System.Memory

sxd ld

在第二次加载指定模块时中断

SX

t

trace

WINDBG

逐语句(跳入)

tc

trace to next call

WINDBG

跳入到下一个call(会递归找到最后一个call)

tt

trace to next ret

WINDBG

跳入到下一个ret(会递归找到最后一个ret

u

显示该内存地址的后8条指令

WINDBG

Lx指定显示几条指令。L10

ub

显示该内存地址的前8条指令

WINDBG

Lx指定显示几条指令。L10

uf

x

查找非托管对象方法或类型(支持模糊查找)

WINDBG

x notepad.exe!*Save*

SOS相关

命令

描述

来源

备注

示例

!help

帮助

SOS

!help显示全部帮助;!help <command>显示该指令帮助

!help eeheap

!clrstack

显示当前线程托管堆栈

SOS

-l 显示栈中本地变量,-p显示方法传入参数,-i显示变量(字段或数组信息)(可直接显示String等内容)

!cpuid

查看CPU核心频率、核心数等信息

SOS

!bpmd

添加断点

SOS

!bpmd -md <method desc addr>!bpmd ConsoleApp1.exe ConsoleApp1.TestClass.AddName未经JIT的代码也可添加断点。

!dumpdomain

显示应用程序域相关信息

SOS

!dumpassembly

显示程序集信息

SOS

!dumpmodule

显示模块信息

SOS

-mt 附加显示方法表信息

!dumpmt

显示方法表信息

SOS

-md 附加显示方法描述

!dumpmd

显示方法描述

SOS

!dumpclass

显示eeclass信息

SOS

!dumpobj(!do)

显示实例信息

SOS

!dumpvc

显示值类型对象(struct)信息

SOS

!dumpvc <MethodTable address><Adress>

!dumparray(!da)

显示数组

SOS

!dumparray <array object address>;-details显示数组元素详细信息;

!dumpheap

显示托管堆中对象

SOS

!dumpheap -type Person模糊搜索类型、!dumpheap –stat显示堆统计、!dumpheap -mt 000c135d指定类型、!dumpheap XXX YYY显示内存区间内的对象、!dumpheap -strings显示所有字符串对象

!dumpstackobjects(!dso)

显示托管栈对象

SOS

部分变量在!clrstack中不可见,可使用此命令查看

!dumpStackObjects (dso)

显示当前调用栈上的所有托管对象的信息

SOS

!eestack

查看当前线程非托管栈和托管栈

SOS

!eeheap

查看Loader、GC堆数据

SOS

查看GC堆各代区段

!eeheap -gc !eeheap -loader

!fq

查看终结器队列信息

!fq -stat

!gcroot

查看对象引用根

SOS

!gcwhere

查看对象在第几代

!ip2md

根据给定JITTED Code Address,找到对应的MethodDesc

SOS

Given an address in managed JITTED code, IP2MD attempts to find the MethodDesc associated with it.

!name2ee

根据名称找到对应的eeclass

SOS

!name2ee <module name> <method name or type name>

!name2ee ConsoleApp1.exe ConsoleApp1.TestClass.AddName

!objsize

显示对象占用大小

SOS

!objsize 000c135d

!objsize xxx -summary计算实例对象占用空间

!PrintException(!pe)

显示异常具体信息

SOS

!runaway

查看各线程占用时间片总时间

SOS

可排查CPU占用高的问题,查看占用时间片较多的线程,切入后查看线程栈。

!savemodule

将模块代码导出到dll

SOS

!SaveModule <Base address> <Filename>

导出模块后,反编译dll查看对应的代码

!syncblk

显示同步块信息

SOS

!syncblk+同步块索引

!threads(!t)

显示所有托管线程

SOS

可查看线程中的异常信息

!threadpool

显示线程池的基本信息,包括队列中请求的数量、完成端口线程的数量和计时器的数量。

SOS

可查看当前cpu占用

!u

显示该内存地址汇编代码(带有托管信息,相对于u更详细)

SOS

仅显示进行JIT后的代码

SOSEX(仅支持.NET Framework)

需单独下载,并加载。

命令

描述

来源

备注

示例

!sosex.mbp

在源码指定行数打断点

SOSEX

!sosex.mbp <source file name> <line num>

!sosex.mbp 01Program.cs 10

!sosex.mx

搜索包含指定字符的托管类型、字段、方法

SOSEX

!sosex.mx <module name>!*<string>*

!sosex.mx ConsoleApp1!*Test*

!sosex.dlk

查看死锁信息

SOSEX

!sosex.mdt

显示指定类型结构

SOSEX

-r递归显示子成员信息。可指定类型名称参数名称变量名称方法表地址

!sosex.mfrag

显示托管堆FREE块信息

SOSEX

检查托管堆什么对象导致FREE块无法合并

!sosex.strings

在托管堆中搜索指定字符串

SOSEX

可指定几代堆、筛选字符、字符长度


评论