Xcode调试攻略(5种方法)

  1. Xcode内置GDB,可以使用GDB调试,调试命令:

  1.1 po 命令:为 print object 的缩写,显示对象的文本描述

  (lldb) po [$eax class]:输出异常对象的地址


  (lldb) po [$eax name]:输出这个异常的名字


  (lldb) po [$eax reason]:这个将会输出错误消息:


  (lldb) “po $eax”:对这个对象调用“description”方法和打印出来

  “$eax”是cup的一个寄存器。在一个异常的情况下,这个寄存器将会包含一个异常对象的指针。注意:$eax只会在模拟器里面工作,假如你在设备上调试,你将需要使用”$r0″寄存器

  1.2 print 命令:有点类似于格式化输出,可以输出对象的不同信息

  比如:print (char*)[[dic description] cString]、(lldb) print (int)[label retainCount]

  1.3 info 命令:我们可以查看内存地址所在信息

  1.4 info line *内存地址:可以获取内存地址所在的代码行相关信息

  1.5 show 命令:显示 GDB 相关的信息。如:show version 显示GDB版本信息

  1.6 bt: 显示当前进程的函数调用栈的情况;"up num":查看调用的详细信息;down:返回栈列表;l:显示详细代码信息;p:输出数值。

  2. 添加全局断点(Add Exception BreakPoint):

  2.1 添加步骤:

  1. In the bottom-left corner of the breakpoints navigator, click the Add button.

  2. Choose Add Exception Breakpoint.

  3. Choose the type of exception from the Exception pop-up menu.

  4. Choose the phase of the exception handling process at which you want program execution to stop.

  5. Click Done.

  2.2 使用场景:

  程序因为SIGABRT而crash,想要定位到导致crash的行。

  3. 添加符号断点(Add Symbolic BreakPoint):

  3.1 断点执行的时机:Symbolic breakpoints stop program execution when a specific function or method starts executing

  3.2 添加步骤:

  1. Steps In the bottom-left corner of the breakpoint navigator, click the Add button.

  2. Choose Add Symbolic Breakpoint.

  3. Enter the symbol name in the Symbol field.

  4. Click Done.

  3.3 使用场景:

  当想让系统在某个指定条件处中断时,设置相应的断点。

  比如:

  objc_exception_throw:在系统抛出异常处设置断点。

  -[NSException raise]:

  4. 设置NSZombieEnabled、MallocStackLogging、NSAutoreleaseFreedObjectCheckEnabled、NSDebugEnabled:

  4.1 设置方法:

  1. Product->Edit Scheme...->Run...->EnvironmentVariables.

  2. add NSZombieEnabled,set the value with YES

  3. add MallocStackLogging, set the value with YES.

  4. add NSAutoreleaseFreedObjectCheckEnabled, set the value with YES.

  5. add NSDebugEnabled, set the value with YES.

  4.2 使用场景:

  主要为了解决EXC_BAD_ACCESS问题,MallocStackLogging用来启用malloc记录(使用方式 malloc_history ${App_PID} ${Object_instance_addr})。

  4.3 需要注意的问题

  NSZombieEnabled只能在调试的时候使用,千万不要忘记在产品发布的时候去掉,因为NSZombieEnabled不会真正去释放dealloc对象的内存。

  5. 重写respondsToSelector方法

  5.1 实现方式

  #ifdef _FOR_DEBUG_

  -(BOOL) respondsToSelector:(SEL)aSelector {

  printf("SELECTOR: %sn", [NSStringFromSelector(aSelector) UTF8String]);

  return [super respondsToSelector:aSelector];

  }

  #endif

  5.2 使用方法:

  需要在每个object的.m或者.mm文件中加入上面代码(应该可以使用类属实现),并且在other c flags中加入-D _FOR_DEBUG_(记住请只在Debug Configuration下加入此标记)。这样当你程序崩溃时,Xcode的console上就会准确地记录了最后运行的object的方法。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值