16

私の iPhone プロジェクトでマクロをアサートするために、プログラムでデバッガーに侵入する方法を探しています。Windows (MSVC++) では、この目的で __debugbreak() を使用できます。この関数を呼び出すと、プログラムが停止し、デバッガが起動し、__debugbreak() を呼び出した行のコールスタックが表示されます。

iPhone 用の __debugbreak() に似たものはありますか? Debugger() を試しましたが、リンカー エラーが発生します。

ありがとう、クラウス

4

8 に答える 8

26

編集

これも機能することがわかりました:

#define Debugger() { raise( SIGINT ) ; }

同じ原理だと思います。


私はこれを使用します:

#define Debugger() { kill( getpid(), SIGINT ) ; }

シミュレーターとデバイスで動作すると思います..組み立ては不要です!

于 2009-11-13T04:11:17.980 に答える
6

asm("trap")Apple の開発者フォーラムの親切な人が、デバイス上で実行するときとasm("int3")シミュレーター上で実行するときに使用するヒントを教えてくれました。これにより、プログラムをデバッグモード (Option-Command-Y) で開始した場合に、プログラムがデバッガーに割り込まれます。

(__builtin_trap()デバッガーも中断しますが、その後は続行できません。assert(false)メッセージを表示してプログラムを終了しますが、デバッガーは中断しません。)

于 2009-07-20T10:31:28.053 に答える
1

まず、デバッグターゲットに追加-DDEBUGOTHER_CFLAGSます。DEBUGこれにより、デバッグビルドをビルドするときにシンボルが定義されます。

次に、プレフィックスヘッダーに単純なassertマクロを追加します。

#ifdef DEBUG
#define MyAssert(val) _MyAssert(val)
#else
#define MyAssert(val) do { } while(0)
#endif

次に_MyAssert、モジュールのどこかに関数を作成します。

#ifdef DEBUG
void _MyAssert(int expression)
{
    if (expression == 0) {
       NSLog(@"Assertion failed!"); // Place breakpoint here
    }
}
#endif

最後に、NSLog行にブレークポイントを作成します。

于 2009-07-19T04:10:24.140 に答える
0

単純な assert() マクロに何か問題がありますか? 何かのようなもの

assert(pointerToTest != nil);

条件が真でない場合、その時点でプロセスを停止します。デバッガーで実行している場合は、アサーションの失敗につながった呼び出しのスタック トレースが表示されます。特定のコードパスに到達するたびにトリガーしたい場合は、次のことができます

assert(false);

これらのアサーションは、ウィンドウまたはビューが NIB から呼び出されたときに、すべての IBOutlets が非 nil であることを確認するのに非常に役立ちます。

于 2009-07-19T14:31:27.043 に答える
0

古いスレッドですが、Xcode 7 の同じトピックを調査中にこれを見つけました。これを解決したのは、「例外ブレークポイントの作成...」という機能でした。

デバッグ > ブレークポイント > 例外ブレークポイントの作成...

これにより、ブレークポイント ナビゲーター ([表示] > [ナビゲーター] > [ブレークポイント ナビゲーターの表示] の下) に特別なブレークポイントが配置されます。

すべての例外ブレークポイントを示すブレークポイント ナビゲーター ペイン

これは、例外の実際のスローで中断します。

[ exception raise ]

コードの実行を終了することなく。それがコードの構造である場合は、続行できます。

[すべての例外] の横にあるブレーク ポイント マーカーをダブルクリックすると、例外ブレーク ポイントが停止する場所と方法を調整できます。

ブレークポイントが発生する方法とタイミングに関するオプションを示すブレークポイントナビゲーター

于 2016-10-09T12:15:42.193 に答える
0

プログラムをデバッグで実行する場合、アプリは無効なアサーションに達したときにデバッガーを起動する必要があります。

停止するには、Jens Alfke が言おうとしたように、"Stop on Objective-C Exceptions" ([実行] メニューの下) を有効にする必要があります。

デバッグとリリースおよびアサートの詳細については、http://myok12.wordpress.com/2010/10/10/to-use-or-not-to-use-assertions/を参照してください。

于 2010-12-17T17:57:08.690 に答える
0

停止したい場所にブレークポイントを設定するだけです。Xcode はブレークポイントを永続的に記憶しているため、gdb でアプリを実行するたびに、その時点で停止します。

アサーションの失敗でブレークしたい場合、ブレークポイントを設定するのに適した場所は、実際に例外をスローする Objective-C ランタイムの関数 objc_exception_throw です。[Run] > [Show] > [Breakpoints] ウィンドウを使用して、[Double-click for symbol] 行をダブルクリックし、名前を入力します。

于 2009-07-19T03:01:15.273 に答える
-1

条件付きブレークポイントを確認してください。

http://www.cocoabuilder.com/archive/message/xcode/2008/10/22/25358

于 2009-07-19T03:51:08.190 に答える