Есть ли способ определить, подключен ли отладчик к другому процессу из C#?
У меня есть программа, которая Process.Start()
другая программа, и она отключается через N секунд.
иногда я решаю прикрепить отладчик к запущенной программе. В этих случаях я не хочу, чтобы процесс завершался через N секунд.
Я хотел бы, чтобы хост-программа обнаружила, подключен ли отладчик или нет, поэтому он может выбрать не выключать его.
уточнение: Я не ищу, чтобы обнаружить, если отладчик присоединен к мой процесс, я ищу, чтобы обнаружить, если отладчик подключен к процессу, который я породил.
5 ответов:
вам понадобится P / Invoke до CheckRemoteDebuggerPresent. Для этого требуется дескриптор целевого процесса, который можно получить из процесса.Ручка.
- Это настоящее процесс отлаживается?
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);
Я знаю, что это старый, но у меня была та же проблема и понял, если у вас есть указатель на EnvDTE, вы можете проверить, если процесс находится в Dte.Отладчик.DebuggedProcesses:
foreach (EnvDTE.Process p in Dte.Debugger.DebuggedProcesses) { if (p.ProcessID == spawnedProcess.Id) { // stuff } }
вызов CheckRemoteDebuggerPresent проверяет только то, что процесс изначально отлаживается, я считаю - он не будет работать для обнаружения управляемой отладки.
решение для меня-отладчик.IsAttached как описано здесь:http://www.fmsinc.com/free/NewTips/NET/NETtip32.asp