3

少し前に SO でこの機能に関する情報を見つけましたが、トピックはVisual Studio の隠し機能 (2005-2008) と重複していましたか? そしてもう見つからない。

私はこのようなものを使いたい:

#ifdef DEBUG
#define break_here(condition) if (condition) ... // don't remember, what must be here
#else
#define break_here(condition) if (condition) return H_FAIL;
#endif
//...
hresult = do_something(...);
break_here(hresult != H_OK);
//...
var = do_other_thing(...);
break_here(var > MAX_VAR);

エラー時のブレークポイントのように動作する必要があります。これはアサーションのようなものですが、ダイアログがなく、より軽量です。

私のモジュールは複数のプロジェクトの一部であり、複数の VS ソリューションで編集できるため、ここでは通常のブレークポイントを使用できません。これにより、あるソリューションで設定されたブレークポイントが、別のソリューションでコードを編集すると、ソースのどこかに移動します。

4

2 に答える 2

9

DebugBreakを見てください

現在のプロセスでブレークポイント例外を発生させます。これにより、呼び出し元のスレッドは、例外を処理するようにデバッガーに通知できます。

例:

 var = do_other_thing(...);
 if (var > MAX_VAR)
      DebugBreak();
于 2009-09-15T17:22:53.503 に答える
2

忘れましたが、ARMビルドも必要で、そのうちの1つはMS Visual Studioでコンパイルされていません:)

さらに、モジュールのライブラリ バージョンに追加のコードをリンクしない方がよいでしょう。DebugBreak() に "winbase.h" を含める必要があるのは、その "悪い点" の 1 つでした。しかし、最終リリースにはブレークポイントがないため、これは少し「悪いこと」です:)

crashmstrの回答の助けを借りて、DebugBreak()の代替案を見つけました。そして今、私は次の構造を使用しています:

#ifdef _DEBUG

    #ifdef _MSC_VER
      #ifdef _X86_
        #define myDebugBreak { __asm { int 3 } }
      #else
        #define myDebugBreak  { __debugbreak(); } // need <intrin.h>
      #endif
    #else
      #define myDebugBreak { asm { trap } } // GCC/XCode ARM11 variant
    #endif

#else

      #define myDebugBreak

#endif

#define break_here(condition) if (condition) { myDebugBreak; return H_FAIL; }
于 2009-09-15T17:57:26.337 に答える