问题标签 [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 创建运行时抛出异常
我正在使用 CLR 内存诊断库来获取正在运行的进程中所有线程的堆栈跟踪:
我从这里得到了这段代码,它似乎对其他人有用,但它在指示的行上为我抛出了一个异常,并带有消息This runtime is not initialized and contains no data.
dacLocation
设置为C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\mscordacwks.dll
c# - ClrMD 在另一个用户的进程上
我有一个报告挂起在事件日志中的 .Net 应用程序。事件说“应用程序挂起”,没有可用的详细信息。
因此,我创建了一个使用 ClrMD 库的 C# 控制台应用程序。但需要注意的是,这个应用程序是作为 RemoteApp 发布的。当我尝试将 ClrMD 附加到用户的进程时,我收到此错误:Microsoft.Diagnostics.Runtime.ClrDiagnosticsException:无法附加到进程。错误 0。
这并不奇怪,因为我以管理员身份登录服务器,并且他们与不同的用户处于自己的 RDP 会话中。
因此,我决定冒充他们登录的用户,认为如果我以他们的身份运行我的 ClrMD 应用程序,它将有权访问该进程。这给了我一个不同的错误:Microsoft.Diagnostics.Runtime.ClrDiagnosticsException:无法附加到进程。错误 1008。
我似乎找不到任何关于 1008 意味着知道从这里去哪里的线索。我意识到我可能正在尝试做一些不可能的事情。
- 有没有人让 ClrMD 附加到另一个用户的进程?
- 如果没有,是否有可以附加到其他用户进程的调试工具?
- 如果没有,人们是否在生产中使用过 ClrMD,我如何知道应用程序已挂起以知道何时触发 ClrMD 转储?只是在另一个后台线程中监视 UI 线程?
windbg - 如何使用 WinDBG/SOS 和 ClrMD 检查 WeakReference 值?
我正在调查生产中的内存泄漏问题并检索了内存转储。我正在尝试转储我遇到的累积对象的值WeakReference
。这是我在 WinDBG 中得到的:
我们可以发现我们不能使用该m_handle
值作为对象地址。我检查了代码,WeakReference
它是完整的extern
代码。
我的问题是,我们如何使用 WinDBG/SOS 检查它的价值?另外,我正在为 ClrMD 的问题编写临时分析器,那么我应该如何检查对象的对象引用WeakReference
呢?
c# - ClrMd - ClrInfo TryGetDacLocation 和其他方法丢失?
我正在试用 ClrMd 库: https ://github.com/Microsoft/clrmd
我有这个问题,根据第一个教程,我有一个名为TryGetDacLocation的 ClrInfo 类型的方法,但是我可以在其中找到它......我可以看到 Dac 位置是在 Clrinfo 内自动生成的,但我正在尝试调用 runtimeInfo.CreateRuntime(); 我得到:“这个过程和 dac 之间的架构不匹配”
转储和正在运行的进程是相同的 - 32 位架构。我没有看到该功能和其他功能,例如 -类中的TryDownloadDac:
有任何想法吗?
windbg - ClrMD 中的 ip2md 等价物是什么
我知道如何迭代内存中的对象,但我将使用ClrMD
as 中的!ip2md
命令做一些事情WinDBG/SOS
。我究竟应该怎么做?
c# - 从 C# 调用 WaitForSingleObject
我正在尝试从 C# 调用 WaitForSingleObject 方法,如此处所述:
https://msdn.microsoft.com/en-us/library/windows/desktop/ms687032(v=vs.85).aspx
为了调用这个函数我需要创建一个Handle,或者我需要得到一个IntPtr类型的Handle,怎么做呢?
我已经尝试过我发现的这个功能: http ://www.pinvoke.net/default.aspx/kernel32.WaitForSingleObject
或者例如,当我从控制台获取句柄时:
它抛出一个 DllNotFoundException。
这里有什么问题?
我需要它来运行这个函数调用的进程,并从它的进程中获取一个转储,以便我的 ClrMd 库学习。
任何帮助将不胜感激。
代码示例:
.net - 与 !DumpHeap -live 等效的 ClrMD 是什么?
ClrMD是检查实时可执行文件或内存转储的好工具。要将所有托管堆对象转储为摘要,您可以使用
https://blogs.msdn.microsoft.com/dotnet/2013/05/01/net-crash-dump-and-live-process-inspection/
这很好用,相当于带有SOS扩展的Windbg中的!DumpHeap -stat 。对于回归测试,通常希望在测试后检查对象是否泄漏。这看起来非常适合上面的代码,但不幸的是它会产生误报,因为可能有些对象不再是 root,但它们仍会在摘要中报告。尽管没有泄漏,但这可能会导致报告的泄漏。
SOS已通过将-live 开关添加到!DumpHeap来缓解此问题。仅获取活动对象的等效ClrMD代码是什么,因此回归测试仅因真实原因而失败?
我想我需要使用ClrType.EnumerateRefsOfObjectCarefully递归地遍历堆栈,直到找到根对象(ClrHeap.EnumerateRoots),但这种方法需要许多临时哈希集来跟踪递归对象图。这是唯一的方法,还是在 MS 内部某个地方已经有一个正确且性能良好的示例可用(PerfView源?)。
c# - How do I get information about the methods in StackTrace using Microsoft.Diagnostics.Runtime?
Code:
As a result, I get instead of method names - "UNKNOWN". But the in method is the field "InstructionPointer", maybe it will give more information?
c# - 我可以使用 ClrMD 仅遍历前台进程使用的对象吗?
目前,我可以使用以下代码使用 ClrMD 获取堆中存在的所有对象。是否可以仅获取目标进程中使用的对象集(即仅在目标进程的源代码中的对象)。