摘要
当我设置一个异常断点时,我没有得到异常消息。我如何得到异常消息?我已经知道如何得到堆栈跟踪,但那不包括异常消息。
详细信息
在过去,我用Xcode开发iOS应用程序,当出现问题时,我会得到一个错误/异常。异常通常会有一条消息,比如“不能取消引用null”或其他什么。
在过去的几个星期里,我一直在使用Xcode 4.6.x,从来没有收到过异常消息。我经常会收到SIGABRT。我在异常断点上放了break,它会在那里中断,但它在iOS SDK中的某个程序集中关闭了,我从来没有收到过消息。
事实上,我不记得上次看到调试器控制台中显示任何东西是什么时候了。
迁移到LLVM后,异常信息是否消失?
我的应用程序在SDK中崩溃而不知道原因是非常令人沮丧的。我检查最后一个函数以确保设置正确(对象分配等),这意味着我没有任何线索。
有没有可能是过去遗留下来的构建设置以某种方式关闭了异常消息?
请重新打开问题,现在有答案了!
在评论中给出了一个很好的答案。这应该被提升为完整的答案,这样我就可以标记已回答的问题,其他有这个共同问题的人可以找到它。为了实现这一点,这个问题需要重新打开!(我会在发生这种情况后删除此请求。)
6条答案
按热度按时间3bygqnnd1#
我将在这里更新杰夫的答案:
要突出显示导致异常的行(而不是main.m中的UIApplicationMain())并查看异常的原因(例如,“error:fetch请求必须具有实体。”),请执行以下操作:
1.在断点导航器中:
1.添加(+),添加异常断点
1.选择新断点,按住Ctrl键单击,编辑断点
1.添加操作
1.输入:po $arg1
堆栈跟踪的相关部分将位于nagivator区域。
这似乎在Xcode 9中仍然有效
下面是我为Xcode 6及以下版本添加的内容。
1.输入:po(NSException)$eax*
在Xcode 6中,你必须显式地提供对象类型,因为它不再被推断。
gpnt7bae2#
对于Xcode 7-9(基于Jeff的回答):
在断点导航器中:
1.添加(+),添加异常断点
1.选择新断点,按住Ctrl键单击,编辑断点
1.添加操作
1.输入:
po $arg1
dluptydi3#
要突出显示导致异常的行(而不是main.m中的UIApplicationMain())并查看异常的原因(例如,“error:fetch请求必须具有实体。”),请执行以下操作:
1.在断点导航器中:
1.添加(+),添加异常断点
1.选择新断点,按住Ctrl键并单击,编辑断点
1.添加操作
1.输入:po $eax
堆栈跟踪的相关部分将位于nagivator区域。
gg58donl4#
是的,xcode对于调试不是那么友好。我喜欢这篇文章,它帮助我更清楚地理解崩溃日志))Demystifying iOS Application Crash Logs
如果您看到错误“消息发送到释放的示例”,也请执行此操作
'产品-〉编辑方案-〉启用僵尸对象'
这将启用僵尸对象,当你对你的项目进行配置文件时选择“僵尸”,导致错误,你将能够看到哪些对象被释放,例如NSArray *myArray
cgh8pdjw5#
从
po $eax
或po (NSException *)$eax
得到的信息似乎与Xcode在没有设置异常断点的情况下打印的信息不同。1.添加异常断点
1.发生异常,断点被命中-〉我知道位置
1.临时禁用断点(Debug区域左侧的第二个按钮)
1.继续执行程序(Debug区域左侧的第三个按钮)
1.详细信息已打印-〉我知道原因
显然不是很优雅和灵活,但至少我两个大问题得到了回答(在哪里和为什么)。
sqxo8psd6#
LLDB线程回溯
Low Level Virtual Machine(LLVM)(https://stackoverflow.com/a/66844588/4770877)
可以使用
bt
或thread backtrace
命令打印错误跟踪显示当前线程的堆栈回溯。
在崩溃报告中可以找到相同的堆栈跟踪
当前线程使用信息
currentThread
po
不工作时,有时可以使用fr v
(或者XCode 10.2中的v
)