web-dev-qa-db-ja.com

DebugBreak()/ __ debugbreakに相当する移植可能なものはありますか?

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

付記:主にASSERTを実装したいのですが、assert()を使用できることは理解していますが、コードにDEBUG_BREAKなどを記述したいと思っています。

49
vividos

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

何かのようなもの:

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

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

13
Jorge Ferreira

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

raise(SIGTRAP);
39
caf

GCCには___builtin_trap_という組み込み関数があります ここ を参照できますが、これに達するとコードの実行が停止すると想定されています。

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

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

12
Hasturkun

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

9
pixelbeat

これを行うために a moduleportable-snippets (ポータブルコードのパブリックドメインスニペットのコレクション)に追加しました。 100%ポータブルではありませんが、非常に堅牢なはずです。

  • ___builtin_debugtrap_ clangの一部のバージョン(__has_builtin(__builtin_debugtrap)で識別)
  • MSVCおよびIntel C/C++コンパイラの場合:___debugbreak_
  • ARM C/C++コンパイラの場合:__breakpoint(42)
  • X86/x86_64の場合、アセンブリ:_int $03_
  • ARM Thumb、Assembly:_.inst 0xde01_
  • ARM AArch64、アセンブリの場合:_.inst 0xd4200000_
  • その他のARM、アセンブリ:_.inst 0xe7f001f0_
  • Alpha、Assemblyの場合:bpt
  • GCC(またはそれを装ったもの)を使用する非ホスト型Cの場合、___builtin_trap_
  • それ以外の場合は、_signal.h_および[.____を含めます。]
    • defined(SIGTRAP)(つまり、POSIX)の場合、raise(SIGTRAP)
    • それ以外の場合、raise(SIGABRT)

今後、portable-snippetsのモジュールが拡張されて他のロジックが含まれるようになる可能性があり、私はおそらくこの答えを更新するのを忘れるでしょう。そこで、更新を探す必要があります。これはパブリックドメイン(CC0)なので、自由にコードを盗んでください。

8
nemequ

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

4
Suma

これは、この質問に対する非常に優れた移植可能な解決策のようです: 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に。

1
QwazyWabbit

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

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

1
johnwbyrd