Xcode の ' __asm int 3 / DebugBreak() / Halt? に相当します。
-
09-06-2019 - |
質問
Xcodeでハードブレークを引き起こす命令は何ですか?たとえば、Visual Studio では、「_asm int 3」または「DebugBreak()」を実行できます。一部の GCC 実装では、asm("break 0") または asm("trap") です。
Xcode でさまざまなコンボを試しましたが、うまくいきませんでした。(インラインアセンブラは正常に動作するため、構文の問題ではありません)。
参考までに、これはアサートマクロ用です。移植性のためと、XCode が提供するバージョンでは abort() を実行するように見えるため、assert.h の定義は使用したくありません。
ジョン - すごいね、乾杯。参考までに、int 3 構文は Intel Mac および iPhone に必要な構文です。
Chris - コメントありがとうございます。しかし、さまざまなプラットフォームに移植されたコードベースに対して標準のassert() 関数を避ける理由はたくさんあります。独自のアサーションをロールするという手間を費やした場合、それは通常、保持したい追加機能 (ロギング、スタックの巻き戻し、ユーザー操作) があるためです。
「__assert」または同様の実装を介してハンドラーを置き換えようとするというあなたの提案は移植可能ではありません。標準の「assert」は通常マクロであり、Mac では __assert にマップされる可能性がありますが、他のプラットフォームではマップされません。
解決
asm {trap} ; Halts a program running on PPC32 or PPC64.
__asm {int 3} ; Halts a program running on IA-32.
他のヒント
に通話を挿入するだけです Debugger()
— これにより、アプリがデバッガー内で停止されます (デバッガー下で実行されている場合)。そうでない場合は、例外を発生させて停止します。
また、 避けないでください assert()
「携帯性の理由」のため — ポータビリティこそが存在理由です。これは標準 C の一部であり、C コンパイラがある場所ならどこでも見つけることができます。本当にやりたいことは、新しいものを定義することです アサーションハンドラ 呼び出す代わりにデバッガのブレークを実行します abort()
;事実上すべての C コンパイラは、これを実行できるメカニズムを提供しています。
通常、これは、次のプロトタイプに従う関数またはマクロを実装するだけで実行されます。
void __assert(const char *expression, const char *file, int line);
アサーション式が失敗したときに呼び出されます。通常はそうではありません assert()
それ自体が「 printf()
に続く abort()
" これは文書化されたデフォルトの動作です。この関数またはマクロをカスタマイズすることで、その動作を変更できます。
__builtin_trap();
Debugger() は廃止されたため、代わりにこれが機能するはずです。
後世のために:デバッガーの正しいスタック フレームで停止を生成し、(オプションで) アプリを一時停止して、ジャストインタイムでデバッガーをアタッチできるようにするためのコードがいくつかあります。シミュレーターとデバイス (必要に応じてデスクトップも) で動作します。徹底的に詳細な投稿: http://iphone.m20.nl/wp/2010/10/xcode-iphone-debugger-halt-assertions/
で次のことを見つけました アップルフォーラム:
Xcodeには、象徴的なブレークが組み込まれていませんが、すぐに追加できます。ブレークポイント ウィンドウに移動し、以下を追加します。
-[NSException発生]
kill(getpid(), SIGINT);
シミュレーターとデバイスで動作します。
クロスプラットフォームのストレート Halt() の代替として使用できる次の関数もあります。
#include <stdlib.h>
void abort(void);
致命的なアサートが発生した場合に備えて、iPhone 実装用のクロスプラットフォーム エンジンでこれを使用します。Nintendo DS/Wii/XBOX 360/iOS などのクロスプラットフォーム