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 开始支持它。