2012-09-14 14 views
13

he encontrado este fragmento de código, pero no devuelve verdadero cuando estoy de depuración:¿Hay un C# equivalente a IsDebuggerPresent()?

[DllImport("kernel32.dll", CharSet=CharSet.Auto, ExactSpelling=true)] 
internal static extern bool IsDebuggerPresent(); 
+0

¿Qué quieres hacer? –

+0

'#if debug' ??? – SpaceBison

+0

Mostrar solo algunos botones cuando se ejecuta en el depurador. # si la depuración funcionaría En C++, preferí IsDebuggerPresent porque simplemente diferenciaba si un desarrollador lo estaba mirando o no (en versión o depuración). – noelicus

Respuesta

30

Sí:

System.Diagnostics.Debugger.IsAttached 
+0

Gracias - ¡No puedo creer que no pude encontrar esto cuando busqué en Google! ... con suerte, esta pregunta y respuesta lo resolverá ;-) – noelicus

+1

Me alegra ayudar, por favor márquelo como correcto para que otros puedan encontrarlo más fácilmente – BugFinder

5

te ha etiquetado su pregunta C# así que estoy asumiendo cuando diciendo "pero no se vuelve verdadero cuando estoy depurando", realmente hablas de depuración administrada.

La función IsDebuggerPresent() comprueba si hay presente un depurador nativo. En su caso, debe usar System.Diagnostics.Debugger.IsAttached para verificar si hay un depurador (administrado) presente.

Consulte también this blog post para obtener más información sobre las API del depurador.

1

El miembro de .NET Framework que se asemeja a IsDebuggerPresent() el más obvio es Debugger.IsAttached, pero sus mecanismos internos son completamente diferentes, al igual que obras de manera muy diferente de lo simple OutputDebugString.

  • Debugger.IsAttached pide el CLR para detectar la presencia de un depurador logrado adjunto, y ni siquiera se molesta en verificar la presencia de un depurador nativo .
  • IsDebuggerPresent() pregunta al kernel por la presencia de un depurador nativo adjunto, y no tiene ningún conocimiento de los depuradores gestionados en absoluto.

A partir de Visual Studio 2013, el depurador administrado se construye en la parte superior de un depurador nativo, por lo tanto IsDebuggerPresent() y Debugger.IsAttached debe devolver verdadero al depurar una aplicación administrada bajo VS. Pero si conecta Visual Studio a una aplicación administrada y anula explícitamente el tipo de código a native, IsDebuggerPresent() devolverá true, mientras que Debugger.IsAttached aún devuelve false.

Al final, todo se reduce a lo que está tratando de lograr.

Cuestiones relacionadas