Есть ли способ определить, подключен ли отладчик к другому процессу из C #? - PullRequest
64 голосов
/ 03 февраля 2010

У меня есть программа, которая Process.Start() другая программа, и она закрывает ее через N секунд.

Иногда я выбираю присоединить отладчик к запущенной программе. В этих случаях я не хочу, чтобы процесс завершался через N секунд.

Я бы хотел, чтобы программа хоста обнаружила, подключен ли отладчик или нет, чтобы он мог не выключать его.

Разъяснение : Я не пытаюсь определить, подключен ли отладчик к моему процессу, я пытаюсь определить, подключен ли отладчик к процессу, который я создал.

Ответы [ 5 ]

165 голосов
/ 03 февраля 2010
if(System.Diagnostics.Debugger.IsAttached)
{
    // ...
}
21 голосов
/ 03 февраля 2010

Вам понадобится P / Invoke до CheckRemoteDebuggerPresent . Для этого требуется дескриптор целевого процесса, который вы можете получить из Process.Handle.

12 голосов
/ 11 октября 2016

Текущий процесс отлаживается?

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 голосов
/ 10 августа 2010

Я знаю, что это старый, но у меня возникла та же проблема, и я понял, что если у вас есть указатель на EnvDTE, вы можете проверить, находится ли процесс в Dte.Debugger.DebuggedProcesses :

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

Вызов CheckRemoteDebuggerPresent проверяет только отладку процесса, я считаю, - он не будет работать для обнаружения управляемой отладки.

0 голосов
/ 27 января 2012

Решение для меня - отладчик. Установлено, как описано здесь: http://www.fmsinc.com/free/NewTips/NET/NETtip32.asp

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...