有没有一种方法可以检测调试器是否从C#附加到另一个进程?


69

我有一个程序,Process.Start()另一个程序,它在N秒后将其关闭。

有时我选择将调试器附加到启动的程序。在那种情况下,我不希望N秒后关闭进程。

我希望主机程序能够检测是否连接了调试器,因此可以选择不关闭调试器。

说明:我不是要检测调试器是否已附加到我的进程中,而是要检测调试器是否已附加到我生成的进程中。

Answers:



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

2
这不是告诉我调试器是否已附加到主机进程吗?我正在寻找一种方法来确定生成的进程是否正在调试中。
卢卡斯·梅杰

1
我明白了,很抱歉误解了您的问题。我相信产生的过程是唯一可以查询该信息的过程。如果您设置某种形式的进程间通信,则将允许原始进程轮询调试器状态。
布莱恩·瓦茨

18

目前正在调试的进程?

var isDebuggerAttached = System.Diagnostics.Debugger.IsAttached;

是否正在调试另一个进程?

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);

5

我知道这很旧,但是我遇到了同样的问题,并且意识到如果您有一个指向EnvDTE的指针,则可以检查该进程是否在Dte.Debugger.DebuggedProcesses中

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

我相信,CheckRemoteDebuggerPresent调用仅检查该进程是否在本地调试,它不适用于检测托管调试。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.