有没有办法来检测debugging器是否附加到从C#进程?

我有一个程序,Process.Start()的另一个程序,它closures了N秒后。

有时我select将debugging器附加到启动的程序。 在这种情况下,我不想在N秒后closures进程。

我希望主机程序检测一个debugging器是否连接,所以它可以select不closures它。

澄清:我不想检测debugging器是否附加到我的进程,我正在寻找检测debugging器是否附加到我产生的进程。

您将需要P / Invoke到CheckRemoteDebuggerPresent 。 这需要处理目标进程,您可以从Process.Handle获取该进程。

if(System.Diagnostics.Debugger.IsAttached) { // ... } 

我知道这是旧的,但我有同样的问题,并意识到,如果你有一个指针的EnvDTE,你可以检查进程是否在Dte.Debugger.DebuggedProcesses :

 foreach (EnvDTE.Process p in Dte.Debugger.DebuggedProcesses) { if (p.ProcessID == spawnedProcess.Id) { // stuff } } 

CheckRemoteDebuggerPresent调用只检查进程是否正在本机debugging,我相信 – 它不会用于检测托pipedebugging。

当前进程正在debugging吗?

 var isDebuggerAttached = System.Diagnostics.Debugger.IsAttached; 

另一个进程正在debugging?

 Process process = ...; bool isDebuggerAttached; if (!CheckRemoteDebuggerPresent(process.Handle, out isDebuggerAttached) { // handle failure (throw / return / ...) } else { // use isDebuggerAttached } /// <summary>Checks whether a process is being debugged.</summary> /// <remarks> /// The "remote" in CheckRemoteDebuggerPresent does not imply that the debugger /// necessarily resides on a different computer; instead, it indicates that the /// debugger resides in a separate and parallel process. /// <para/> /// Use the IsDebuggerPresent function to detect whether the calling process /// is running under the debugger. /// </remarks> [DllImport("Kernel32.dll", SetLastError=true, ExactSpelling=true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool CheckRemoteDebuggerPresent( SafeHandle hProcess, [MarshalAs(UnmanagedType.Bool)] ref bool isDebuggerPresent); 

在Visual Studio扩展中

 Process process = ...; bool isDebuggerAttached = Dte.Debugger.DebuggedProcesses.Any( debuggee => debuggee.ProcessID == process.Id); 

我的解决scheme是Debugger.IsAttached如下所述: http : //www.fmsinc.com/free/NewTips/NET/NETtip32.asp