clrmd - 使用 DataTarget.CreateSnapshotAndAttach 后获取 System.Runtime.InteropServices.SEHException
clrmd - Getting System.Runtime.InteropServices.SEHException After using DataTarget.CreateSnapshotAndAttach
我想通过使用 clrmd API 获得包含 c# 对象的大小。
为了获得这些信息,首先我需要附加到进程。
为此,我使用了 DataTarget.CreateSnapshotAndAttach
方法。
由于某种原因,应用程序在收到 System.Runtime.InteropServices.SEHException
错误代码为 0x80004005 的异常后崩溃
堆栈跟踪:
at Microsoft.Win32.SafeNativeMethods.CloseHandle(IntPtr handle)
at Microsoft.Win32.SafeHandles.SafeProcessHandle.ReleaseHandle()
at System.Runtime.InteropServices.SafeHandle.InternalFinalize()
at System.Runtime.InteropServices.SafeHandle.Dispose(Boolean disposing)
at System.Runtime.InteropServices.SafeHandle.Finalize()
此问题的根本原因是 GC Finalizer 线程异常。
如何绕过或防止此异常?
完整代码示例:
public static void Main(string[] args)
{
var processId = Process.GetCurrentProcess().Id;
using (var dataTarget = DataTarget.CreateSnapshotAndAttach(processId))
{
}
GC.Collect();
GC.WaitForPendingFinalizers(); // Will cause exception
}
更新:
当我 "Start Without Debugging" 时,我没有得到异常。但是我想调试。
clrmd 修复它并从版本 1.1.57604 开始支持它。
我想通过使用 clrmd API 获得包含 c# 对象的大小。
为了获得这些信息,首先我需要附加到进程。
为此,我使用了 DataTarget.CreateSnapshotAndAttach
方法。
由于某种原因,应用程序在收到 System.Runtime.InteropServices.SEHException
错误代码为 0x80004005 的异常后崩溃
堆栈跟踪:
at Microsoft.Win32.SafeNativeMethods.CloseHandle(IntPtr handle)
at Microsoft.Win32.SafeHandles.SafeProcessHandle.ReleaseHandle()
at System.Runtime.InteropServices.SafeHandle.InternalFinalize()
at System.Runtime.InteropServices.SafeHandle.Dispose(Boolean disposing)
at System.Runtime.InteropServices.SafeHandle.Finalize()
此问题的根本原因是 GC Finalizer 线程异常。
如何绕过或防止此异常?
完整代码示例:
public static void Main(string[] args)
{
var processId = Process.GetCurrentProcess().Id;
using (var dataTarget = DataTarget.CreateSnapshotAndAttach(processId))
{
}
GC.Collect();
GC.WaitForPendingFinalizers(); // Will cause exception
}
更新: 当我 "Start Without Debugging" 时,我没有得到异常。但是我想调试。
clrmd 修复它并从版本 1.1.57604 开始支持它。