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