当前位置:  开发笔记 > IOS > 正文

在Objective C和XCode中抛出的调试异常

如何解决《在ObjectiveC和XCode中抛出的调试异常》经验,为你挑选了3个好方法。

我是Microsoft的长期开发人员,我是使用XCode进行iPhone开发的新手.所以,我正在读一本书,并通过示例尝试自学如何使用Objective-C编写iPhone应用程序.到目前为止一切都很顺利,但偶尔我会objc_exception_throw在运行时遇到通用的' '消息.发生这种情况时,很难找到此异常的来源.经过一些反复试验,我找到了答案.其中一个参数拼写错误.

正如你在下面看到的那样,我错过了'otherButtonTitles'参数,省略了第二个't'按钮.

UIAlertView *alert = [[UIAlertView alloc] 
                      initWithTitle:@"Date and Time Selected" 
                      message:message 
                      delegate:nil
                      cancelButtonTitle:@"Cancel"
                      otherButonTitles:nil];

这花费我时间的原因是代码构建成功.这是Objective-C编译器的正常行为吗?当我像这样做一个常见的语法错误时,我习惯于在.NET编译器中使构建失败.是否有编译器设置我可以更改以在构建这些错误时使构建失败?



1> lhunath..:

首先,打开~/.gdbinit(这是.gdbinit在您的主目录中调用的文件- 是的,以点开头)并将其放入其中:

fb -[NSException raise]
fb objc_exception_throw
fb malloc_error_break

这将使用三个默认断点初始化GDB,当它们发生时,GDB将暂停您的应用程序并向您显示堆栈跟踪.这与Xcode非常好地集成,因此只要在某处发生异常或malloc失败,您就可以通过单击堆栈跟踪元素来很好地遍历代码.

然后,打开Get Info项目中的面板(或选择项目(顶部项目Groups & Files)并点击cmd-i),转到Build选项卡并将项目设置Base SDKDevice - iPhone OS [someversion].一直滚动到底部并找到该GCC 4.0 - Warnings部分.那里; 打开尽可能多的警告,但要确保打开Treat Warnings as Errors(这相当于GCC_TREAT_WARNINGS_AS_ERRORS).我个人认为:

GCC警告构建设置http://lhunath.lyndir.com/stuff/gcc_warnings.png

您现在应该在代码中遇到大多数错误的编译器警告,并且在您修复代码之前编译器不会让您运行代码.当事情确实越过编译器的鼻子时,你应该能够轻松找到问题,GDB在一个方便的位置破解.

你也应该研究一下NSZombie*.这些是环境变量,非常便于早期破坏不良内存分配或访问情况.例如; 王氏NSZombieEnabled什么都不会真正被释放; 在dealloc上它会被覆盖,_NSZombie如果你再次尝试访问这个解除分配的内存(取消引用一个解除分配的指针),你将在GDB中获得一些东西,而不是正常的调用,只是在随机数据上发出(当然,这不是你想要的).有关详细信息,请参阅http://www.cocoadev.com/index.pl?NSZombieEnabled.



2> Matt Gallagh..:

始终使用-WerrorGCC设置(GCC_TREAT_WARNINGS_AS_ERRORS = YES).您的代码中永远不应该出现警告,这是警告是严重错误的示例.

此外,如果你得到一个objc_exception_throw,切换到控制台(Command-shift-R)并寻找第一个"低"号码地址.

2009-04-01 13:25:43.385 CrashExample[41720:20b] Stack: (
    2528013804,
    2478503148,
    2528036920,
    2528053460,
    2358032430,
    11076,
    11880,
    816174880,
    345098340,
    145973440,
    816174880,
)

在这种情况下,它将是"11076".所以输入控制台:

info line *11076

这将告诉您代码中抛出异常的行.



3> drewh..:

拼写错误的参数通常应该导致"警告:这样的对象不响应选择器x"在所讨论的行中为黄色.我相信默认情况下这是打开的,因为我没有必要更改任何编译器设置来查看这些.

此外,当我遇到未捕获的异常时,放入gdb控制台(应该在执行应用程序时出现)并输入以下内容以获取所有线程的回溯有时是有益的:

taa bt

推荐阅读
手机用户2402852387
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有