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

Arp*_*ekh 13 iphone xcode cocoa-touch objective-c

我在我的iPad App上工作,

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

据我们所知

`cellForRowAtIndexPath:`
Run Code Online (Sandbox Code Playgroud)

有几次可以调用此方法.

喜欢的

 scrolling table view cells.

 Or table view reload data.
Run Code Online (Sandbox Code Playgroud)

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

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

我使用过NSLogs和断点但仍然无法获得.

Cal*_*leb 22

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

调试导航器

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

应该设置Xcode 4以在调试时自动显示Debug导航器,但如果没有,您可以通过转到Xcode-> Behaviors-> Edit Behaviors ...来配置它.然后从中选择Run Pauses项目列表并将其设置为Show navigator Debug Navigator.

  • @jameshfisher它们是隐藏的,因为它们是在不属于您的代码的框架中调用方法/函数,因此可能对于查看代码正在执行的操作并不感兴趣.如果你想看到它们,调试导航器的最左下角有一个控件 - 看起来像是两个条之间的一个盒子.单击它可以将省略的帧切换为视图内外. (5认同)

Nis*_*ant 22

您可以在NSLog中打印堆栈跟踪

NSLog(@"Stack trace : %@",[NSThread callStackSymbols]);
Run Code Online (Sandbox Code Playgroud)

编辑:Swift代码

println("Stack trace: %@", NSThread.callStackSymbols())
Run Code Online (Sandbox Code Playgroud)


elp*_*elp 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
Run Code Online (Sandbox Code Playgroud)

  • `bt`是`backtrace`的有用快捷方式. (13认同)

Mar*_*ark 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. 从"Action"弹出窗口中选择"Debugger Command".
  4. 将邮件设置为"bt"(不带引号.)
  5. 在"选项"下,确保选中"评估后自动继续".


Kar*_*esh 5

只需添加 Swift 4 语法,以防万一有人需要

print("Stack trace: \(Thread.callStackSymbols)")
Run Code Online (Sandbox Code Playgroud)