问题标签 [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 投票
1 回答
223 浏览

c# - clrmd - 使用 DataTarget.CreateSnapshotAndAttach 后获取 System.Runtime.InteropServices.SEHException

我想通过使用clrmd API 来获取 c# 对象的包含大小。为了获得这些信息,首先我需要附加到该过程。为了实现这一点,我正在使用DataTarget.CreateSnapshotAndAttach方法。

由于某种原因,应用程序在出现异常后崩溃,System.Runtime.InteropServices.SEHException错误代码为 0x80004005

堆栈跟踪:

此问题的根本原因是来自 GC 终结器线程的异常。

如何绕过或防止此异常?

完整代码示例:

更新: 当我“开始而不调试”时,我没有得到异常。但我想调试。

0 投票
0 回答
71 浏览

getvalue - 如何从 ClrMd 指针重构 C# 对象

我正在使用 ClrMd 检查 C# 应用程序中的内存,并在进程上连续创建了一个运行时对象。我使用运行时对象来调用 EnumerateObjects()。这将返回一个 ulong 集合,这些集合是对堆上所有对象的引用。如果引用是字符串,我可以使用 ClrType GetValue() 重构字符串。但是,当我在对其他对象的引用上调用 GetValue() 时,GetValue 返回似乎是另一个引用(即 ulong)的内容。

我是否需要执行某种 C# 不安全代码? 代码示例 顺便说一句,我用 EnumerateObjectAddresses() 得到了相同的结果(两者之间有区别吗?)

0 投票
0 回答
148 浏览

.net - 使用 ClrMD 获取 minidump 文件中对象的属性值

我正在尝试使用ClrMD 读取ClrObjectdmp 文件中a 的属性值。我可以使用函数读取对象的任何字段的值。不幸的是,这对于属性是不可能的。GetField<T>(string fieldName)

我已经考虑过是否可以通过执行属性的get方法来获取属性的值,在我的例子中是get_Int1方法。在 clrmd 中是否可以在 ClrObject 上执行方法/函数?

我已经在这篇文章中读到,要弄清楚属性值并不容易。 在 .net 堆中查找类型的实例数据

但是,我想知道 Visual Studio 如何获取属性的值。我可以在 Visual Studio 中加载 minidump 文件并以"Debug with Managed Only". 然后我看到了本地变量,包括小型转储文件的属性!所以 Visual Studio 可以以某种方式解决这个问题。

在此处输入图像描述 在此处输入图像描述

有谁知道获取 ClrObject 属性值的解决方案?

0 投票
1 回答
57 浏览

windbg - ClrMd Execute "~*k" 返回带有 clr!DllUnregisterServerInternal 而不是正确值的堆栈跟踪

当我通过 ClrMd 执行“~*k”命令时,它会返回带有 clr!DllUnregisterServerInternal 而不是正确值的堆栈跟踪。看起来符号没有加载。如果我直接在 WinDBG 中执行“~*k”命令,一切看起来都很好。

然后,我使用 Execute 方法对加载的内存转储执行查询:

有人有什么建议吗?我打算获得本机线程的正确堆栈跟踪。

0 投票
0 回答
29 浏览

c# - 使用 heap.EnumerateRoots() 找不到带有 ClrMD 的实例保留路径

我用这样的方式引发了内存泄漏:

您可以看到,通过创建匿名方法,我们还保留了TestClass实例的引用。

现在您可以构建一个如下所示的单元测试:

哪个按预期工作。现在我想使用ClrMD检查 CLR并找出实例无法被 GC 收集的原因。为此,我遵循文章Exploring .NET managed heap with ClrMD中描述的方法。在第一次迭代中保持接近此代码(但在 ClrMD 2.0 中采用它)。它看起来像这样:

取自此答案并稍作修改以修复内存泄漏的类 AddressTool 如下所示:

hasing 函数是这个答案中的一个

现在我遇到的问题是,当我开始搜索heap.EnumerateRoots(). heap.EnumerateObjects()如果我使用非常慢的方式枚举所有 CLR 对象,我实际上可以找到我正在寻找的保留路径。我需要将TryFindHeapReferences(上面给出的)的一部分更改为:

现在代码将正确找到保留路径,反馈字符串也将包含以下内容:

所以现在我的问题是:如果我使用 迭代根,为什么找不到保留路径heap.EnumerateRoots()?要么我的代码有错误,要么存在一些概念上的误解,并且ExecutionQueue在探索根源时找不到实例,在这种情况下,我想了解原因。虽然heap.EnumerateObjects()工作它会很慢。我假设一个有效的版本heap.EnumerateRoots()无论如何都可以使用。否则我将不得不优化使用heap.EnumerateObjects(). 但正如我所说,我真的很想了解为什么它不能使用根。

0 投票
0 回答
43 浏览

c# - 如何获取方法的自定义属性?

假设我们有一个定义如下的方法。

现在我们得到了这个应用程序的内存转储,我们可以使用 ClrMDSomeClass轻松找到类型,然后我们可以轻松找到DoSomeThingClrMethod。现在,如何找到对应的MyAttribute实例并获取beautifulName值?

0 投票
0 回答
24 浏览

debugging - 在 Wine 上打印所有 CLR 线程的堆栈跟踪

我正在对一个在 Windows 上运行但在 Wine[1] 上进入无限循环的 64 位 .NET 应用程序进行功能测试。我已经根据我是否注释了看似微不足道的代码行(它不是控制流行)来隔离使循环发生的条件,但是由于该行似乎微不足道,因此对我来说毫无意义,所以我没有想法如何为它制作一个 MCVE。因此,我试图弄清楚 Wine 上实际循环的内容。我使用的是官方 .NET 框架,而不是 Mono,因为我的应用程序使用混合模式 C++/CLI DLL。

我想到了 2 个选项来调试这个无限循环:

  1. 获取附加到 Wine 的 .NET 调试器。我以前在这个兔子洞里呆了好几天,但从来没有找到解决办法。
  2. 在程序开始无限循环后打印所有 CLR 线程(使用后台线程)的堆栈跟踪。

对于#2,我尝试过:

但是在 Wine 上,这给了我:

所以事实证明 PssCaptureSnapshot 是一个太新的功能,Wine 不支持。

没有 PssCaptureSnapshot 的解决方法可能是执行应用程序转储并离线加载,但我不知道如何在 Wine 中执行此操作。

[1] 实际上我只在最近的 Wine 版本上得到这个无限循环。特别是 Wine 7 稳定和分期。我为修复另一个问题而升级的版本 3.1.2-devel 没有这个无限循环问题。