lldb使用

作者: 戒惜舍得 | 来源:发表于2018-04-22 09:09 被阅读65次

    lldb

    为什么学习LLDB

    工作中花大量时间调试

    lldb 减少调式时间,增加乐趣

    不写不必要的打印 log 代码

    学习 LLDB 是一个高回报的时间投资

    LLDB 是什么

    LLDB是Low Level Debugger的简称,在iOS开发的调试中LLDB是经常使用的,LLDB是Xcode内置的动态调试工具。

    固定语法

    <command> [<subcommand> [<subcommand>...]] <action> [-options [option-value]] [argument [argument...]]

    • <command>(命令)和<subcommand>(子命令):LLDB调试命令的名称。命令和子命令按层级结构来排列:一个命令对象为跟随其的子命令对象创建一个上下文,子命令又为其子命令创建一个上下文,依此类推。

    • <action>:执行命令的操作

    • <options>:命令选项

    • <arguement>:命令的参数

    • []:表示命令是可选的,可以有也可以没有

    • 当你使用命令选项的时候,需要在命令选项后面加--区分命令选项和参数。

    expression

    简写

    • expr

    后面 跟表达式

    • 表达式

      • 表达式(expression)是值、变量和运算符的组合。 值自身也被认为是一个表达式,变量也是,因此下面都是合法的表达式:

        • 42

        • n

        • n +5

    等同于p & print & call

    • 等同于不加

    • --: 命令选项结束符,表示所有的命令选项已经设置完毕,如果没有命令选项,--可以省略

    -O

    • 后面必须加 —

      • expression -O -- self
    • 等于 po

    按固定 模板 格式 输出

    • po [[NSString alloc] initWithFormat:@"Item index is: %d", index]v

    thread

    thread backtrace

    • 打印 线程的 堆栈信息

    • 简写

      • bt

    thread return

    • 让函数直接返回一个值,不会执行函数后面的代码

    thread continue

    • 简写

      • c
    • 作用

      • 过掉当前断点

    thread over

    • 作用

      • 执行当前 行的 代码

        • 会把 子函数一步运行
    • 简写

      • next

      • n

    thread step-in

    • 简写

      • step

      • s

    • 作用

      • 单步运行

        • 遇到子函数会进入子函数

    thread step-out

    • 简写

      • finish

        • 不是 f
    • 作用

      • 执行完当前函数的全部代码

        • 返回上一个函数

    指令级别的 命令

    • Instruction level

      • 指令级别的
    • 汇编

      • 一句源码

        • 可能会转成多个 汇编 代码

        • NSLog 四句汇编

    • thread step-inst-over

      • nexti

        • ni

          • 汇编一句一句进行
    • thread step-inst

      • stepi

        • si

          • 汇编一句一句进行

          • 遇到汇编函数,会进入汇编函数内部

    frame

    frame variable

    • 打印 当前 栈帧的变量

      • 得到的结果和 Xcode 断点时 左边导航的堆栈 调用 面板相似
    • 如果你 逆向的话 是在 命令行里 执行命令,不是在 Xcode 里执行命令,所以你要 掌握这个命令

    breakpoint

    简写

    • br

    breakpoint list

    • 列出所有的断点

      • 每个断点都有自己的编号

    breakpoint enable 断点编号

    • 启用该编号的断点

    • 简写

      • en

    breakpoint delete 断点编号

    • 删除该编号的断点

    breakpoint disable 断点编号

    • 禁用该编号的断点

    • 简写

      • dis

    breakpoint set

    • -a

      • 函数地址
    • -n

      • 函数名

      • —name

      • string

        • 里面 哪个控制器的 方法方法

        • “-[SKTGraphicView alignLeftEdges:]”

      • 结果

        • lldb) br set -n loadData
          - >Breakpoint 2: 4 locations

          • 意思是 你设置了 断点编号为 2的断点

          • locations

            • 当前命令 设置了 4处断点
    • -r

      • 正则表达式
    • -s

      • 动态库

      • -n

        • 函数名
    • breakpoint set --file foo.c --line 12

      • -f

        • 在某个文件打断点

        • —file

      • -l

        • 在 某一行打断点v

        • —line

    breakpoint command

    • add 编号

      • 给当前编号的断点填加操作

        • 执行普通代码
      • 最后输入 Done 结束操作

    • delete 编号

      • 删除当前编号断点的所有操作
    • list 编号

      • 当前断点设置了哪些操作

    watchpoint

    设定 观察点

    • 这个值 被执行 写入操作时就会 断住

    set

    • variable

    • expression

    list

    disable 编号

    enable 编号

    delete 编号

    command

    • add

    • list

    • delete

    image

    lookup

    • -a 地址

      • 根据内存地址 查找哪一行的 代码

      • Xcode 运行 程序时 OC 的代码错误崩溃 经常停在 main 函数,这个时候

    • -t 类型

      • 查找某个类型的信息

    type lookup

    类名

    • 查看一个类

    tips

    help

    • help 命令

      • help + 命令

        • 查看这个命令的具体使用
      • 查看详细的文档

        • lldb 值得花时间学习

    enter 键

    • 重复上面的操作

    尽量不使用

    • 简写

    如果你使用lldb 改变了界面显示内容想立刻看到更改后的效果

    • oc

      • e (void) [CATransaction flush]
    • swift

      • p CATransaction.flush()
        breakpoint set --selector viewDidLoad

    了解更多:

    https://lldb.llvm.org/tutorial.html

    https://developer.apple.com/library/content/documentation/IDEs/Conceptual/gdb_to_lldb_transition_guide/document/lldb-basics.html

    https://www.jianshu.com/p/e89af3e9a8d7

    image.png

    相关文章

      网友评论

        本文标题:lldb使用

        本文链接:https://www.haomeiwen.com/subject/omyqlftx.html