Xcode 调试dubug


XCode 内置GDB,我们可以在命令行中使用 GDB 命令来调试我们的程序。下面将介绍一些常用的命令以及调试技巧。

po 命令:为 print object 的缩写,显示对象的文本描述(显示从对象的 description 消息获得的字符串信息)。

比如:
1
po [self view]
回车,看看控制台上是不是多了一些view的信息,如下图: 

上图中,我使用 po 命令显示一个 NSDictionary 的内容。注意在左侧我们可以看到 dict 的一些信息:3 key/value pairs,显示该 dict 包含的数据量,而展开的信息显示 isa 层次体系(即class 和 metaclass结构关系)。我们可以右击左侧的 dict,选中“Print Description of "dict"”,则可以在控制台输出 dict 的详细信息:

Printing description of dict:
<CFBasicHash 0x1001149e0 [0x7fff7e27ff40]>{type = immutable dict, count = 3,
entries =>
    0 : <CFString 0x100002458 [0x7fff7e27ff40]>{contents = "first"} = <CFString 0x100002438 [0x7fff7e27ff40]>{contents = "one"}
    1 : <CFString 0x100002498 [0x7fff7e27ff40]>{contents = "second"} = <CFString 0x100002478 [0x7fff7e27ff40]>{contents = "two"}
    2 : <CFString 0x1000024d8 [0x7fff7e27ff40]>{contents = "third"} = <CFString 0x1000024b8 [0x7fff7e27ff40]>{contents = "three"}
}
(gdb) 

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

技巧二:设置断点触发条件

断点的另外一个重要作用,是可以设置触发断点生效的条件,这样我们就可以在运行时针对特定的数据进行分析,观察app是否运行在正确的轨道上。如下图:

上述截图可以看到如下语句


?
1
( BOOL )[(NSString*)[item valueForKey:@ "ID" ] isEqualToString:@ "93306" ]
通过这行语句,我们告诉编译器:当item中ID等于93306时,此断点生效,进入断点调试模式。


技巧三:格式化输出数据

如果你厌倦了代码里无穷无尽的NSLog,幸运的是我们可以在编辑断点使其输出格式化字符串就像平常编码时一样。不过有一点需要注意,平常编码时可能会使用NSString‘s stringWithFormat:输出格式化字符串,不过这个方法貌似在断点中木有效果,你需要使用alloc/init形式的方法,如下:

?
1
po [[NSString alloc] initWithFormat:@ "Item index is: %d" , index]

运行app,就能在控制台看到想要的输出啦!

简单!强大!这就是LLDB给你的选择,从此代码里可以不用再有NSLog满天飞的情况了,代码变得更干净了,心情变得更愉悦了!

LLDB还有很多强大的地方,本教程只不过揭开了它的面纱,即便如此,仍让我们沉醉不已。

Xcode调试把这些地方设置一下,报错信息会提供的多一些


Xcode开发调试技巧—断点调试

更新时间:2014年10月15日16时46分 来源:传智播客
  1.Condational Breakpoints(条件断点)
  普通断点只要执行到断点所在行就会停止程序,但是有时候我们想当满足一定条件时才停止程序。这个调试技巧在当你想要捕获一个循环中的变量的特定值或者一些不常发生的情况时是非常有用的,而不用你每次迭代都停止来查看。
  怎样开启条件变量?
  1.添加一个普通断点
ios
  2.右键点击断点选择“Edit Breakpoint”
ios
  3.打开断点编辑器,你可以在这里设置断点条件(以及一些其他的断点设置),设置好之后就可以见证奇迹了。
ios
ios

  2.Global BreakPoint(全局断点)  当应用产生异常或崩溃时Xcode一般会直接跳到主函数。但这并不是我们想要的, 我们想要的是产生异常或崩溃能够停留在异常或者崩溃发生的地方而不是跳转到主函数。幸运的是有一个方法可以做到。
  Xcode有一个beautiful的功能叫做异常断点,允许我们在异常发生时在异常发生的地方放一个断点。你可以指定具体的异常也可以指定所有的异常。
  怎样开启异常断点呢?
  1.工程切换到异常浏览窗口,点击下方左侧的“Add Breakpoint”按钮
  2.选择“Add Exception Breakpoint”确保可以捕获所有异常。
ios
ios

  捕获到异常效果如下:
ios


  3. GDB 命令来调试程序
  一般情况下,我们在程序代码中添加断点,是为了通过Xcode提供的‘variables view’(该view在Xcode底部console旁边)来查看变量的状态 。理论上,该窗口可以显示出与当前上下文相关的所有值的状态。实际上,这有点小问题,有时候断点过了之后,该窗口并不会进行相关的更新。但是Xcode有 一个很不错的功能是:我们可以使用控制台的命令来检查某个特定的对象——这对于调试程序非常有用
  1.po 命令:为 print object 的缩写,显示对象的文本描述(显示从对象的 description 消息获得的字符串信息, 如果对象不存在的话会打印出nil)。
ios

  2.处理scalar值时使用‘p’
ios

  3. 输出view的层级关系. (但是被隐藏的命令), recursiveDescription。
ios

  4.其它命令(help):
  1.命令                        解释  
  2.break NUM               在指定的行上设置断点。  
   3.bt                      显示所有的调用栈帧。该命令可用来显示函数的调用顺序。  
  4.clear                   删除设置在特定源文件、特定行上的断点。其用法为:clear FILENAME:NUM。  
  5.continue                继续执行正在调试的程序。该命令用在程序由于处理信号或断点而  
  6.                        导致停止运行时。  
  7.display EXPR            每次程序停止后显示表达式的值。表达式由程序定义的变量组成。  
  8.file FILE               装载指定的可执行文件进行调试。  
  9.help NAME               显示指定命令的帮助信息。  
   10.info break              显示当前断点清单,包括到达断点处的次数等。  
   11.info files              显示被调试文件的详细信息。  
   12.info func               显示所有的函数名称。  
   13.info local              显示当函数中的局部变量信息。  
   14.info prog               显示被调试程序的执行状态。  
   15.info var                显示所有的全局和静态变量名称。  
  16.kill                    终止正被调试的程序。  
  17.list                    显示源代码段。  
  18.make                    在不退出 gdb 的情况下运行 make 工具。  
  19.next                    在不单步执行进入其他函数的情况下,向前执行一行源代码。  
  20.print EXPR              显示表达式 EXPR 的值。  
  21.  
  22.print-object                        打印一个对象  
  23.print (int) name                    打印一个类型  
  24.print-object [artist description]   调用一个函数  
  25.set artist = @"test"                设置变量值  
  26.whatis                              查看变理的数据类型
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值