iOS指南系列:如何解决奔溃问题-深入调试

(lldb) po $eax

(unsigned int) $1 = 112518480 Receiver (<MainViewController: 0x6d80ec0>) has no segue with identifier 'ModalSegue'

一上来就看到这两行东西,是不是觉得有点用,但又莫名其妙呢

与调试器朋友
 Making Friends With the Debugger

对于最近的这个crash点,代码如下:

	[self performSegueWithIdentifier:@"ModalSegue" sender:sender];

调试窗格没有任何消息您可以以前那样,继续执行程序按钮但你也可以在调试器中键入一个命令来得到错误信息这样做的好处可以留在同一个地方暂停应用程序
如果你运行这个模拟器可以lldb)提示符后键入以下内容:

(lldb) po $eax

LLDB is the default debugger for Xcode 4.3 and up. 

如果你使用的是旧版本的Xcode,那么你GDB调试器(这对linux开发人员而言,很熟悉的)他们采用同样的一些基本命令所以如果您的Xcode提示(GDB),而不是lldb你应该仍然能够按照这个命令没有问题 顺便说一下,可以切换在Xcode编辑之间的不同调试,可以通过project schema编辑选项,选择debugger,来个本地的图更能说明问题:
iOS指南系列:如何解决奔溃问题-深入调试_第1张图片

po命令代表“打印对象” print object(会不会让你想起.net clr debug中的 !do !pe=print exception)。符号$ EAX是指CPU寄存器之一异常情况该寄存器将包含一个指针NSException对象注:$EAX只适用于模拟器如果你在调试设备你需要使用寄存器$ R0
例如如果键入

(lldb) po [$eax class]

你也可以看到如下的输出

(id) $2 = 0x01446e84 NSException

数字并不重要,但很明显在这里处理NSException对象
可以调用这个对象任何NSException方法例如:

(lldb) po [$eax name]

这会给你异常名称在这种情况下NSInvalidArgumentException

(lldb) po [$eax reason]

这会给你 error message:

(unsigned int) $4 = 114784400 Receiver (<MainViewController: 0x6b60620>) has no
segue with identifier 'ModalSegue'

Note: When you just do “po $eax”, it will call the “description” method on the object and print that, which in this case also gives you the error message.

这样解释这是怎么回事你试图执行名为“ModalSegue”的 Segue 但显然在MainViewController没有Segue公司
storyboard并不表明Segue公司一个存在,是你忘了设置其标识符,这是一个非典型错误(往往是你拼写错了)

iOS指南系列:如何解决奔溃问题-深入调试_第2张图片

改变Segue标识符ModalSegue再次运行程序 - 等待 - 点选按钮这次没有再的崩溃但这里是我们下一个部分问题 - 我们认为显示不应该是空的

Why?

译者按惯例总结一下

1. 适用storayboard后,要特别注意其中的设置

2. 了解gdb/lldb调试命令真的是又帮助的(当然了解windows debugger也有帮助:))


你可能感兴趣的:(ios,exception,object,schema,xcode,Crash)