问题标签 [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.

0 投票
2 回答
3601 浏览

c# - 使用 ClrMD 加载转储文件时“加载 DAC 失败:CreateDacInstance 失败”

我正在尝试微软的新库ClrMD来分析故障转储和实时进程。

我遵循 .NET Framework博客文章中的示例(使用附加的 .cs 文件)。

我尝试运行该示例来分析一个 .dmp 文件,该文件取自与该示例在同一台机器上运行的程序。

尝试创建运行时对象时,使用以下代码:

抛出此异常:

有任何想法吗?

0 投票
1 回答
488 浏览

c# - 有没有办法用 ClrMD 获取局部变量的值(如 sosex !mdv)?

将 windbg 与 SOS 和 SOSEX 一起使用,我可以使用 !mdv 命令“显示托管框架的参数和本地变量”。有没有办法使用ClrMD以编程方式实现相同的结果?

0 投票
1 回答
1219 浏览

c# - 如何使用 ClrMD 正确处理非原始 ClrInstanceField 值?

我有一些非常大的托管进程的内存转储,我试图从中获取大量统计信息,并且能够呈现堆上相当深的对象图的交互式视图。!do <address>想一想与在带有 SOS 的 WinDbg 中设置类似的东西prefer_dml 1,您可以在其中不断单击属性并查看它们的值,只是在一个更友好的 UI 中比较许多对象。

我发现Microsoft.Diagnostics.Runtime (ClrMD) 特别适合这项任务,但我很难处理数组字段,而且我对对象字段有点困惑,我已经做了一些工作更好的。


数组:如果我将一个地址直接从堆中取出的数组作为目标并使用ClrType.GetArrayLength并且ClrType.GetArrayElementValue一切正常,但是一旦我挖掘另一个对象上的字段,我不确定我从ClrInstanceField.GetValue什么时候得到什么值ClrInstanceField.ElementTypeClrElementType.SZArray(我还没有Array在我的对象图中遇到过挖掘,但我也想处理它)。

编辑:我刚刚决定使用ClrTypeforSystem.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.GetTypeByNameor ClrHeap.GetObjectType。之后它完全依赖于ClrType.FieldsClrInstanceField成员Type, ElementType, 和GetFieldValue

作为额外的奖励,我确实找到了随 NuGet 包提供的 XML Docs 的浏览器友好版本,尽管它与 IntelliSense 提供的文档相同。

0 投票
3 回答
1423 浏览

c# - Microsoft 诊断运行时 crash.dmp 分析 (C#)

我正在尝试使用 Microsoft.Diagnostics.Runtime .NET 组件(也称为 ClrMD)中的功能读取 crash.dmp。

我在已知位置(在名为 pathToFile 的字符串中)有一个 crash.dmp,所以这不是问题。其余代码如下所示。

测试此代码时,我在命令窗口中收到以下错误:

错误处理目录:System.ArgumentOutOfRangeException。指数超出范围。必须是非负数且小于集合的大小。参数名称:索引。

我假设这与 ClrVersions[0] 位有关,但不能为我的生活确定下来。

任何帮助,将不胜感激。

当前状态 运行以下命令时(失败)

我在此进程和 dac 之间的 cmd 架构不匹配中收到以下错误

干杯

任何人?

0 投票
1 回答
981 浏览

windbg - ClrMD 获取内存转储时间

我正在使用CLR 内存诊断工具来分析内存转储。

使用 WinDBG 打开转储,我可以使用.time命令获取调试会话时间(捕获转储时)。

有人知道 ClrMD API 来获取日期吗?

0 投票
1 回答
639 浏览

.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 故障转储

包含大小

0 投票
0 回答
229 浏览

c# - Mono 是否有等效的 CLR 内存诊断 (CLRMD)?

标题非常明确:Mono 是否有 CLRMD 等价物,或者至少有任何方法可以非侵入性地读取外部 Mono 进程的堆以获取所有已分配对象的列表并读取它们的字段?

如果没有这样的工具,是否有关于 Mono 进程堆结构的 API 和文档,可以让我为此目的实现自己的策略?

0 投票
1 回答
283 浏览

c# - 使用 ClrMD 获取原始值

我有以下

如何获取 structValue 的值?

我尝试了以下但没有成功

('field' 是 Test 变量,'innerField' 是 Test.myStruct。两者都是 ClrInstanceField 类型)。

0 投票
1 回答
553 浏览

c# - 尝试使用 CLR MD 查找对象根

这是我的课

这就是它的使用方式

我运行程序并拍摄过程快照。毫不奇怪,这是我发现的关于 MyClass 的引用。

现在我想看看是否可以使用 CLR MD 为同一转储文件中存在的 MyClass 实例获取相同的根。为此,我正在使用GCRoot示例。此应用程序的输入之一是 ulong obj。我不确定如何为 MyClass 实例获取这个,所以我所做的是在 GCRoot 示例的 Main 方法中,我添加了以下代码。

这样我看到 obj 得到了一个有效值,但问题是下面的代码行没有找到任何节点,因为总是返回一个 NULL。

结果,我不确定如何从这个转储文件中获取 MyClass 实例的根。任何建议将不胜感激。

0 投票
3 回答
693 浏览

c# - 在 .net 堆中查找类型的实例数据

假设我有两个类 Foo 和 Bar 如下

我有一个附加到使用这些类的进程的应用程序。我想在 .NET 堆中查看 Foo 类型的所有实例,并检查 .NET 堆中存在的所有 Foo 实例的 TheBar.Name 属性或 _whatever 字段。我可以找到类型,但我不确定如何获取实例并查看其属性。有什么想法吗?