23

Xcodeでハードブレークを引き起こす命令は何ですか? たとえば、Visual Studio では、'_asm int 3' または 'DebugBreak()' を実行できます。一部の GCC 実装では、asm("break 0") または asm("trap") です。

Xcodeでさまざまなコンボを試しましたが、運がありませんでした。(インライン アセンブラは正常に動作するため、構文の問題ではありません)。

参考までに、これは assert マクロ用です。移植性と、XCode が提供するバージョンで abort() を実行するように見えるため、assert.h の定義を使用したくありません。


ジョン - スーパー、乾杯。参考までに、int 3 構文は、Intel Mac および iPhone に必要なものです。


Chris - コメントありがとうございます。しかし、さまざまなプラットフォームに移植されたコードベースに対して標準の assert() 関数を避けるべき多くの理由があります。独自の assert をローリングするのに苦労した場合、それは通常、保持したい追加機能 (ログ、スタックの巻き戻し、ユーザー操作) があるためです。

「__assert」などの実装を介してハンドラーを置き換えようとする提案は移植性がありません。標準の「assert」は通常マクロであり、Mac では __assert にマップされる場合がありますが、他のプラットフォームではマップされません。 .

4

7 に答える 7

24

http://developer.apple.com/documentation/DeveloperTools/Conceptual/XcodeProjectManagement/090_Running_Programs/chapter_11_section_3.html

asm {trap}            ; Halts a program running on PPC32 or PPC64.

__asm {int 3}         ; Halts a program running on IA-32.
于 2008-09-01T00:22:27.223 に答える
11

呼び出しを挿入するだけDebugger()で、デバッガーでアプリを停止できます(デバッガーで実行されている場合)。そうでない場合は、例外を除いて停止します。

また、「携帯性の理由」のために避けないassert()でください—携帯性が存在する理由です!これは標準Cの一部であり、Cコンパイラーがあればどこでも見つけることができます。本当にやりたいのは、 ;を呼び出す代わりにデバッガーブレークを実行する新しいアサーションハンドラーを定義することです。abort()事実上すべてのCコンパイラは、これを実行できるメカニズムを提供します。

通常、これは、このプロトタイプに従う関数またはマクロを実装するだけで実行されます。

void __assert(const char *expression, const char *file, int line);

アサーション式が失敗したときに呼び出されます。通常、assert()それ自体ではなく、デフォルトの文書化された動作である「その後にprintf()続く」を実行するものです。abort()この関数またはマクロをカスタマイズすることにより、その動作を変更できます。

于 2008-09-01T22:28:13.997 に答える
6
__builtin_trap();

Debugger()は減価償却されているため、代わりにこれが機能するはずです。

https://developer.apple.com/library/mac/technotes/tn2124/_index.html#//apple_ref/doc/uid/DTS10003391-CH1-SECCONTROLLEDCRASH

于 2012-09-07T16:16:06.890 に答える
3

後世のために: デバッガーの正しいスタック フレームで停止を生成し、(オプションで) アプリを一時停止して、デバッガーをジャストインタイムでアタッチできるようにするためのコードがいくつかあります。シミュレーターとデバイス (必要に応じてデスクトップも可能) で動作します。http://iphone.m20.nl/wp/2010/10/xcode-iphone-debugger-halt-assertions/の徹底的に詳細な投稿

于 2011-04-27T07:45:30.300 に答える
2

Apple フォーラムで次の情報を見つけました。

Xcode にはシンボリック ブレークが組み込まれていませんが、簡単に追加できます。ブレークポイント ウィンドウに移動し、次を追加します。

-[NSException 発生]

于 2008-09-01T00:22:03.340 に答える
2
kill(getpid(), SIGINT);

シミュレータとデバイスで動作します。

于 2011-06-01T17:54:37.453 に答える
1

クロスプラットフォームのストレートHalt()の代替として使用できる次の関数もあります。

#include <stdlib.h>

void abort(void);

致命的なアサーションが発生した場合に備えて、iPhone実装用のクロスプラットフォームエンジンで使用します。ニンテンドーDS/Wii / Xbox 360/iOSなどのクロスプラットフォーム...

于 2009-04-06T06:29:48.507 に答える