问题标签 [clrmd]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 使用 ClrMD 加载转储文件时“加载 DAC 失败:CreateDacInstance 失败”
我正在尝试微软的新库ClrMD来分析故障转储和实时进程。
我遵循 .NET Framework博客文章中的示例(使用附加的 .cs 文件)。
我尝试运行该示例来分析一个 .dmp 文件,该文件取自与该示例在同一台机器上运行的程序。
尝试创建运行时对象时,使用以下代码:
抛出此异常:
有任何想法吗?
c# - 有没有办法用 ClrMD 获取局部变量的值(如 sosex !mdv)?
将 windbg 与 SOS 和 SOSEX 一起使用,我可以使用 !mdv 命令“显示托管框架的参数和本地变量”。有没有办法使用ClrMD以编程方式实现相同的结果?
c# - 如何使用 ClrMD 正确处理非原始 ClrInstanceField 值?
我有一些非常大的托管进程的内存转储,我试图从中获取大量统计信息,并且能够呈现堆上相当深的对象图的交互式视图。!do <address>
想一想与在带有 SOS 的 WinDbg 中设置类似的东西prefer_dml 1
,您可以在其中不断单击属性并查看它们的值,只是在一个更友好的 UI 中比较许多对象。
我发现Microsoft.Diagnostics.Runtime (ClrMD) 特别适合这项任务,但我很难处理数组字段,而且我对对象字段有点困惑,我已经做了一些工作更好的。
数组:如果我将一个地址直接从堆中取出的数组作为目标并使用ClrType.GetArrayLength
并且ClrType.GetArrayElementValue
一切正常,但是一旦我挖掘另一个对象上的字段,我不确定我从ClrInstanceField.GetValue
什么时候得到什么值ClrInstanceField.ElementType
是ClrElementType.SZArray
(我还没有Array
在我的对象图中遇到过挖掘,但我也想处理它)。
编辑:我刚刚决定使用ClrType
forSystem.UInt64
来取消引用数组字段(parent address + offset of the array field
用于计算存储数组指针的地址),然后我可以像从 EnumerateObjects 获得它一样使用它。我现在对一些不支持该ArrayComponentType
属性的数组有一些困难。我还没有使用结构数组进行测试,所以我也想知道这是否是内联结构的 C 风格分配,就像它一样,int[]
或者它是否是指向堆上结构的指针数组。Guid[]
是我遇到问题的类型之一ArrayComponentType
。
对象:已修复(逻辑错误)
使用ClrInstanceField
具有 aType
的aClrElementType.Object
我会得到更好的结果,但仍需要更多。首先,在调用后GetFieldValue
我得到一个ulong
地址(?),我可以ClrInstanceField.Type.Fields
很好地使用它,所以我可以看到嵌套对象的字段名称和值。也就是说,我必须考虑多态性,所以我尝试ClrHeap.GetObjectType
在同一个地址上使用它,它要么返回 NULL,要么返回完全不正确的东西。该地址在我的第一个用例中有效,但在第二个用例中无效,这似乎很奇怪。
字符串:已修复(找到解决方法)
因为我的实际项目已经使用带 SOS 的 DbgEng,所以我有一种不同的方法可以通过地址轻松获取字符串的值,但是尝试使用ClrInstanceField.GetFieldValue
成功返回字符串似乎很奇怪,但是完全不准确的结果(一堆奇怪的字符)。也许我做错了?
编辑:我已经从我的原始代码中提取了现在在 LINQPad 中运行的抽象。在这里发帖有点长,但这里都是要点。所有的复制/粘贴/重构仍然有点混乱,我将进一步清理它,可能在解决这些问题后在 CodePlex 或 GitHub 上发布最终源代码。
代码库相当大且特定于项目,但如果绝对有必要,我可以提取一个样本集。也就是说,对 ClrMD 对象的所有访问都相当简单。我从 SOS 命令中获取初始地址,例如!dumpheap -stat
(对根对象工作正常),然后我使用ClrHeap.GetTypeByName
or ClrHeap.GetObjectType
。之后它完全依赖于ClrType.Fields
和ClrInstanceField
成员Type
, ElementType
, 和GetFieldValue
作为额外的奖励,我确实找到了随 NuGet 包提供的 XML Docs 的浏览器友好版本,尽管它与 IntelliSense 提供的文档相同。
c# - Microsoft 诊断运行时 crash.dmp 分析 (C#)
我正在尝试使用 Microsoft.Diagnostics.Runtime .NET 组件(也称为 ClrMD)中的功能读取 crash.dmp。
我在已知位置(在名为 pathToFile 的字符串中)有一个 crash.dmp,所以这不是问题。其余代码如下所示。
测试此代码时,我在命令窗口中收到以下错误:
错误处理目录:System.ArgumentOutOfRangeException。指数超出范围。必须是非负数且小于集合的大小。参数名称:索引。
我假设这与 ClrVersions[0] 位有关,但不能为我的生活确定下来。
任何帮助,将不胜感激。
当前状态 运行以下命令时(失败)
我在此进程和 dac 之间的 cmd 架构不匹配中收到以下错误
干杯
任何人?
.net - DebugDiag 可以像 Visual Studio 2013 那样生成“包含大小”的报告吗
Visual Studio 2013 可以显示包含大小的列(包括子对象的大小) - http://blogs.msdn.com/b/visualstudioalm/archive/2013/10/16/net-memory-analysis-enhancements-in -visual-studio-2013.aspx
DebugDiag 的内存分析报告目前只显示对象大小,不包括子对象。有没有办法让 DebugDiag 在其报告中包含子对象的大小?
你的建议是为 .NET 4.0 生成此类报告的好方法,因为 Visual Studio 仅支持分析 .NET 4.5 故障转储
c# - Mono 是否有等效的 CLR 内存诊断 (CLRMD)?
标题非常明确:Mono 是否有 CLRMD 等价物,或者至少有任何方法可以非侵入性地读取外部 Mono 进程的堆以获取所有已分配对象的列表并读取它们的字段?
如果没有这样的工具,是否有关于 Mono 进程堆结构的 API 和文档,可以让我为此目的实现自己的策略?
c# - 使用 ClrMD 获取原始值
我有以下
如何获取 structValue 的值?
我尝试了以下但没有成功
('field' 是 Test 变量,'innerField' 是 Test.myStruct。两者都是 ClrInstanceField 类型)。
c# - 尝试使用 CLR MD 查找对象根
这是我的课
这就是它的使用方式
我运行程序并拍摄过程快照。毫不奇怪,这是我发现的关于 MyClass 的引用。
现在我想看看是否可以使用 CLR MD 为同一转储文件中存在的 MyClass 实例获取相同的根。为此,我正在使用GCRoot示例。此应用程序的输入之一是 ulong obj。我不确定如何为 MyClass 实例获取这个,所以我所做的是在 GCRoot 示例的 Main 方法中,我添加了以下代码。
这样我看到 obj 得到了一个有效值,但问题是下面的代码行没有找到任何节点,因为总是返回一个 NULL。
结果,我不确定如何从这个转储文件中获取 MyClass 实例的根。任何建议将不胜感激。
c# - 在 .net 堆中查找类型的实例数据
假设我有两个类 Foo 和 Bar 如下
我有一个附加到使用这些类的进程的应用程序。我想在 .NET 堆中查看 Foo 类型的所有实例,并检查 .NET 堆中存在的所有 Foo 实例的 TheBar.Name 属性或 _whatever 字段。我可以找到类型,但我不确定如何获取实例并查看其属性。有什么想法吗?