debug

流程控制

  • 当你通过 Xcode 的源码编辑器的侧边槽 (或者通过下面的方法) 插入一个断点,程序到达断点时会就会停止运行。

  • 调试条上会出现四个你可以用来控制程序的执行流程的按钮。

  • 从左到右,四个按钮分别是:continue,step over,step into,step out。

    • 第一个,continue 按钮,会取消程序的暂停,允许程序正常执行 (要么一直执行下去,要么到达下一个断点)。在 LLDB 中,你可以使用 process continue 命令来达到同样的效果,它的别名为 continue,或者也可以缩写为 c。

    • 第二个,step over 按钮,会以黑盒的方式执行一行代码。如果所在这行代码是一个函数调用,那么就不会跳进这个函数,而是会执行这个函数,然后继续。LLDB 则可以使用 thread step-over,next,或者 n 命令。

    • 如果你确实想跳进一个函数调用来调试或者检查程序的执行情况,那就用第三个按钮,step in,或者在LLDB中使用 thread step in,step,或者 s 命令。注意,当前行不是函数调用时,next 和 step 效果是一样的。

    • 大多数人知道 c,n 和 s,但是其实还有第四个按钮,step out。如果你曾经不小心跳进一个函数,但实际上你想跳过它,常见的反应是重复的运行 n 直到函数返回。其实这种情况,step out 按钮是你的救世主。它会继续执行到下一个返回语句 (直到一个堆栈帧结束) 然后再次停止。

断点

  • 我们都把断点作为一个停止程序运行,检查当前状态,追踪 bug 的方式。但是如果我们改变和断点交互的方式,很多事情都变成可能。

    • 断点允许控制程序什么时候停止,然后允许命令的运行。
  • 想象把断点放在函数的开头,然后用 thread return 命令重写函数的行为,然后继续。想象一下让这个过程自动化,听起来不错,不是吗?

管理断点

  • Xcode 提供了一系列工具来创建和管理断点。我们会一个个看过来并介绍 LLDB 中等价的命令 (是的,你可以在调试器内部添加断点)。

  • 在 Xcode 的左侧面板,有一组按钮。其中一个看起来像断点。点击它打开断点导航,这是一个可以快速管理所有断点的面板。

  • 在这里你可以看到所有的断点 - 在 LLDB 中通过 breakpoint list (或者 br li) 命令也做同样的事儿。你也可以点击单个断点来开启或关闭 - 在 LLDB 中使用 breakpoint enable breakpointIDbreakpoint disable breakpointID
(lldb) br li
Current breakpoints:
1: file = '/Users/arig/Desktop/DebuggerDance/DebuggerDance/main.m', line = 16, locations = 1, resolved = 1, hit count = 1 1.1: where = DebuggerDance`main + 27 at main.m:16, address = 0x000000010a3f6cab, resolved, hit count = 1 (lldb) br dis 1
1 breakpoints disabled.
(lldb) br li
Current breakpoints:
1: file = '/Users/arig/Desktop/DebuggerDance/DebuggerDance/main.m', line = 16, locations = 1 Options: disabled 1.1: where = DebuggerDance`main + 27 at main.m:16, address = 0x000000010a3f6cab, unresolved, hit count = 1 (lldb) br del 1
1 breakpoints deleted; 0 breakpoint locations disabled.
(lldb) br li
No breakpoints currently set.
  • 如果想在 Xcode 的UI上创建符号断点,你可以点击断点栏左侧的 + 按钮。

  • 然后选择第三个选项:

  • 这时会出现一个弹出框,你可以在里面添加例如 -[NSArray objectAtIndex:] 这样的符号断点。这样每次调用这个函数的时候,程序都会停止,不管是你调用还是苹果调用。

  • 如果你 Xcode 的 UI 上右击任意断点,然后选择 "Edit Breakpoint" 的话,会有一些非常诱人的选择。

  • 这里,断点已经被修改为只有当 i 是 99 的时候才会停止。你也可以使用 "ignore" 选项来告诉断点最初的 n 次调用 (并且条件为真的时候) 的时候不要停止。

断点行为 (Action)

  • 上面的例子中,你或许想知道每一次到达断点的时候 i 的值。我们可以使用 p i 作为断点行为。这样每次到达断点的时候,都会自动运行这个命令。

  • 你也可以添加多个行为,可以是调试器命令,shell 命令,也可以是更直接的打印:

    • 可以看到它打印 i,然后大声念出那个句子,接着打印了自定义的表达式。

最新文章

  1. Tomcat源代码-门面模式(Facade)
  2. 利用windows服务+timer或者windows任务计划程序+控制台进行进行每日邮件推送
  3. FusionCharts简单教程(三)-----FusionCharts的基本属性
  4. java中map插入相同的key
  5. 【PHPsocket编程专题(实战篇①)】php-socket通信演示
  6. 【CSS3】Advanced5:At Rules:@import, @media, and @font-face
  7. js拖拽进度条
  8. Lua无法排序的问题(Key需要是连续的)
  9. ajax 调用 java webapi 多个参数(二)
  10. 原生JS和JQ窗口定位属性对照表
  11. ServiceMesh了解一下
  12. cordova(安卓)(腾讯信鸽注册绑定与反绑定) 插件开发
  13. vim 删除
  14. Cisco无线AP上联口为trunk时无法注册故障处理
  15. JTable 查询
  16. 15. 使用Apache Curator装饰ZooKeeper
  17. Oracle居然把Java EE的未来押在Rest API上了
  18. [翻译] VBPieChart
  19. resp.getWriter().print的注意点
  20. angular的属性绑定

热门文章

  1. java Http post请求发送json字符串
  2. POJ1236 Network of Schools —— 强连通分量 + 缩点 + 入出度
  3. SERVLET类常用接口及方法
  4. mac下安装eclipse+CDT
  5. Java:目录
  6. Ajax 异步查询 ,刷新页面的一部分
  7. HDU2262;Where is the canteen(高斯消元+期望)
  8. iOS 集成React Native到现有iOS应用(Ficow本人实测,Xcode 8.3,iOS 10.3)
  9. Unix\Linux | 总结笔记 | 命令_ WC
  10. SQL 初级教程学习(五)