出处:http://blog.csdn.net/andyweike/article/details/6227609
http://article.ityran.com/archives/1143
1. 编译iPad真机时,选择了 Architetures:Standard(armv6) BaseSDK:iPhoneDevice3.2 TargetDeviceFamily:iPad.
若编译出现如下错误:
Command /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 failed with exit code 1
则修改 GCC4.2CodeGeneral区域中的ComplieForThumb为非选中.
已经有了开发者证书及私钥后,可直接在越狱的手机上调试.
2. 编译链接时, "_OBJC_CLASS_$_xxx", referenced from:可能需要重新建立某个类的文件.
或者:选择项目名,在detail列表中的target列(显示为一个又圆圈),把这个文件的复选选中,或者再次选中.以把它加入到这个target里面来.
3.在sdk4.0及以上使用RegexKitLite报'captureCount' was not declared in this scope错误,是在非.m文件中使用了它的原因.
http://www.cocoachina.com/bbs/read.php?tid=38784&page=e&#a
4.there is no sdk with the name or path.
从网上down的开源代码,结果运行的时候常出现这样的错,并且在deployment中没有ios deployment target 选项.
http://blog.aztaru.com/2010/10/05/ios%E7%AD%86%E8%A8%98there-is-no-sdk-error/
尝试 Project/Edit Active Target/ 及 Set Active SDK菜单项,来回切换一下Active Configuration。
5. EXEC_BAD_ACCESS,EXC_BAD_INSTRUCTION错误,意味着这个app有内存管理的问题,一般是因为访问野指针对象造成的。
一个和内存相关的崩溃一般很难定位到源代码,因为这个恶魔可能很早就在程序中做了坏事了。假如一段有问题的代码混乱了内存结构,这样产生的蝴蝶效应可能会在之后很久才表现出来,并且总在不同的地方。所以,若有指针类型出现了不可能的变化,很可能就是因为内存结构被野指针调用混乱了。
修复一些警告后,可能就能预防一些内存错误。警告在左边靠近行号的黄色三角指出一个编译警告,你点击那个黄色的三角形,xcode可能会弹出一个“Fix-it”的建议。
EXC_BAD_ACCESS崩溃不像SIGABRT,将不会得到很明朗的错误消息。然而可以使用一个让人看到曙光的调试工具:Zombies!死亡对象工具。打开这个项目的scheme editor,选择Run 选项,然后选择Diagnosics标签。勾上Enable Zombie Objects选项。当这个zombie工具被启用之后,即使这个对象被释放了,这个对象的内存也不会被清理。所以,那块内存将会被标记为“长生不死的”。假如你试着之后又去使用这块内存,这个app能够意识到你的错误操作,并且app将会抛出“message sent to daellocated instance”错误并且终止运行。
在工程中加入NSZombieEnabled 环境变量,并设为启用,则在 EXC_BAD_ACCESS 发生时,XCode 的 Console 会打印出问题描述中,设置方法:双击Executables 下的 可执行模组,在弹出窗口中,Variables to be set in the environment,添加 NSZombieEnabled,并设定为 YES,点击选中复选框启用此变量。
可以再加入 MallocStackLogging 来启用malloc记录,以获得更多的提示来帮助定位问题。
在gdb窗口输入 (格式: shell malloc_history <id> <address>) shell malloc_history 1436 0x5f7fcf0, 也可以在终端中去运行 就要去掉以上的shell 指令 如 malloc_history <id> <address>
http://www.cocoachina.com/macdev/objc/2011/0219/2661.html
http://www.cnblogs.com/likwo/archive/2011/02/10/1950664.html
应该仅当需要调试内存时,才设置上述环境变量.
注意一点:不应该一直启用zombie objects。因为这个工具将永远不会释放内存,只是简单标记一下这个内存是不死的,你最终将会在某个时候耗尽所有的内存,因为所有分配过的内存都不会得到重用。因此应该在排查内存相关的错误的时候才开启zombie objects,其他时候应该关闭它。
在xcode4中,To edit environment variables, go to Menu Product / Edit Scheme…, select the desired configuration (you probably want 'Run') from the left sidebar first and then click on the Arguments tab. Environment variables are configurable there.
6.运行一个IPhone程序时,弹出窗口说“程序运行失败,预置描述文件已过期” 。 解决办法是,在Xcode中, window-> Orgnazier -> 你的iphone ->删除带有红*的该程序之前的Profile 。 然后从Xcode运行该程序.
7. 真机编译时报 Code Sign error: The identity doesn't match any valid certificate/private key pair in the default keychain
修改工程和Targets的get info\build 中的code signing identity为空
8.调试打印
CFShow(coreFoundationThingy) will print out a description of coreFoundationThingy to the console. Output looks something like: {value = w:1186.000000 h:687.000000 type = kAXValueCGSizeType}
If NSLog() is printing something out as an NSCFType, try CFShow().
9. 编译时报 Command /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/clang failed with exit code 1,修改C/C++ Compiler Version为gcc4.2
10.this class is not key value coding-compliant for the key viewController
可能在创建了一个基于view的工程,而后把生成的viewcontroller删除了,但是在.xib中还有对它的引用,在IB中直接用delete键删除掉它就行了。
11.这台电脑上已经存在一个名为“embedded.mobileprovision”的预置文件,您是否要替换么?
http://blog.sina.com.cn/s/blog_6907b67f0100o2vw.html
12.真机调试时报failed to upload *.app
http://hi.baidu.com/%CB%E6%B7%E7_1989/blog/item/9649f49f805f05aec8eaf466.html
http://www.shouyanwang.org/thread-462-1-1.html
13.记的release时,先置delegate为nil。
一个节点不应该保留任何对不属于它的节点的引用。
14.模拟器
将xcode升级到4.3.1以后发现,ipad的模拟器,没有Home键了。Command+Shift+H就可以实现类似点击Home键的效果了。
How to “add existing frameworks” in Xcode 4?
15.如何在Xcode 4.2 下进行 iPod touch 2代、iPhone 3G等设备的真机调试?
http://dev.ppios.com/2012/02/%E5%A6%82%E4%BD%95%E5%9C%A8xcode-4-2-%E4%B8%8B%E8%BF%9B%E8%A1%8C-ipod-touch-2%E4%BB%A3%E3%80%81iphone-3g%E7%AD%89%E8%AE%BE%E5%A4%87%E7%9A%84%E7%9C%9F%E6%9C%BA%E8%B0%83%E8%AF%95%EF%BC%9F/
16.编译真机提示provising文件找不到,到project.pbxproj中,把那串标识值删除。
17.在xcode4.3上连接装有ios4.2的3gs,提示: Xcode has encountered an unexpected error (0xC002)
No such file or directory, at ‘/SourceCache/DTDeviceKit/DTDeviceKit-1196/DTDeviceKit/DTDeviceKit_Utilities.m:798’
http://stackoverflow.com/questions/7922308/xcode-4-2-error-0xc002-when-trying-to-use-a-jailbroken-iphone-3g-for-develop
cd ~/Library/Developer/Xcode/iOS\ DeviceSupport/4.2.1\ \(8C148a\)/Symbols/System/Library/Caches/com.apple.dyld/
touch .copied_dyld_shared_cache_armv6
touch .processed_dyld_shared_cache_armv6
touch dyld_shared_cache_armv6
或
touch .copied_dyld_shared_cache_armv7
touch .processed_dyld_shared_cache_armv7
touch dyld_shared_cache_armv7
18. 把异常转为断点,方便调试:
在Xcode左侧断点管理窗口(Command+6)中,点击左下角+,添加add symbolic breakpoint,输入objc_exception_throw,点击done;然后右键单击该断点选择move breakpoint to,选择项目名或User,即可以在所有项目中起作用。
还可添加输入malloc_error_break的symbolic断点,以跟踪调试释放了2次的对象。
通过使用Exception Breakpoint(异常断点),告诉xcode在程序运行中抛出异常前暂停这个程序。这样,很快指出了异常抛出的地方。在Breakpoint Navigator(断点导航器)中,在底部有一个小的加号(“+”)按钮。点击它,并且选择Add Exception Breakpoint,然后点击Done完成。运行程序,如果出现异常,代码编辑器会停止并且指到代码中的其中一行,不再是令人烦躁的汇编代码了,并且注意在在左边的的Debug Navigatot(调试导航器)里面显示的堆栈信息也不一样了。
有时并没有易懂的错误消息,是因为没有异常被抛出。在xcode告诉你异常的原因之前,Exception Breakpoint已经暂停了这个程序。有些时候会从Exception Breakpoint得到一些局部的错误消息,但是有些时候就得不到。为了得到全部的错误消息,可能要多次点击调试器工具栏上的“Continue Program Execution”按钮,如果出现 “this class is not key value coding-compliant for the key XXX”的错误经常都是由于装载这个nib,但是里面引用的一些熟悉可能不存在。特别是当你在代码中移除了outlet属性后,但是却没有在nib中移除这个连接。
19.XCode内置GDB,调试时在输出窗口中使用GDB命令来调试程序。
po 命令:为 print object 的缩写,显示对象的文本描述(显示从对象的 description 消息获得的字符串信息)。
p 命令:打印指针的地址。
print 命令:有点类似于格式化输出,可以输出对象的不同信息:
info 命令:我们可以查看内存地址所在信息
show 命令:显示 GDB 相关的信息。如:show version 显示GDB版本信息
help 命令:如果忘记某条命令的语法了,可以使用 help 命令名 来获取帮助信息。如:help info 显示 info 命令的用法。
c 命令:是一个简短的继续指令。
“po”命令是“print object”(打印对象)的简写。“$eax”是cup的一个寄存器。在一个异常的情况下,这个寄存器将会包含一个异常对象的指针。注意:$eax只会在模拟器里面工作,假如在设备上调试,需要使用”$r0″寄存器。
po $eax 这个命令将会对这个对象调用“description”方法和打印出来
po [$eax class]
po [$eax name]
po [$eax reason]
20.NSLog
真机上NSLog会消耗资源,
以release模式编译的程序不会用NSLog输出,而以debug模式编译的程序将执行NSLog的全部功能。
#ifndef __OPTIMIZE__
# define NSLog(...) NSLog(__VA_ARGS__)
#else
# define NSLog(...)
#endif
或
#ifdef __OPTIMIZE__
#define NSLog(...)
#endif
这个代码的魔术在于:release模式通常会定义 __OPTIMIZE__,debug模式不会。将这段代码放在头文件当中,就可以放心的使用NSLog了!
把这些代码放到*Prefix.pch中最省事。可以把这段宏定义放到一个头文件中,再把这个头文件包含到*Prefix.pch中。
http://lichen1985.com/blog/?p=251
iOS中日志打印:
自定义NSLog #define NSLog NSLog(@"#%s##%d#",strrchr(__FILE__,'/'),__LINE__);NSLog,例如NSLog(@" begin main function"); 打印出来如下 #/main.mm##30# begin main function
参考 http://xcodev.com/wordpress/?m=201204
21. 错误日志目录在Mac OS X: ~/Library/Logs/CrashReporter/MobileDevice/<DEVICE_NAME>
iOS Exception caught Crash Report,3种方法
http://blog.sina.com.cn/s/blog_67b7cb7b010146qj.html
在iPhone上捕获软件异常退出的信息,2种方法
http://hi.baidu.com/coolwidy/blog/item/76f006896168ecb80f2444e7.html
PLCrashReporter
http://caydenliew.com/2011/11/plcrashreporter-the-iphone-crash-framework/
http://blog.sina.com.cn/s/blog_60b45f230100tn5b.html
22. Certificate identity 'iPhone Developer: XXXXXXXX' appears more than once in the keychain. The codesign tool requires there only be one
出错原因:多次为同一个计算机生成私有证书,并且每次都生成了proversionning文件,下载并按照到同一个iOS设备上,那么再次编译程序到设备上的时候就会出现这个问题。
修改方法:在Xcode中,选择菜单Window->Organizer,在LIBRARY下面,选择Provisioning Profiles.找到前面几次生成的Provisioning profiles.删除。
在系统的keychains,即钥匙串管理程序中,在登录下面,我的证书,删除早期的私有证书。
再次编译
23.在 iOS 设备上测试你的应用
http://www.guomii.com/posts/20637
如果你已加入 iOS 开发者计划,你现在就可以使用 Xcode 进行真机运行、测试和调试了,直接在xcode4中操作。
当你将一台安装了有效描述文件的设备,连接到 Mac 上时,这台设备的名称以及当前系统版本会出现在Edit Scheme的Destination 菜单中。
24.error: failed to launch '/Users/gzty1/Library/Developer/Xcode/DerivedData/TianyaQing-chiobhpmbvwnqudfqnfawdzjrtey/Build/Products/Debug-iphoneos/TianyaQing.app/TianyaQing' -- failed to send the qLaunchSuccess packet
重新从appstore上下载安装此软件,再删除,然后尝试真机调试
25.The executable was signed with invalid entitlements.
换provising file
26.如何让IOS应用从容地崩溃
http://www.cocoachina.com/newbie/tutorial/2012/0829/4672.html
http://www.cocoachina.com/gamedev/misc/2012/0829/4668.html
27.默认情况下,如果方法名不存在的话,编 译器并不会报错,而是在方法被调用时直接导致程序崩溃。有一个相关的编译器报 警设置可以使用。在build setting中,“Undeclared Selector”设置勾选上
28.release版的包不可以在非越狱的测试计划手机中安装。
29.防御性编程
NSAssert常用于检查可能出现的人为错误。NSAssert会告诉提醒在数组初始化中所要做的修改,而不是随机地让程序崩溃。
例如验证返回的节点是CCLable类的对象:
NSAssert([node isKindOfClass:[CCLabel class]], @"node is not a CCLabel!");
30.XCode下的iOS单元测试
http://www.cocoachina.com/newbie/env/2012/0516/4257.html
31.
秘诀:
a假如崩溃在main.m里面,就可以设置全局异常断点(Exception Breakpoint)。
b在异常断点开启的状态下,你也没有得到得到有用的信息。在这种情况下,多继续几次运行这个app,或者在调试提示后面输入“po $eax”命令。
c大多数崩溃的一般原因和一些bug都是在你的xib中或者storyboard中的连接丢失了或者是错误的连接。这些情况不会在编译错误里面显示,因此你一般不知道。
d不要忽略编译警告。假如你有编译警告,就说明你有些东西可能会出错。假如你不知道为什么你会到一个编译警告,最好去搞明白它. 这些都是安全的做法!
e在设备上调试可能会和在模拟器上面有些微的不同。这两个环境不是完全一样,你将会得到不同的结果。
例如,当你运行一个有问题的程序在iphone4上的时候,这第一个崩溃就会发生在NSArray初始化的时候,因为你缺少一个nil标记,而不是会因为当这个app执行setList:的时候的时候崩溃。所以说上面那个原则方法就可以帮你找到崩溃问题的根源本质。
f不要忘记静态分析工具(static analyzer tool),这个工具将会捕获更多的错误。假如你是一个初学者,推荐你开启它。你可以在Build Settings界面上为你的工程设置