错误,调试

出处: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?

  1. In the project navigator, selectyour project
  2. Select your target
  3. Select the 'Build Phases' tab
  4. Open 'Link Binaries With Libraries'expander
  5. Click the '+' button
  6. Select your framework
  7. (optional) Drag and drop the addedframework to the 'Frameworks' group

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界面上为你的工程设置


你可能感兴趣的:(错误,调试)