internal static void Attach(this System.Diagnostics.Process process, EnvDTE.DTE dte) { int tryCount = 5; while (tryCount-- > 0) { try { EnvDTE.Processes processes = dte.Debugger.LocalProcesses; foreach (EnvDTE.Process proc in processes.Cast <EnvDTE.Process>().Where( proc => proc.Name.IndexOf(process.ProcessName) != -1)) { proc.Attach(); Debug.WriteLine(String.Format ("Attached to process {0} successfully.", process.ProcessName)); break; } break; } catch (System.Runtime.InteropServices.COMException) { System.Threading.Thread.Sleep(1000); } } }
private void AttachManagedDebugger() { EnvDTE.DTE dte; try { dte = (EnvDTE.DTE)Marshal.GetActiveObject("VisualStudio.DTE.16.0"); } catch (COMException) { throw new Exception("Visual studio v2019 not found."); } int tryCount = 5; // using a do while because the object is sometimes null.... do { Process.Native.WaitForInputIdle(); try { EnvDTE.Processes processes = dte.Debugger.LocalProcesses; foreach (EnvDTE80.Process2 proc in processes.Cast <EnvDTE80.Process2>().Where(proc => proc.Name.IndexOf(Process.Native.ProcessName) != -1)) { EnvDTE80.Engine debugEngine = proc.Transport.Engines.Item("Managed (v4.6, v4.5, v4.0)"); proc.Attach2(debugEngine); break; } break; } catch { } Thread.Sleep(1000); } while (tryCount-- > 0); }
private bool Attach(object sender, RoutedEventArgs e) { if (lstAttachProcesses.Items.OfType <ProcessToBeAttached>().Count(p => p.Checked) == 0) { bool skipCheck = IsLoaded; if (!IsLoaded) { DebugOptionsToolWindowLoaded(sender, e); } if (skipCheck || lstAttachProcesses.Items.OfType <ProcessToBeAttached>().Count(p => p.Checked) == 0) { MessageBox.Show("You didn't select any processes for attachment.", "Debug Attach History Error", MessageBoxButton.OK, MessageBoxImage.Error); return(false); } } var selectedProcesses = lstAttachProcesses.Items.OfType <ProcessToBeAttached>() .Where(p => p.Checked) .GroupBy(p => new { p.Process.ServerName, p.Process.PortNumber }) .ToDictionary(x => x.Key, x => x.ToList()); foreach (var key in selectedProcesses.Keys) { EnvDTE.Processes processes = GetDebugProcesses(key.ServerName, key.PortNumber); bool found = false; foreach (Process2 process in processes) { ProcessExt pp = new ProcessExt(process.Name, process.ProcessID, key.ServerName, key.PortNumber); var selectedProcess = selectedProcesses[key].FirstOrDefault(p => pp.Hash == p.Process.Hash); if (!string.IsNullOrEmpty(selectedProcess?.DebugMode)) { foreach (Engine engine in ((Debugger2)DebugAttachManagerPackage.DTE.Debugger).Transports.Item("Default").Engines) { if (string.Equals(engine.ID, selectedProcess.DebugMode)) { process.Attach2(new[] { engine }); } } found = true; } else if (selectedProcess != null) { process.Attach(); found = true; } } if (!found) { MessageBox.Show("Selected processes are not running. Try to run your application first.", "Debug Attach History Error", MessageBoxButton.OK, MessageBoxImage.Error); return(false); } } return(true); }
/// <summary> /// Attaches Visual Studio debugger to the target process /// </summary> /// <param name="visualStudioProcess">Visual studio process object</param> /// <param name="applicationProcess">Application process object</param> /// <param name="engines">List of debug engines to use</param> private static void AttachTo( this Process visualStudioProcess, Process applicationProcess, string[] engines) { MessageFilter.Register(); EnvDTE._DTE visualStudioInstance; if (true == TryGetVsInstance(visualStudioProcess.Id, out visualStudioInstance)) { EnvDTE.Processes procs = visualStudioInstance.Debugger.LocalProcesses; EnvDTE80.Process2 processToAttachTo = null; foreach (EnvDTE80.Process2 process in procs) { if (process.ProcessID == applicationProcess.Id) { processToAttachTo = process; } } if (null != processToAttachTo) { for (int i = 0; i < 6; ++i) { if (TryAttach(processToAttachTo, engines)) { break; } if (i < 5) { Thread.Sleep(5000); } else { // NB! We could not attach automatically. This is the right moment to do it. // Do this manually now. You want to attach to iisexpess. Debugger.Break(); } } } else { throw new InvalidOperationException( "Visual Studio process cannot find specified application '" + applicationProcess.Id + "'"); } } MessageFilter.Revoke(); }
private static EnvDTE.Process FindProcess(EnvDTE.Processes dteProcesses, Process process) { if (dteProcesses != null) { foreach (EnvDTE.Process dteProcess in dteProcesses) { if (dteProcess.ProcessID == process.Id) { return(dteProcess); } } } return(null); }