学习使用dotnet-dump工具分析.net内存转储文件(3)
dotnet-dump工具中使用clrthreads、threads、dso命令可以查看不同线程的堆栈内托管对象,其中clrthreads命令支持查看正在运行的托管线程列表,threads命令支持切换线程,dso命令(dumpstackobjects命令的缩写)能够显示当前线程的堆栈边界内所有托管对象。
以前一篇文章中的dump文件为例,输入clrthreads命令,可以显示线程总数量、后台线程数量、死线程数量及线程明细。输入dso命令,可以看到当前线程的OSID及堆栈中的对象信息(对象地址、对象类型等)。输入“threads -t osid值“命令切换线程(也可以输入“threads DBG值”切换 ),然后输入dso查看切换后的堆栈内对象信息,对于感兴趣的对象,可以输入“dumpobj 对象地址”查看对象详细信息。
clrthread命令返回的结果中的线程状态列(state)是一串数字,可以使用“threadstate 状态值”命令查看状态含义。
同样配合使用clrthreads、threads、clrstack可以查看指定线程的托管代码的堆栈跟踪。如下图所示,切换到线程0,然后查看堆栈,接着切换到线程0x4970查看堆栈。
以dump开头的命令有不少,之前学习过dumpheap、dumpobj、dso(dumpstackobjects),除此之外MSDN中介绍使用dumpassembly命令显示有关程序集的详细信息,但实际使用时如果没有带参数,则直接提示“Invalid Assembly”,可能是程序集地址无效,也可能是程序集未加载或已卸载,此时可以使用dumpdomain命令列出所有 AppDomain 的程序集的信息,其中就有程序集的地址信息,再使用“dumpassembly 程序集地址”即可查看程序集的信息了。
dumpconcurrentdictionary、dumpconcurrentqueue、dumparray命令用于查看并发字典、并发队列及数组类型的数据,使用上述命令前需要用dumpheap -mt 或者dumpheap -type列出对象清单,然后找感兴趣的对象查看详情。
参考文献:
[1]https://learn.microsoft.com/zh-cn/dotnet/core/diagnostics/dotnet-dump
[2]https://www.nuget.org/packages/dotnet-dump