web-dev-qa-db-ja.com

Xcodeでメソッドコールスタックを印刷または表示する方法

IPadアプリで作業しています

コードの実行中、テーブルビューには1つのメソッドがあります。

みなさんご存じのとおり

`cellForRowAtIndexPath:`

このメソッドを呼び出すことができる回数は数回あります。

しばらくの間

 scrolling table view cells.

 Or table view reload data.

複雑なコーディングがあるので、メソッドコールスタックを見たいだけです...

インデックスパスの行のセルをメソッドが呼び出しているもの。

NSLogsとブレークポイントを使用しましたが、まだ取得できませんでした。

15
Arpit B Parekh

ブレークポイントに到達したら、ナビゲーター領域(ウィンドウの左側)でデバッグナビゲーターを選択します。

debug navigator

デバッグナビゲーターには、アプリ内の各スレッドのスタックトレースが表示されます。これは、gdbのbacktraceコマンドから取得した情報と基本的に同じですが、戻りアドレスを省略しています(通常はあまり役に立ちません)。ナビゲーターの下部にあるコントロールを使用して、すべてのスレッドを表示または非表示にし、表示されるスタックフレームの数を調整します。上の画像の範囲の中央にスライダーセットがあり、デバッグナビゲーターはスタックフレーム2〜18を省略しています。これらはすべて、あるフレームワークメソッドから別のフレームワークメソッドへの呼び出しです。つまり、私のものではありません。

Xcode 4は、デバッグ時にデバッグナビゲーターを自動的に表示するように設定する必要がありますが、そうでない場合は、Xcode-> Behaviors-> Edit Behaviors ...に移動して設定できます。次に、[Run Pauses]を選択します。リストを作成してShow navigator Debug Navigatorに設定します。

20
Caleb

NSLogのスタックトレースを印刷するには、

NSLog(@"Stack trace : %@",[NSThread callStackSymbols]);

編集:Swiftコード

println("Stack trace: %@", NSThread.callStackSymbols())
21
Nishant

ブレークポイントを設定(またはアプリを一時停止)でき、gdbデバッガーから「backtrace」と書き込みます。

スタックが表示されるはずです:

(gdb) backtrace
#0  0x9022f7fe in mach_msg_trap ()
#1  0x9022ecdc in mach_msg ()
#2  0x022a310a in __CFRunLoopServiceMachPort ()
#3  0x02206550 in __CFRunLoopRun ()
#4  0x02205d84 in CFRunLoopRunSpecific ()
#5  0x02205c9b in CFRunLoopRunInMode ()
#6  0x024617d8 in GSEventRunModal ()
#7  0x0246188a in GSEventRun ()
#8  0x00c0ca16 in UIApplicationMain ()
#9  0x0000270d in main (argc=1, argv=0xbfeff550) at /Users/.........m:14
11
elp

のエントリにブレークポイントを設定してみてください

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

次に、ブレークポイントを右クリックし、[ビルトインブレークポイント]メニュー項目から[ログスタックトレースと自動継続]を選択します。

これにより、この関数に入るたびにスタックトレースが自動的にログに記録され、実際にgdbコンソールを使用せずに続行できます。

これはXcode 3.xの場合でした。Xcode4の場合、手順は少し異なります。

  1. ブレークポイントを設定します。
  2. ブレークポイントを右クリックし、「ブレークポイントの編集」を選択します。 (またはCommand-Optionブレークポイントをクリックします)
  3. 「アクション」ポップアップから「デバッガコマンド」を選択します。
  4. メッセージを "bt"(引用符なし)に設定します。
  5. [オプション]で、[評価後に自動的に続行する]をオンにしてください。
7
Mark

bt、現在のスレッドのスタックトレース(バックトレース)をコンソールに出力します。この情報には、スレッド番号、フレームなどが含まれます。

* thread #1: tid = 0x3cccc1, 0x00003076 MyStuff`-[BNRMasterViewController viewDidLoad](self=0x08988fa0, _cmd=0x009bad27) + 102 at BNRMasterViewController.m:35, queue = 'com.Apple.main-thread, stop reason = breakpoint 1.1
        frame #0: 0x00003076 MyStuff`-[BNRMasterViewController viewDidLoad](self=0x08988fa0, _cmd=0x009bad27) + 102 at BNRMasterViewController.m:35
        frame #1: 0x003409a8 UIKit`-[UIViewController loadViewIfRequired] + 696
        frame #2: 0x00340c44 UIKit`-[UIViewController view] + 35
        frame #3: 0x0036b339 UIKit`-[UINavigationController rotatingSnapshotViewForWindow:] + 52
        frame #4: 0x00694910 UIKit`-[UIClientRotationContext initWithClient:toOrientation:duration:andWindow:] + 420
        frame #5: 0x00270ea2 UIKit`-[UIWindow _setRotatableClient:toOrientation:updateStatusBar:duration:force:isRotating:] + 1495
        frame #6: 0x002708c6 UIKit`-[UIWindow _setRotatableClient:toOrientation:updateStatusBar:duration:force:] + 82
        frame #7: 0x00270798 UIKit`-[UIWindow _setRotatableViewOrientation:updateStatusBar:duration:force:] + 117
        frame #8: 0x00270820 UIKit`-[UIWindow _setRotatableViewOrientation:duration:force:] + 67
        frame #9: 0x0026f8ba UIKit`__57-[UIWindow _updateToInterfaceOrientation:duration:force:]_block_invoke + 120
        ...

アプリケーションのマルチスレッド部分をデバッグする場合は、次のコマンドを使用できます:bt allは、ブレークポイントに達したときにすべてのスレッドのスタックトレースを表示します。

コマンドに番号を追加することにより、限られた数のスタックフレームを出力することもできます:bt 10

または

po Thread.callStackSymbols

続きを読む こちら

2
yoAlex5

Swift 4構文を置くだけで、必要な場合に備えて

print("Stack trace: \(Thread.callStackSymbols)")
1
Karthick Ramesh