web-dev-qa-db-fra.com

Existe-t-il un moyen de détecter si un débogueur est attaché à un autre processus à partir de C #?

J'ai un programme qui Process.Start() un autre programme, et il l'arrête après N secondes. 

Parfois, je choisis de joindre un débogueur au programme démarré. Dans ces cas, je ne veux pas que le processus soit arrêté après N secondes.

J'aimerais que le programme hôte détecte si un débogueur est connecté ou non, afin qu'il puisse choisir de ne pas le fermer.

Clarification : Je ne cherche pas à détecter si un débogueur est associé à mon processus, mais à détecter si un débogueur est associé au processus que j'ai généré.

63
Lucas Meijer

Vous aurez besoin de P/Invoke jusqu'à CheckRemoteDebuggerPresent . Cela nécessite un handle vers le processus cible, que vous pouvez obtenir à partir de Process.Handle.

20
itowlson
if(System.Diagnostics.Debugger.IsAttached)
{
    // ...
}
162
Bryan Watts

Le processus current est-il en cours de débogage?

var isDebuggerAttached = System.Diagnostics.Debugger.IsAttached;

Est-ce que un autre processus est en cours de débogage?

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

Dans une extension Visual Studio

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

Je sais que c'est vieux, mais j'avais le même problème et je me suis rendu compte que si vous avez un pointeur sur EnvDTE, vous pouvez vérifier si le processus est dans Dte.Debugger.DebuggedProcesses :

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

L'appel CheckRemoteDebuggerPresent vérifie uniquement si le processus est en cours de débogage natif, je crois - cela ne fonctionnera pas pour détecter le débogage géré.

5
Aeka

La solution pour moi est Debugger.IsAttached comme décrit ici: http://www.fmsinc.com/free/NewTips/NET/NETtip32.asp

0
Adi