Xcode调试代码

来源:互联网 发布:time machine 恢复 mac 编辑:程序博客网 时间:2024/06/13 06:35

Xcode调试代码

在使用Xcode的开发的过程中,难免遇到代码各种崩溃的问题,这里除了介绍的几种方法来调试以外,之前自己在开发中遇到问题,在StackOverflow上找到了答案

前几种方法可参照

英语原文:http://crushbeercrushcode.org/2012/11/four-tips-for-debugging-in-xcode-like-a-bro/

中文翻译:http://blog.csdn.net/joywii/article/details/19641931

下面是我遇上的问题

* Terminating app due to uncaught exception ‘NSInvalidArgumentException’, reason: ‘* setObjectForKey: object cannot be nil (key: title)’
* First throw call stack:
(0x18545e084 0x195a440e4 0x1853497b8 0x1000ce3b4 0x1000d41d4 0x189c14e68 0x189bfdfc0 0x189c14804 0x189c14490 0x189c0d9e4 0x189be11d4 0x189e7f98c 0x189bdf73c 0x185416324 0x1854155c8 0x185413678 0x185341664 0x18e4835a4 0x189c464f8 0x100134f00 0x1960b2a08)
libc++abi.dylib: terminating with uncaught exception of type NSException

看到这个问题的第一反应就是,肯定那个字典被设置了nil,再一细看就会发现,崩溃信息还打印出了key:@”title”. 第一反应就是全局搜索了一下,发现相同的太多了,也没有相关的上下文,怎么办?

于是我使用lldb下的 bt 来查看

(lldb) bt* thread #1: tid = 0x558b, 0x00000001961cb270 libsystem_kernel.dylib`__pthread_kill + 8, queue = 'com.apple.main-thread', stop reason = signal SIGABRT    frame #0: 0x00000001961cb270 libsystem_kernel.dylib`__pthread_kill + 8    frame #1: 0x0000000196269228 libsystem_pthread.dylib`pthread_kill + 112    frame #2: 0x0000000196142b18 libsystem_c.dylib`abort + 112    frame #3: 0x0000000195229418 libc++abi.dylib`abort_message + 116    frame #4: 0x0000000195248b8c libc++abi.dylib`default_terminate_handler() + 304    frame #5: 0x0000000195a443c0 libobjc.A.dylib`_objc_terminate() + 128    frame #6: 0x0000000195245bb4 libc++abi.dylib`std::__terminate(void (*)()) + 16    frame #7: 0x000000019524573c libc++abi.dylib`__cxa_rethrow + 144    frame #8: 0x0000000195a44294 libobjc.A.dylib`objc_exception_rethrow + 44    frame #9: 0x0000000185341714 CoreFoundation`CFRunLoopRunSpecific + 572    frame #10: 0x000000018e4835a4 GraphicsServices`GSEventRunModal + 168    frame #11: 0x0000000189c464f8 UIKit`UIApplicationMain + 1488  * frame #12: 0x0000000100134f00 XXApplication`main(argc=1, argv=0x000000016fd5fa58) + 124 at main.m:16    frame #13: 0x00000001960b2a08 libdyld.dylib`start + 

但是这还是没有什么东西啊,继续向下看,不是还有那么多地址信息么。怎么去解析这些地址信息读出来? 在stackOverflow上找了这个

image lookup -a xxxx 

然后直接在lldb试了试,咦,相关信息出来了。

(lldb) image lookup -a 0x1853497b8      Address: CoreFoundation[0x0000000181b917b8] (CoreFoundation.__TEXT.__text + 64232)      Summary: CoreFoundation`-[__NSDictionaryM setObject:forKey:] + 972(lldb) image lookup -a 0x1000ce3b4      Address: XXApplication[0x000000010002e3b4] (XXApplication.__TEXT.__text + 167516)      Summary: XXApplication`-[kPlayerWrapperViewController setMessageToDevicePlayer] + 208 at kPlayerWrapperViewController.m:485

然后果断定位到代码行,发现原来是同事在此处操作的时候,没有判断数据的存在性导致的,至此,问题原因找到了。

0 0