问题标签 [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 附加到进程,然后获取堆栈和堆内变量类型的列表,但仍然无法获取元素的值。
有什么方法可以让我获得这些值吗?为什么 Visual Studio 调试器能够做到这一点?
语言不是这里的限制。
clrmd - 替换 TryGetDacLocation()
在ClrMd 的 GitHub 上,我阅读了
我已经通过 NuGet 添加了 ClrMd。在属性中它说版本 0.8.31.1 并且该方法在对象Microsoft.Diagnostics.Runtime
上不可用。ClrVersion
我已经看到这个问题指出该方法已被删除 - 但我该怎么做呢?
c# - 用 ClrMD 连接到自己?HRESULT:0x80070057
我正在尝试将 ClrMD 附加到自身的进程中:
但是,我收到以下异常:
我可以在被动模式下连接,但不能在侵入式或非侵入式模式下连接。
.net - powershell - 努力引用不在 GAC 中的 DLL
我正在尝试(但失败)将 DLL(不在 GAC 中)加载到 powershell 中。
DLL 是Microsoft.Diagnostics.Runtime (ClrMD) Nuget 包的一部分 请参阅Microsoft.Diagnostics.Runtime 的完整文档。
我无法将它放入 GAC 的原因是因为 DLL 不是使用强名称创建的(这就是 gacutil 所说的)
所以我尝试了以下所有选项..但无法使其工作..想知道是否有人有任何技巧:
并且
我使用的 dllname:
无论如何....在上述所有情况下,我都可以看到 DLL 在我的会话中被加载到当前的 appdomain 中:
但是当我尝试引用它时,它说“类型不可用”
例如
这应该可以工作..当我在intellisense之后键入双冒号时,它应该吐出属性/方法但它因“找不到类型”而失败
这绝对应该有效。afaik这是一个静态方法第一个变量是processID,第二个变量是超时(秒)但它失败了“找不到类型”
它显然可以与 C# 一起使用,但我现在真的不想学习它,因为它会在我理解它时耽误我的时间......但也许是必要的步骤......
c# - unknown_error_in_process 通过 IDebugControl 但通过 WinDBG 解决
我一直在使用 CLRMD 加载/分析使用 DbgEng 的故障转储(将 IDebuggerInterface 转换为 IDebugControl6)。我能够执行与 WinDBG 中相同的命令。大多数功能都按预期工作,但如果我指定“!analyze -v”,我会注意到输出有所不同。
在 WinDBG 中,它能够完全解析 FAILURE_SYMBOL_NAME,但是当通过 CLRMD 执行相同操作时,它会显示 myapp.exe!unknown_error_in_process(而不是 System.Windows.Forms.dll!System.Windows.Forms.Control.get_Handle)。我使用完全相同的符号设置。
我想使用 CLRMD,因为它似乎是一种更现代/更灵活的方法(与解析 WinDBG 日志文件的输出相比),但我担心这些差异。
这似乎是一个很好的线索,但不知道如何解决它:
“无法加载图像 C:\Windows\assembly\NativeImages_v4.0.30319_64\System.Windows.Forms\1afec06f634f3b2469d3ff28cf573ba5\System.Windows.Forms.ni.dll,Win32 错误 0n2 *** 警告:无法验证系统的校验和。 Windows.Forms.ni.dll"
有任何想法吗?
windbg - 如何通过 CLRMD 获取 WinDBG 中显示的异常
当我通过 WinDBG 打开故障转储(小型转储)时,它通常指向特定的调用堆栈和异常。同样,当我在 Visual Studio 中打开它时(它也会自动选择引发异常的正确线程)。在 CLRMD 中,我可以检查每个线程的堆栈跟踪/异常,但我如何知道当时哪个线程处于活动状态/最后发生的异常是什么?
c# - 如何在代码中获取线程“位置”/StackTrace?
我目前有这段代码(使用CLRMD)试图获取堆栈跟踪:
它打印出这个:
但是当我在 Visual Studio 中打开threads
调试下的选项卡时,我看到了一个更具描述性的Location
选项卡,其中包含:
如何获取带有位置选项卡信息的堆栈跟踪?Visual Studio 完美地显示了它,但我似乎无法找到如何通过代码访问它,所以我可以将它作为日志发送......
c# - ClrMD - AttachToProcess 使用 AttachFlag.Invasive 和 AttachFlag.NonInvasive 崩溃
我正在使用Microsoft.Diagnostics.Runtime
nuget 包,这是我尝试获取堆栈跟踪时的代码:
问题类似于Attach to self with ClrMD? HRESULT:0x80070057但我更进一步,使用 Wix 构建应用程序。然后,我将应用程序安装在我的桌面上,这样它就可以在没有 Visual Studio 及其调试器的情况下运行。
只要我把它放在 line 之后,消息框就不会显示using (var dataTarget = DataTarget.AttachToProcess(pid, 5000, AttachFlag.Invasive))
。如果我之前放置了消息框,则消息框会显示。
在代码中,我得到了错误
我想我明白为什么AttachFlag.Invasive
我在 Visual Studio 中运行应用程序时因为它正在被调试而不起作用,但我不明白为什么在我使用 Wix 构建它并将其安装在我的桌面上之后该行不起作用。
同样,与附加的 Stackoverflow 帖子一样AttachFlag.Invasive
,AttachFlag.NonInvasive
它不起作用,但AttachFlag.Passive
确实有效。
c# - 在 .NET 中定义线程池的当前大小
我想知道线程池中活动线程(iocp 和 worker)的数量。我使用这种技术:
日志中有很奇怪的数字:8、3worker
和iocp
150个other
线程。
我使用procdump工具进行了转储,并使用ClrMd(ClrThread.IsThreadpoolCompletionPort
和ClrThread.IsThreadpoolWorker
属性)对其进行了检查。最后我从转储中得到了不同的结果:99worker
和 14 个iocp
线程。
为什么第一种方法会返回如此奇怪的结果?
UPD:我想ThreadPool.GetAvailableThreads
返回max minus currently active (not idle)
线程。
c# - ClrMD:分析 .NET 框架进程在 dotnet 核心应用程序中的转储
我有一个使用procdump创建的 .NET 框架应用程序的转储。我可以创建控制台 .NET 框架 4.6.1 应用程序,安装ClrMd
nuget 包并编写此代码以开始一些检查:
它工作正常。
如果我使用相同的转储但在 dotnet core 2.2 控制台应用程序中执行相同的操作,我将面临异常Could not find matching DAC for this runtime
。
为什么它在第一种情况下有效,而在第二种情况下无效?