您的位置:首页 > 移动开发 > IOS开发

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

2012-04-14 21:52 423 查看
(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,来个本地的图更能说明问题:)



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公司是一个存在,是你忘了设置其标识符,这是一个非典型的错误(往往是你拼写错了):





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

Why?

译者按惯例总结一下:

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

2. 了解gdb/lldb调试命令真的是又帮助的(当然了解windows debugger也有帮助:))
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: