IPadアプリで作業しています
コードの実行中、テーブルビューには1つのメソッドがあります。
みなさんご存じのとおり
`cellForRowAtIndexPath:`
このメソッドを呼び出すことができる回数は数回あります。
しばらくの間
scrolling table view cells.
Or table view reload data.
複雑なコーディングがあるので、メソッドコールスタックを見たいだけです...
インデックスパスの行のセルをメソッドが呼び出しているもの。
NSLogs
とブレークポイントを使用しましたが、まだ取得できませんでした。
ブレークポイントに到達したら、ナビゲーター領域(ウィンドウの左側)でデバッグナビゲーターを選択します。
デバッグナビゲーターには、アプリ内の各スレッドのスタックトレースが表示されます。これは、gdbのbacktrace
コマンドから取得した情報と基本的に同じですが、戻りアドレスを省略しています(通常はあまり役に立ちません)。ナビゲーターの下部にあるコントロールを使用して、すべてのスレッドを表示または非表示にし、表示されるスタックフレームの数を調整します。上の画像の範囲の中央にスライダーセットがあり、デバッグナビゲーターはスタックフレーム2〜18を省略しています。これらはすべて、あるフレームワークメソッドから別のフレームワークメソッドへの呼び出しです。つまり、私のものではありません。
Xcode 4は、デバッグ時にデバッグナビゲーターを自動的に表示するように設定する必要がありますが、そうでない場合は、Xcode-> Behaviors-> Edit Behaviors ...に移動して設定できます。次に、[Run Pauses]を選択します。リストを作成してShow navigator Debug Navigatorに設定します。
NSLogのスタックトレースを印刷するには、
NSLog(@"Stack trace : %@",[NSThread callStackSymbols]);
編集:Swiftコード
println("Stack trace: %@", NSThread.callStackSymbols())
ブレークポイントを設定(またはアプリを一時停止)でき、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
のエントリにブレークポイントを設定してみてください
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
次に、ブレークポイントを右クリックし、[ビルトインブレークポイント]メニュー項目から[ログスタックトレースと自動継続]を選択します。
これにより、この関数に入るたびにスタックトレースが自動的にログに記録され、実際にgdbコンソールを使用せずに続行できます。
これはXcode 3.xの場合でした。Xcode4の場合、手順は少し異なります。
Command
-Option
ブレークポイントをクリックします)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
続きを読む こちら
Swift 4構文を置くだけで、必要な場合に備えて
print("Stack trace: \(Thread.callStackSymbols)")