2012-09-14 21 views
13

ho trovato questo frammento di codice, ma non restituisce vero quando sto debug:Esiste un equivalente C# a IsDebuggerPresent()?

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

Che cosa vuoi fare? –

+0

'#if debug' ??? – SpaceBison

+0

Mostra solo alcuni pulsanti durante l'esecuzione nel debugger. #if farebbe il debug! In C++ ho preferito IsDebuggerPresent perché semplicemente differenziava se uno sviluppatore lo stava guardando o meno (in versione o debug). – noelicus

risposta

30

Sì:

System.Diagnostics.Debugger.IsAttached 
+0

Grazie - non posso credere che non ho potuto trovare questo quando su Google !! ... speriamo che questa domanda e risposta risolverà quello ;-) – noelicus

+1

Felice di aiutare, per favore contrassegnalo come corretto in modo che altri possano trovarlo più facilmente – BugFinder

5

ti ha taggato la tua domanda come C# così sto assumendo quando dicendo "ma non restituisce true quando eseguo il debug" in realtà si parla di debug gestito.

La funzione IsDebuggerPresent() verifica la presenza di un debugger nativo. Nel tuo caso dovresti usare System.Diagnostics.Debugger.IsAttached per verificare se è presente un debugger (gestito).

Fare riferimento a this blog post per ulteriori informazioni sulle API di debugger.

1

L'organo di .NET Framework che assomiglia IsDebuggerPresent() più è ovviamente Debugger.IsAttached, ma i loro meccanismi interni sono completamente diversi, come opere molto diverso dal semplice OutputDebugString.

  • Debugger.IsAttached chiede il CLR per la presenza di un allegato debugger gestito, e non dà fastidio anche per verificare la presenza di un debugger nativo .
  • IsDebuggerPresent() chiede al kernel la presenza di un debugger nativo collegato e non ha alcuna conoscenza dei debugger gestiti.

Come di Visual Studio 2013, il debugger gestito è costruito in cima ad un debugger nativo, in modo che entrambi IsDebuggerPresent() e Debugger.IsAttached dovrebbe restituire vero quando il debug di un'applicazione gestita in VS. Ma se si collega Visual Studio a un'applicazione gestita e si esegue esplicitamente l'override del tipo di codice su nativo, IsDebuggerPresent() restituirà true mentre Debugger.IsAttached restituisce ancora false.

Alla fine, tutto si riduce a ciò che stai cercando di ottenere.

Problemi correlati