// Launches a process by means of the debug engine. // Normally, Visual Studio launches a program using the IDebugPortEx2::LaunchSuspended method and then attaches the debugger // to the suspended program. However, there are circumstances in which the debug engine may need to launch a program // (for example, if the debug engine is part of an interpreter and the program being debugged is an interpreted language), // in which case Visual Studio uses the IDebugEngineLaunch2::LaunchSuspended method // The IDebugEngineLaunch2::ResumeProcess method is called to start the process after the process has been successfully launched in a suspended state. int IDebugEngineLaunch2.LaunchSuspended( string pszServer, IDebugPort2 port, string exe, string args, string dir, string env, string options, enum_LAUNCH_FLAGS launchFlags, uint hStdInput, uint hStdOutput, uint hStdError, IDebugEventCallback2 ad7Callback, out IDebugProcess2 process) { Debug.Assert(_pollThread == null); Debug.Assert(_engineCallback == null); Debug.Assert(_debuggedProcess == null); Debug.Assert(_ad7ProgramId == Guid.Empty); process = null; _engineCallback = new EngineCallback(this, ad7Callback); try { // We are being asked to debug a process when we currently aren't debugging anything _pollThread = new WorkerThread(); _pollThread.RunOperation(() => { var endpoint = new IPEndPoint(IPAddress.Parse(args.Split('=')[1]), 8085); _debuggedProcess = new DebuggedProcess(endpoint, _engineCallback, _pollThread, this); _pollThread.PostedOperationErrorEvent += _debuggedProcess.OnPostedOperationError; return(_debuggedProcess.Initialize()); }); EngineUtils.RequireOk(port.GetProcess(_debuggedProcess.Id, out process)); return(VSConstants.S_OK); } catch (Exception e) when(ExceptionHelper.BeforeCatch(e, reportOnlyCorrupting: true)) { // If we just return the exception as an HRESULT, we will loose our message, so we instead send up an error event, and then // return E_ABORT. SendStartDebuggingError(e); } Dispose(); return(VSConstants.E_ABORT); }
private void Dispose() { IWorkerThread pollThread = _pollThread; IDebuggedProcess debuggedProcess = _debuggedProcess; _engineCallback?.Close(); _engineCallback = null; _debuggedProcess = null; _pollThread = null; _ad7ProgramId = Guid.Empty; debuggedProcess?.Close(); pollThread?.Close(); }