studio - ¿Hay alguna manera de detectar si un depurador está conectado a un proceso desde C#?
saber si un proceso esta corriendo c# (5)
Tengo un programa que Process.Start () es otro programa y lo apaga después de N segundos.
Algunas veces elijo adjuntar un depurador al programa iniciado. En esos casos, no quiero que el proceso se cierre después de N segundos.
Me gustaría que el programa host detecte si un depurador está conectado o no, por lo que puede optar por no cerrarlo.
Aclaración: no estoy buscando detectar si un depurador está conectado a mi proceso, estoy buscando detectar si un depurador está conectado al proceso que generé.
¿Se está depurando el proceso actual ?
var isDebuggerAttached = System.Diagnostics.Debugger.IsAttached;
¿Se está depurando otro proceso?
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);
Dentro de una extensión de Visual Studio
Process process = ...;
bool isDebuggerAttached = Dte.Debugger.DebuggedProcesses.Any(
debuggee => debuggee.ProcessID == process.Id);
La solución para mí es Debugger.IsAttached como se describe aquí: http://www.fmsinc.com/free/NewTips/NET/NETtip32.asp
Necesitará P/Invoke en CheckRemoteDebuggerPresent . Esto requiere un control para el proceso de destino, que puede obtener de Process.Handle.
Sé que esto es viejo, pero estaba teniendo el mismo problema y me di cuenta de que si tienes un puntero al EnvDTE, puedes verificar si el proceso está en Dte.Debugger.DebuggedProcesses :
foreach (EnvDTE.Process p in Dte.Debugger.DebuggedProcesses) {
if (p.ProcessID == spawnedProcess.Id) {
// stuff
}
}
La llamada CheckRemoteDebuggerPresent solo comprueba si el proceso se depura de forma nativa, creo que no funcionará para detectar la depuración administrada.
if(System.Diagnostics.Debugger.IsAttached)
{
// ...
}