2016-09-08 5 views
3

セットアップ:簡単なテストケースで[DebuggerNonUserCode]をデバッガから例外を隠すには?

1)MSVS 2015、オプション - >デバッガ - > "マイコードのみ" がチェックされています。

2)このサンプルコード起動時にいくつかのクラス内に配置され、呼び出された:

static bool TestIgnoreException() 
    { 
     Exception ex; 
     return TrySomething(out ex); 
    } 

    [DebuggerNonUserCode] // Prevent exceptions from stopping the debugger within this method. 
    static bool TrySomething(out Exception exOut) 
    { 
     try 
     { 
      if (Environment. MachineName.Length != -1) 
       throw new Exception("ThrewIt."); 

      exOut = null; 
      return true; 
     } 
     catch (Exception ex) 
     { 
      exOut = ex; 
      return false; 
     } 
    } 

3)起動デバッガ

期待される結果はTestIgnoreException()はサイレントモードで実行され、falseを返すことです。

実際の結果は、そのスコープで処理される例外がなくても、TestIgnoreException()でデバッガが停止します。また【DebuggerHidden】代わりに、同じ結果を使用して再試行

enter image description here

4)。

動機:

動機は、あなたのコントロール外にあるいくつかのAPIは、「お試し」の方法を提供し、代わりにのみ、例外を使用して失敗したことを示していない場合のためです。

このような例の多くは、.NET TcpClient.Connect(host、port)です。起動時にプログラムが常にいくつかの接続をテストすると、デバッガは毎回この特定のコードセクションで停止するべきではないとします。

「例外発生時の例外」チェックボックスを使用するのは、タイプによってグローバルに機能するため不適切です。ローカルで作業するように構成することはできません。また、コードをチェックアウトする他の開発者も自動的に例外をスキップする必要があります。

+0

ただ、 "この例外の種類がスローされたときにブレーク" チェックボックスを外します。問題は解決され、これのいずれかの必要はありません。 –

+1

それは望ましくないそのタイプのすべての例外で停止します。また、もう一つの動機は、コードをチェックアウトする他の開発者が例外を目撃してはならないということです(低レベルのネットコードのレイズと同様)。また、何かがここで壊れているようですが、[Debug *]属性と思われます。 – crokusek

+1

いいえ、あなたはそれを後方に持っています。デバッグ> Windows>例外設定ダイアログがどのように機能するかを学び、F1を押して開始してください。属性によってこの動作を変更できるというあなたの前提は間違っています。 –

答えて

5

謎解き。例外処理の最適化が追加されたため、MSVS 2015の新機能は実際には既知の問題です。

https://blogs.msdn.microsoft.com/visualstudioalm/2016/02/12/using-the-debuggernonusercode-attribute-in-visual-studio-2015/#

最適化を無効にして、以前の動作を有効にするには、そのリンクに掲載回避策があります。うまくいけば、彼らは最終的に最適化を含むこのサポートを復活させることができます。

reg add HKCU\Software\Microsoft\VisualStudio\14.0_Config\Debugger\Engine /v AlwaysEnableExceptionCallbacksOutsideMyCode /t REG_DWORD /d 1 

関連質問:

Don't stop debugger at THAT exception when it's thrown and caught

+0

この問題を解決したことを嬉しく思うなら、それを答えとしてマークしてください:) –

+0

この回避策は私の試行で解決されませんでした。悪いデバッグ性能が悪化するだけです! 「*管理されたcompabilityモード*を使用する」オプションが有効になっている場合、この問題は解決されているようです。ただし、デバッグ中に**編集および継続**の機能を無効にします。だから私のコーディングスタイルには役に立たない。 http://stackoverflow.com/questions/41964808/visual-studio-2015-debugger-stops-for-a-handled-exception-of-a-debuggerhidden-fu?noredirect=1#comment72490364_41964808 – Koray

関連する問題