25

是否可以从调试器中获取源代码(或任何有助于调试问题所在的行)的行号,以显示问题的根源?

我收到一个错误:

-[NSCFArray objectAtIndex:]: index (-1 (or possibly larger)) beyond bounds (9)

这显然意味着我在某些时候会越界,但是如果可能的话,我想获得更多信息来帮助我解决问题。

我正在放置一个断点并尝试逐行执行程序,但这是一个乏味的过程。谢谢!

4

2 回答 2

84

当调试器停止时,转到“Debug Navigator”并确保底部的滑块一直向右。

从抛出异常的地方向下扫视,你最终应该会看到自己的代码。单击适当的方法/函数名称,代码将在编辑器中打开。

在此处输入图像描述

在此处输入图像描述

如果您在堆栈跟踪中没有看到您自己的任何方法,则异常可能已通过performSelector-style 调用传递,在这种情况下堆栈跟踪已消失。如果是这种情况,您可以通过添加“On Throw”异常断点来获得更好的信息。首先切换到“断点导航器”:

在此处输入图像描述

然后点击加号并选择“添加异常断点...”

在此处输入图像描述

创建一个“On Throw”断点:

在此处输入图像描述

这将在引发异常的确切点停止调试器,并且您可以获得更好的堆栈跟踪。始终启用这样的异常断点是个好主意,尽管您偶尔会从 Apple 代码中获得内部异常(例如,在使用 QLPreviewController、MPMoviePlayerController 时)。

于 2012-05-08T15:19:14.080 回答
10

您还应该考虑使用 NSSetUncaughtExceptionHandler。(您可以将崩溃日志保存到磁盘,检查下次启动是否保存了新的崩溃日志,将其附加到电子邮件等)

把它放到你的 didFinishLaunchingWithOptions 方法中:

NSSetUncaughtExceptionHandler(&exceptionHandler);

并实现您的异常处理程序:

void exceptionHandler(NSException *exception)
{        
    NSLog(@"%@",[exception name]);
    NSLog(@"%@",[exception reason]);
    NSLog(@"%@",[exception userInfo]);
    NSLog(@"%@",[exception callStackSymbols]);
    NSLog(@"%@",[exception callStackReturnAddresses]);
}
于 2014-08-28T14:20:43.027 回答