我想通过使用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
}
更新: 当我“开始而不调试”时,我没有得到异常。但我想调试。