Ejemplo n.º 1
0
        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);
                }
            }
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
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);
        }
Ejemplo n.º 4
0
        /// <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();
        }
Ejemplo n.º 5
0
        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);
        }