73

MSVC では、DebugBreak()または__debugbreakによってデバッガーが中断されます。x86 では "_asm int 3" を書くのと同じですが、x64 では何か違います。gcc (またはその他の標準コンパイラ) でコンパイルするときは、デバッガーも中断したいと考えています。プラットフォームに依存しない関数または組み込み関数はありますか? それについてのXCode の質問を見ましたが、移植性が十分ではないようです。

サイドノート: 私は主にそれで ASSERT を実装したいと思っています。そのために assert() を使用できることは理解していますが、DEBUG_BREAK などをコードに書きたいと思っています。

4

11 に答える 11

59

ほとんどのPOSIXシステムに移植可能な方法は次のとおりです。

raise(SIGTRAP);
于 2011-04-06T03:07:32.107 に答える
19

現在のアーキテクチャまたはプラットフォームに基づいてさまざまな構造に展開される #ifdef に基づいて条件付きマクロを定義するのはどうですか。

何かのようなもの:

#ifdef _MSC_VER
#define DEBUG_BREAK __debugbreak()
#else
...
#endif

これは、コードがコンパイルされるプラットフォームに基づいて、プリプロセッサによって正しいデバッガー ブレーク命令によって拡張されます。このようDEBUG_BREAKにして、コードで常に使用します。

于 2008-10-06T09:05:26.477 に答える
15

GCC には、ここ__builtin_trapで確認できるという名前の組み込み関数がありますが、これに達するとコードの実行が停止すると想定されます。

呼び出しが条件付きであることを確認する必要__builtin_trap()があります。そうしないと、その後にコードが発行されません。

この投稿は、5 分間のテスト、YMMV のすべてによって支えられています。

于 2008-10-06T09:19:41.927 に答える
13

これは適切な互換ライブラリのようですhttps://github.com/scottt/debugbreak

于 2013-10-03T08:26:26.043 に答える
2

assert(x)十分に移植可能であると考える場合assert(false)、問題に対する明らかな移植可能な解決策のようです。

于 2008-10-06T11:18:58.317 に答える
-1

クラッシュ関連の状態をデバッグしようとしている場合、古き良き方法である abort() を使用すると、ほとんどのプラットフォームでコール スタックが得られます。欠点は、現在の PC から続行できないことです。これはおそらくやりたくないでしょう。

http://www.cplusplus.com/reference/cstdlib/abort/

于 2013-12-26T22:33:00.343 に答える
-6

「通常の」デバッグ ブレークを使用する代わりに、ゼロ除算などの次のいずれかを使用しないでください。

int iCrash = 13 / 0;

または NULL ポインターを逆参照します。

BYTE bCrash = *(BYTE *)(NULL);

少なくとも、これは多くのプラットフォーム/アーキテクチャ間で移植可能です。

多くのデバッガーでは、どの例外に対してどのアクションを実行するかを指定できるため、上記のいずれか (実行の一時停止、「int 3」命令など) がヒットし、例外が生成されたときにそれに応じてアクションを実行できます。

于 2008-10-06T09:21:21.390 に答える