0

我想通过使用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 终结器线程的异常。

如何绕过或防止此异常?

完整代码示例:

public static void Main(string[] args)
{
    var processId = Process.GetCurrentProcess().Id;

    using (var dataTarget = DataTarget.CreateSnapshotAndAttach(processId))
    {
    }

    GC.Collect();
    GC.WaitForPendingFinalizers(); // Will cause exception
}

更新: 当我“开始而不调试”时,我没有得到异常。但我想调试。

4

1 回答 1

0

clrmd 修复它并从版本 1.1.57604 开始支持它。

于 2019-12-03T14:21:34.877 回答