18

このコードスニペットは見つかりましたが、デバッグ時にtrueが返されません。

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

3 に答える 3

36

はい:

System.Diagnostics.Debugger.IsAttached
于 2012-09-14T10:00:34.617 に答える
7

あなたはあなたの質問にタグを付けたC#ので、「しかし、デバッグ中にtrueを返さない」と言うとき、あなたは実際に管理されたデバッグについて話していると思います。

このIsDebuggerPresent()関数は、ネイティブ デバッガーが存在するかどうかをチェックします。あなたの場合System.Diagnostics.Debugger.IsAttached、(管理された)デバッガーが存在するかどうかを確認するために使用する必要があります。

デバッガー API の詳細については、このブログ投稿も参照してください。

于 2012-09-14T10:03:24.230 に答える
2

最も似ている .NET Framework のメンバーIsDebuggerPresent()は明らかに ですが、単純なDebugger.IsAttachedとはまったく異なる動作をするように、それらの内部動作はまったく異なります。Debugger.LogOutputDebugString

  • Debugger.IsAttachedアタッチされたマネージ デバッガーの存在を CLR に要求し、ネイティブ デバッガーの存在を確認することさえしません。
  • IsDebuggerPresent()アタッチされたネイティブ デバッガーの存在をカーネルに要求し、マネージ デバッガーについてはまったく認識しません。

Visual Studio 2013 の時点で、マネージド デバッガーはネイティブ デバッガーの上に構築されているため、VS でマネージド アプリケーションをデバッグする場合、 と の両方が true を返す必要がありますIsDebuggerPresent()Debugger.IsAttachedただし、Visual Studio をマネージ アプリケーションにアタッチし、明示的にコード タイプをネイティブにオーバーライドした場合、IsDebuggerPresent()は true を返しますが、 Debugger.IsAttachedfalse を返します。

最終的には、すべてはあなたが達成しようとしていることに帰着します。

于 2014-11-07T09:46:47.613 に答える