LLDB调试技巧

466 阅读1分钟

LLDB命令

  • expression :作用是执行一个表达式,并将表达式返回的结果输出
  • 执行某个表达式
// 我们在代码运行过程中,可以通过执行某个表达式来动态改变程序运行的轨迹。假如我们在运行过程中,突然想把self.view颜色改成红色,看看效果。我们不必写下代码,重新run,只需暂停程序,用expression改变颜色,再刷新一下界面,就能看到效果
// 改变颜色   (lldb) expression -- self.view.backgroundColor = [UIColor redColor]   
// 刷新界面   (lldb) expression -- (void)[CATransaction flush]
  • 将返回值输出
  // 也就是说我们可以通过expression来打印东西。假如我们想打印self.view:
  //  (lldb) expression -- self.view
  // (UIView *) $1 = 0x00007fe322c18a10
  • p & print & call

    • print: 打印某个东西,可以是变量和表达式
    • p: 可以看做是print的简写
    • call: 调用某个方法
    • 表面上看起来他们可能有不一样的地方,实际都是执行某个表达式(变量也当做表达式),将执行的结果输出到控制台上。所以你可以用p调用某个方法,也可以用call打印东西
  • po

    • OC里所有的对象都是用指针表示的,所以一般打印的时候,打印出来的是对象的指针,而不是对象本身。如果我们想打印对象。我们需要使用命令选项:-O。为了更方便的使用,LLDB为expression -O --定义了一个别名:po
  • thread(thread backtrace & bt)

    • 有时候我们想要了解线程堆栈信息,可以使用thread backtrace
    • thread backtrace作用是将线程的堆栈打印出来。我们来看看他的语法
    thread backtrace [-c <count>] [-s <frame-index>] [-e <boolean>]
    //thread backtrace后面跟的都是命令选项:
    //-c:设置打印堆栈的帧数(frame)
    //-s:设置从哪个帧(frame)开始打印
    //-e:是否显示额外的回溯
    //实际上这些命令选项我们一般不需要使用。
    
    • 当发生crash的时候,我们可以使用thread backtrace查看堆栈调用。LLDB还为backtrace专门定义了一个别名:bt,他的效果与thread backtrace相同,如果你不想写那么长一串字母,直接写下bt即可。
  • thread return

    • Debug的时候,也许会因为各种原因,我们不想让代码执行某个方法,或者要直接返回一个想要的值。这时候就该使用thread return
      //thread return [<expr>]
      //thread return可以接受一个表达式,调用命令之后直接从当前的frame返回表达式的值。
      // e.g.
      // 方法
      -(BOOL)someth{
      	return YES;
      }
      
      // 我们可以改变其返回值
      //(lldb) thread return NO
      

##Chisel

  • 介绍 Chisel是Facebook发布的LLDB命令的集合,用来帮助调试iOS应用程序。
  • 安装
// 安装需要使用到Homebrew,如果还没有安装Homebrew,可以使用下面的命令安装,如果你已经安装了,可以跳过这一步
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

brew update
brew install chisel
  • ~路径下创建.lldbinit文件
touch .lldbinit 
open .lldbinit
  • 输入命令
command script import /usr/local/opt/chisel/libexec/fblldb.py
  • 更新
brew upgrade chisel
  • 相关使用可以去其GitHub上面看看:Chisel