问题标签 [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 - 使用 DataTarget.CreateSnapshotAndAttach 后获取 System.Runtime.InteropServices.SEHException
我想通过使用clrmd API 来获取 c# 对象的包含大小。为了获得这些信息,首先我需要附加到该过程。为了实现这一点,我正在使用DataTarget.CreateSnapshotAndAttach
方法。
由于某种原因,应用程序在出现异常后崩溃,System.Runtime.InteropServices.SEHException
错误代码为 0x80004005
堆栈跟踪:
此问题的根本原因是来自 GC 终结器线程的异常。
如何绕过或防止此异常?
完整代码示例:
更新: 当我“开始而不调试”时,我没有得到异常。但我想调试。
.net - 使用 ClrMD 获取 minidump 文件中对象的属性值
我正在尝试使用ClrMD 读取ClrObject
dmp 文件中a 的属性值。我可以使用函数读取对象的任何字段的值。不幸的是,这对于属性是不可能的。GetField<T>(string fieldName)
我已经考虑过是否可以通过执行属性的get方法来获取属性的值,在我的例子中是get_Int1
方法。在 clrmd 中是否可以在 ClrObject 上执行方法/函数?
我已经在这篇文章中读到,要弄清楚属性值并不容易。 在 .net 堆中查找类型的实例数据
但是,我想知道 Visual Studio 如何获取属性的值。我可以在 Visual Studio 中加载 minidump 文件并以"Debug with Managed Only"
. 然后我看到了本地变量,包括小型转储文件的属性!所以 Visual Studio 可以以某种方式解决这个问题。
有谁知道获取 ClrObject 属性值的解决方案?
windbg - ClrMd Execute "~*k" 返回带有 clr!DllUnregisterServerInternal 而不是正确值的堆栈跟踪
当我通过 ClrMd 执行“~*k”命令时,它会返回带有 clr!DllUnregisterServerInternal 而不是正确值的堆栈跟踪。看起来符号没有加载。如果我直接在 WinDBG 中执行“~*k”命令,一切看起来都很好。
然后,我使用 Execute 方法对加载的内存转储执行查询:
有人有什么建议吗?我打算获得本机线程的正确堆栈跟踪。
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()
. 但正如我所说,我真的很想了解为什么它不能使用根。
c# - 如何获取方法的自定义属性?
假设我们有一个定义如下的方法。
现在我们得到了这个应用程序的内存转储,我们可以使用 ClrMDSomeClass
轻松找到类型,然后我们可以轻松找到DoSomeThing
ClrMethod。现在,如何找到对应的MyAttribute
实例并获取beautifulName
值?
debugging - 在 Wine 上打印所有 CLR 线程的堆栈跟踪
我正在对一个在 Windows 上运行但在 Wine[1] 上进入无限循环的 64 位 .NET 应用程序进行功能测试。我已经根据我是否注释了看似微不足道的代码行(它不是控制流行)来隔离使循环发生的条件,但是由于该行似乎微不足道,因此对我来说毫无意义,所以我没有想法如何为它制作一个 MCVE。因此,我试图弄清楚 Wine 上实际循环的内容。我使用的是官方 .NET 框架,而不是 Mono,因为我的应用程序使用混合模式 C++/CLI DLL。
我想到了 2 个选项来调试这个无限循环:
- 获取附加到 Wine 的 .NET 调试器。我以前在这个兔子洞里呆了好几天,但从来没有找到解决办法。
- 在程序开始无限循环后打印所有 CLR 线程(使用后台线程)的堆栈跟踪。
对于#2,我尝试过:
但是在 Wine 上,这给了我:
所以事实证明 PssCaptureSnapshot 是一个太新的功能,Wine 不支持。
没有 PssCaptureSnapshot 的解决方法可能是执行应用程序转储并离线加载,但我不知道如何在 Wine 中执行此操作。
[1] 实际上我只在最近的 Wine 版本上得到这个无限循环。特别是 Wine 7 稳定和分期。我为修复另一个问题而升级的版本 3.1.2-devel 没有这个无限循环问题。