[iOS-基础-BBC]LLDB调试

0. 为什么写LLDB的文章

  • 我看的有的同事在开发的时候:临时想看一个变量的值,就在对应代码行写上一个Log >> 编译 >> 运行 >> 到指定页面 >> 观察控制台.看到这里请反省一下自己是否现在还在用这种令人窒息的操作?如果是,那么这篇文章对你很重要请务必认真阅读;

1.LLDB简介

*LLDBXCode5之后自带的debugger.
*LLDB的homepageLLDB,有兴趣可以去自行了解.

  • 其实你在之前就已经接触并使用到了LLDB,如下图中所示堆栈区var展示区控制台、和toolbar均为LLDB的操作区域.其中除了控制台以外其余的3个区域为XCodeLLDB可视化展示.(即其余3个区域的功能都在控制台中得到实现)
[iOS-基础-BBC]LLDB调试_第1张图片

2. LLDB指令

  • Xcode进入断点Crash时都会进入LLDB,此处的LLDB及表示已经进入LLDB并可输入LLDB指令.
[iOS-基础-BBC]LLDB调试_第2张图片

2.1 help指令

  • 直接输入help指令会打印出所有的LLDB指令
[iOS-基础-BBC]LLDB调试_第3张图片
image.png
  • 输入help 会打印特定指令的相关说明
[iOS-基础-BBC]LLDB调试_第4张图片
image.png

2.2 print、printobject 、call指令

2.2.1 print指令

  • print指令(可简写为p)为打印基本信息打印基本类型的值,或者打印对象的类型和指针.
[iOS-基础-BBC]LLDB调试_第5张图片
image.png

2.2.2 printobject指令

  • printobject(可简写为po)为打印对象信息的指令,即调用对象的 description方法,和NSLog作用相同
image.png

2.2.3 call指令

  • call指令可以执行一行代码但不会处理其返回值:如下图所示redViewbackgroundColor设置错误了,我们可以通过call指令修改过来
[iOS-基础-BBC]LLDB调试_第6张图片
  • 总结:三种指令均可执行指令附带的代码,尽在返回结果上的处理不同.p指令打印返回值的基本信息,po指令打印返回值的description,call指令不打印返回值.绝大多数情况下用po指令即可.

2.3 thred指令

  • 如图所示代码将断点打在37行
[iOS-基础-BBC]LLDB调试_第7张图片
image.png
  • 控制台结果如下,左侧的var展示区则显示了当前作用域的变量

    [iOS-基础-BBC]LLDB调试_第8张图片
    image.png

  • 此时如果我想获取p_do1中的变量值改怎么做?

    • 输入指令thread backtrace 获取堆栈信息:当前栈为frame #0, p_do1栈为frame #1;
[iOS-基础-BBC]LLDB调试_第9张图片
image.png
  • 输入 frame select 1指令进入p_do1的栈内,左侧变显示其作用域内的变量信息.
    [iOS-基础-BBC]LLDB调试_第10张图片
    image.png

2.4 return指令

  • Debug的时候,也许会因为各种原因,我们不想让代码执行某个方法,或者要直接返回一个想要的值。这时候就该thread return上场了。
    thread return可以接受一个表达式,调用命令之后直接从当前的frame返回表达式的值。

  • 如下图此代码在控制台的打印结果应该是25963

    [iOS-基础-BBC]LLDB调试_第11张图片
    image.png

  • 但是在断点处输入thread return 1024打印结果结变为1024

[iOS-基础-BBC]LLDB调试_第12张图片
image.png

3. 最后LLDB还有更多强大的功能,但是由于个人能力和时间有限,仅能讲到这里.有兴趣的小伙伴可以深入研究并分享.谢谢!

你可能感兴趣的:([iOS-基础-BBC]LLDB调试)