如何在xcode中打印或查看方法调用堆栈?

时间:2012-03-01 12:29:50

标签: iphone objective-c xcode cocoa-touch

我在iPad App上工作,

在运行代码时,表视图中有一个方法。

我们知道

`cellForRowAtIndexPath:`

有几次可以调用此方法。

喜欢而

 scrolling table view cells.

 Or table view reload data.

我有复杂的编码所以我只想看方法调用堆栈......

从哪个方法调用索引路径的行的单元格。

我使用了NSLogs和断点,但仍然无法获得。

7 个答案:

答案 0 :(得分:21)

您可以通过

打印NSLog中的堆栈跟踪
NSLog(@"Stack trace : %@",[NSThread callStackSymbols]);

编辑:Swift代码

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

答案 1 :(得分:20)

当您点击断点时,在导航器区域(窗口左侧)中选择Debug导航器:

debug navigator

Debug导航器显示应用程序中每个线程的堆栈跟踪。它显示了与gdb的backtrace命令基本相同的信息,但省略了返回地址(通常不是很有帮助)。使用导航器底部的控件隐藏或显示所有线程,并更改调整显示的堆栈帧数。我在上图中将滑块设置在其范围的中间位置,并且Debug导航器省略了堆栈帧2-18,这是从一种框架方法到另一种框架方法的所有调用,即不是我的东西。

Xcode 4应设置为在您调试时自动显示Debug导航器,但如果没有,您可以通过转到Xcode-> Behaviors-> Edit Behaviors ....来配置它。然后选择列表中的“运行暂停”项目并将其设置为显示导航器调试导航器

答案 2 :(得分:11)

您可以设置断点(或暂停应用),也可以从 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

答案 3 :(得分:7)

尝试在

条目设置断点

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

然后右键单击断点并从“Built-in Breakpoints”菜单项中选择“Log Stack Trace and Auto Continue”。

每次输入此功能时,这将自动记录堆栈跟踪,并且无需步骤实际使用gdb控制台即可继续。

那是Xcode 3.x对于Xcode 4,程序有点不同。

  1. 设置断点。
  2. 右键单击断点并选择“编辑” 断点“。(或Command - Option点击断点)
  3. 从“操作”弹出窗口中选择“调试器命令”。
  4. 将消息设置为“bt”(不带引号。)
  5. 在“选项”下,确保选中“评估后自动继续”。

答案 4 :(得分:2)

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

了解更多here

答案 5 :(得分:1)

答案 6 :(得分:0)

只要有人需要,就使用Swift 4语法

print("Stack trace: \(Thread.callStackSymbols)")