XCode的一些调试技巧

罗朝辉 (http://www.cnblogs.com/kesalin/)

本文遵循“署名-非商业用途-保持一致”创作公用协议

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

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

比如:

上图中,我使用 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 命令:有点类似于格式化输出,可以输出对象的不同信息:如:

(gdb) print (char *)[[dict description] cStringUsingEncoding:4]$1 = 0x1001159c0 "{\n    first = one;\n    second = two;\n    third = three;\n}"(gdb) print (int)[dict retainCount]$2 = 1(gdb) 

注:4是 NSUTF8StringEncoding 的值。

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

比如 "info symbol 内存地址" 可以获取内存地址所在的 symbol 相关信息:

(gdb) info symbol 0x00000001000017f7main + 343 in section LC_SEGMENT.__TEXT.__text of /Users/LuoZhaohui/Library/Developer/Xcode/DerivedData/RunTimeSystem-anzdlhiwvlbizpfureuvenvmatnp/Build/Products/Debug/RunTimeSystem

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

(gdb) info line *0x00000001000017f7Line 62 of "/Users/LuoZhaohui/Documents/Study/RunTimeSystem/RunTimeSystem/main.m" starts at address 0x1000017f7 <main+343> and ends at 0x10000180a <main+362>.


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

(gdb) show versionGNU gdb 6.3.50-20050815 (Apple version gdb-1708) (Mon Aug  8 20:32:45 UTC 2011)Copyright 2004 Free Software Foundation, Inc.GDB is free software, covered by the GNU General Public License, and you arewelcome to change it and/or distribute copies of it under certain conditions.Type "show copying" to see the conditions.There is absolutely no warranty for GDB.  Type "show warranty" for details.This GDB was configured as "x86_64-apple-darwin".

help 命令:如果忘记某条命令的语法了,可以使用 help 命令名 来获取帮助信息。如:help info 显示 info 命令的用法。

(gdb) help infoGeneric command for showing things about the program being debugged.

List of info subcommands:

info address -- Describe where symbol SYM is storedinfo all-registers -- List of all registers and their contentsinfo args -- Argument variables of current stack frameinfo auxv -- Display the inferior's auxiliary vectorinfo breakpoints -- Status of user-settable breakpointsinfo catch -- Exceptions that can be caught in the current stack frameinfo checkpoints -- Helpinfo classes -- All Objective-C classes......

Type "help info" followed by info subcommand name for full documentation.Command name abbreviations are allowed if unambiguous.(gdb) 

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

有时候我们的程序不知道跑到哪个地方就 crash 了,而 crash 又很难重现。保守的做法是在系统抛出异常之前设置断点,具体来说是在 objc_exception_throw处设置断点。设置步骤为:首先在 XCode 按 CMD + 6,进入断点管理窗口;然后点击右下方的 +,增加新的 Symbolic Breakpoint,在 Symbol 一栏输入:objc_exception_throw,然后点击 done,完成。 这样在 Debug 模式下,如果程序即将抛出异常,就能在抛出异常处中断了。比如在前面的代码中,我让 [firstObjctcrashTest]; 抛出异常。在 objc_exception_throw 处设置断点之后,程序就能在该代码处中断了,我们从而知道代码在什么地方出问题了。

[Cocoa]XCode的一些调试技巧相关推荐

  1. iOS开发之Xcode常用调试技巧总结

    转载自:iOS开发之Xcode常用调试技巧总结 最近在面试,面试过程中问到了一些Xcode常用的调试技巧问题.平常开发过程中用的还挺顺手的,但你要突然让我说,确实一脸懵逼.Debug的技巧很多,比如最 ...

  2. iphone XCode调试技巧之EXC_BAD_ACCESS中BUG解决

    http://mobile.51cto.com/iphone-279455.htm XCode调试技巧之EXC_BAD_ACCESS中BUG解决是本文要介绍的内容,在iphone开发的时候EXC_BA ...

  3. xcode开发html5工具,5个Xcode开发调试技巧

    1.Enable NSZombie Objects(开启僵尸对象) Enable NSZombie Objects可能是整个Xcode开发环境中最有用的调试技巧.这个技巧非常非常容易追踪到重复释放的问 ...

  4. (转)5个Xcode开发调试技巧

    1.Enable NSZombie Objects(开启僵尸对象) Enable NSZombie Objects可能是整个Xcode开发环境中最有用的调试技巧.这个技巧非常非常容易追踪到重复释放的问 ...

  5. Xcode的调试技巧

    转自:http://www.cnblogs.com/daiweilai/p/4421340.html#biyouji 目录 前言 逼优鸡 知己知彼 百战不殆 抽刀断Bug 普通操作 全局断点(Glob ...

  6. [转] Xcode 高级调试技巧

    在苹果的官方文档中列出了我们在调试中能用到的一些命令,我们在这重点讲一些常用的命令 调试本地文件方法(Mac OS X):(lldb) target create "/Users/piaoy ...

  7. Xcode高级调试技巧(1)

    在苹果的官方文档中列出了我们在调试中能用到的一些命令,我们在这重点讲一些常用的命令 调试本地文件方法(Mac OS X):(lldb) target create "/Users/piaoy ...

  8. Xcode 8 中阶调试技巧

    原文:Intermediate Debugging with Xcode 8 作者:George Andrews 译者:kmyhy 更新说明: 本教程由 George Andrews 升级为 Xcod ...

  9. Xcode一种涉及到多桌面的调试技巧

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) Mac本身是支持多桌面功能的,以下是本猫OS界面的截图: 可以 ...

最新文章

  1. 阿里云原生多模数据库Lindorm联合东软云科技,赋能车联网数字化运营运维创新升级
  2. iframe给php传值,向iframe传递参数
  3. 源码分析 Mybatis 的 foreach 为什么会出现性能问题
  4. 阿里云服务器如何快速搭建Docker环境
  5. 中呜机器人编程视频教程_中鸣快车编程入门篇—5.1补充的知识.doc
  6. 16套51单片机开发板资料共享下载,拼命整理
  7. td 提示暂无数据图片同上
  8. cisco2811语音网关+callmanager拨打外线,外线拨入详解配置
  9. 电商产品经理:如何搭建会员管理体系(多图干货)
  10. Qt-高分辨率drawImage模糊问题
  11. powerdesign导出表结构
  12. (附源码)php二手服装网站 毕业设计201711
  13. Tomocat:安装完成,显示HTTP Status 404
  14. 打印机乱码故障解决办法
  15. 带你读懂Pinbar交易信号
  16. FT4232H Android开发 2 - 建立一个FTDI设备的样板工程
  17. SpringBoot实现分布式session
  18. 编译原理—x86汇编指令
  19. 数据结构-中序遍历二叉树(基于C++)
  20. java集合类继承关系图_java集合继承关系图

热门文章

  1. 开题:在移动开发中使用JavaScript进行混合编程提高代码复用率
  2. [20180806]tune2fs调整保留块百分比.txt
  3. Tomcat关闭后,重新启动,session中保存的对象为什么还存在解决方法
  4. filebeat.yml配置和logstash.conf
  5. Daydream VR
  6. Java基础-OOP特性之封装、继承、多态、抽象
  7. linux shell数据重定向(输入重定向与输出重定向)详细分析
  8. Oracle会话和进程数的监控
  9. 为Spring Cloud Config Server配置远程git仓库
  10. css案例学习之全局声明*{} 与body{}的区别