目标C - 从调试器错误中获取行号或完整堆栈跟踪?

Kev*_*vin 23 xcode cocoa objective-c

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

我收到一个错误:

-[NSCFArray objectAtIndex:]: index (-1 (or possibly larger)) beyond bounds (9)
Run Code Online (Sandbox Code Playgroud)

这显然意味着我在某些时候会超出界限,但是如果有可能我想获得更多信息来帮助我解决问题.

我正在设置断点并尝试逐行完成程序,但这是一个繁琐的过程.谢谢!

Mik*_*ler 82

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

从抛出异常的位置向下扫描你的眼睛,你最终应该找到自己的代码.单击相应的方法/函数名称,代码将在编辑器中打开.

在此输入图像描述

在此输入图像描述

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

在此输入图像描述

然后单击加号并选择"添加异常断点..."

在此输入图像描述

创建一个"On Throw"断点:

在此输入图像描述

这将在抛出异常的确切位置停止调试器,并获得更好的堆栈跟踪.尽管偶尔会从Apple代码中获取内部异常(例如,在使用QLPreviewController,MPMoviePlayerController时),但最好始终启用这样的异常断点.

  • 他的号码是多少?:P (4认同)
  • 你为什么还在使用Xcode 3?这是一个非常糟糕的主意. (2认同)

Dáv*_*zás 8

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

把它放到你的didFinishLaunchingWithOptions方法中:

NSSetUncaughtExceptionHandler(&exceptionHandler);
Run Code Online (Sandbox Code Playgroud)

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

void exceptionHandler(NSException *exception)
{        
    NSLog(@"%@",[exception name]);
    NSLog(@"%@",[exception reason]);
    NSLog(@"%@",[exception userInfo]);
    NSLog(@"%@",[exception callStackSymbols]);
    NSLog(@"%@",[exception callStackReturnAddresses]);
}
Run Code Online (Sandbox Code Playgroud)