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é.
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.
if(System.Diagnostics.Debugger.IsAttached)
{
// ...
}
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);
Process process = ...;
bool isDebuggerAttached = Dte.Debugger.DebuggedProcesses.Any(
debuggee => debuggee.ProcessID == process.Id);
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é.
La solution pour moi est Debugger.IsAttached comme décrit ici: http://www.fmsinc.com/free/NewTips/NET/NETtip32.asp