WinDbg(3)实战案例

序言

-64位系统抓64位进程dump,用64位windbg来分析。64位系统抓32位进程dump,用32位windbg来分析

32位任务管理器c:/windows/SysWOW64/taskmgr.exe
64位任务管理器c:/windows/System32/taskmgr.exe 

常用命令

.loadby sos clr

!clrstack 显示调用栈
!clrstack -p 显示调用栈,同时显示参数

使用 !clrstack 观察下托管栈

0021cbe4 0f37f6c2 CshisNet.Client.Common.CommunicationService.CommunicationService.GetCardInfo(Int32, System.String)

 !eeversion 

看下程序的 framework 版本

!running 

命令可以用来显示当前处理器中正在运行的线程。

~*e !clrstack

遍历每个线程, 依次输出它们的托管调用栈.

!threads

查看所有的托管线程

!eeheap -gc 

查看下托管堆的占用大小

!dso

显示堆上所有对象

 

Ctrl+Break命令中止输出

问题

在非托管范围的代码异常 clr 是接不住的?

引用类型在堆上,值类型在栈上。不过这种说法很是笼统不易理解,其实简单来说值类型就是保存实际的值,引用类型就是指向一个存有值的一个地址。

值类型可以保存在栈上吗?

其他

想对 docker 中的 .NET 程序内存 进行监控,我一直都是极力推荐 procdump

32位的进程,一定要用32位资源管理器(C:\Windows\SysWOW64\taskmgr.exe)导出dump,不然会显示32位架构,64位转储,windbg分析不了

 

资料

https://learn.microsoft.com/zh-cn/windows-hardware/drivers/debuggercmds/commands

https://www.cnblogs.com/huangxincheng

posted @ 2024-06-16 13:42  ~沐风  阅读(2)  评论(0编辑  收藏  举报