MSVCでは、 DebugBreak() または __ debugbreak はデバッガーを中断させます。 x86では "_asm int 3"を書くのと同じですが、x64では何か違うものです。 gcc(または他の標準コンパイラ)でコンパイルするときも、デバッガにブレークインしたいです。プラットフォームに依存しない関数または組み込み関数はありますか?それについて XCodeの質問 を見ましたが、移植性は十分とは言えません。
付記:主にASSERTを実装したいのですが、assert()を使用できることは理解していますが、コードにDEBUG_BREAKなどを記述したいと思っています。
現在のアーキテクチャまたはプラットフォームに基づいてさまざまな構成に展開する#ifdefに基づいて条件付きマクロを定義することについてはどうでしょうか。
何かのようなもの:
#ifdef _MSC_VER
#define DEBUG_BREAK __debugbreak()
#else
...
#endif
これは、コードがコンパイルされたプラットフォームに基づいて、プリプロセッサによって正しいデバッガブレーク命令によって拡張されます。このように、常にDEBUG_BREAK
をコードに追加します。
ほとんどのPOSIXシステムに移植可能な方法は次のとおりです。
raise(SIGTRAP);
GCCには___builtin_trap
_という組み込み関数があります ここ を参照できますが、これに達するとコードの実行が停止すると想定されています。
あなたする必要があります__builtin_trap()
呼び出しが条件付きであることを確認してください。そうでない場合、その後にコードは発行されません。
この投稿は、5分間のテストYMMVのすべてに支えられています。
これは適切な互換ライブラリのようです https://github.com/scottt/debugbreak
これを行うために a module を portable-snippets (ポータブルコードのパブリックドメインスニペットのコレクション)に追加しました。 100%ポータブルではありませんが、非常に堅牢なはずです。
__builtin_debugtrap
_ clangの一部のバージョン(__has_builtin(__builtin_debugtrap)
で識別)__debugbreak
___breakpoint(42)
int $03
_.inst 0xde01
_.inst 0xd4200000
_.inst 0xe7f001f0
_bpt
__builtin_trap
_signal.h
_および[.____を含めます。]defined(SIGTRAP)
(つまり、POSIX)の場合、raise(SIGTRAP)
raise(SIGABRT)
今後、portable-snippetsのモジュールが拡張されて他のロジックが含まれるようになる可能性があり、私はおそらくこの答えを更新するのを忘れるでしょう。そこで、更新を探す必要があります。これはパブリックドメイン(CC0)なので、自由にコードを盗んでください。
Assert(x)の移植性が十分であると考える場合、assert(false)が問題の明らかな移植性のある解決策のようです。
これは、この質問に対する非常に優れた移植可能な解決策のようです: https://github.com/scottt/debugbreak
引用されたリポジトリで提供されるヘッダー(debugbreak.h)は、MSVCをカプセル化します
__debugbreak,
そして
__asm__ volatile("int $0x03");
i386とx86_64、およびARM実装
__asm__ volatile(".inst 0xe7f001f0");
また、GDBのブレークポイントを通過するシングルステップのヘッダーに記載されている問題に対処するためのいくつかの回避策と、Pythonスクリプトでstepiまたはcontget stuck。スクリプトはdebugbreak-stepおよびdebugbreak-continueをGDBに。
クラッシュ関連の状態をデバッグしようとしている場合、古き良き形式のabort()を使用すると、ほとんどのプラットフォームでコールスタックが得られます。欠点は、現在のPCから続けることができないということです。