private void DebuggerThread() { Console.WriteLine($"Attaching to {_process.ProcessName}, pid: {_process.Id}"); var metahost = CorDebugHelper.GetClrMetaHost(); var runtimes = metahost.EnumerateLoadedRuntimes(_process.Handle); string version = null; ICorDebug corDebug = null; while (runtimes.Next(1, out var rgelt, IntPtr.Zero) == 0) { var runtimeInfo = (ICLRRuntimeInfo)rgelt; var pwzBuffer = new StringBuilder(30); int capacity = pwzBuffer.Capacity; runtimeInfo.GetVersionString(pwzBuffer, ref capacity); version = pwzBuffer.ToString(); var riid = typeof(ICorDebug).GUID; var rclsid = typeof(ClrDebuggingLegacy).GUID; corDebug = (ICorDebug)runtimeInfo.GetInterface(ref rclsid, ref riid); } if (corDebug == null) { throw new Exception("error: cannot take corDebug"); } Console.WriteLine($"info: runtime: {version}"); corDebug.Initialize(); corDebug.SetManagedHandler(_debuggerCallbacks); corDebug.SetUnmanagedHandler(_debuggerCallbacks); corDebug.DebugActiveProcess((uint)_process.Id, 0, out _debugger); while (_debuggingActive) { Thread.Sleep(WAIT_INTERVAL); } if (!_process.HasExited) { _debugger.Stop(WAIT_INTERVAL); _debugger.Detach(); } }
// Specify the callback object to use for unmanaged events. public void SetUnmanagedHandler(ICorDebugUnmanagedCallback callback) { m_debugger.SetUnmanagedHandler(callback); }