Low Level Debugger 一个不Low的调试器。
// help命令可以列出能使用的命令列表
(lldb)help
常用的lldb指令
// expression/p 使用LLDB的默认格式显示任何返回值。
(lldb)expression xxx
(lldb)p xxx //缩写
// 用于临时修改变量的值,动态调试内存
(lldb)expression $0 = xx
(lldb)p $0 = xx //缩写
// 打印变量的内容,如果是对象,其打印的内容由 -object-description 决定
(lldb)expression -O xxx
(lldb)po xxx //缩写
// 查看image(Mach-O文件)的列表
(lldb)image list
// 可以快速查看一个类的信息、头文件信息
(lldb)image lookup -t Class
// 用于寻找栈地址对应的代码位置
(lldb)image lookup -a 0x00007fff47229ecb
// 断点操作 breakpoint
// 查看断点列表
(lldb)breakpoint list
// 设置断点
(lldb)breakpoint set -n methodName //函数
(lldb)breakpoint set -n "-[className methodName]" //OC方法
// 通过方法名设断点
(lldb)breakpoint set --selector methodName
(lldb)breakpoint set --file fileName --selector methodName //指定某个文件内
// 循环设置,满足方法名带name的
(lldb)breakpoint set -r name
(lldb)breakpoint set --file fileName -r name //指定某个文件内
// 设置内存断点
(lldb) b -a 0x3243252
// 通过设置内存地址上的观察点
(lldb)watchpoint set expression 0x32524543
// 在变量上设置观察点
(lldb)watchpoint set variable xxx
> (lldb)c(continue) //继续执行当前进程中的所有线程。
> (lldb)n <cmd-options> [<thread-id>] //源级单步,单步调用。当前线程默认值,除非指定。
> (lldb)s <cmd-options> [<thread-id>] //源级单步,单步调用。当前线程默认值,除非指定。
> (lldb)finish <cmd-options> [<thread-id>] //完成当前堆栈帧的执行并在返回后停止。除非指定,否则默认为当前线程。
// 禁用相应断点
(lldb)breakpoint disable 1(组号)
(lldb)breakpoint disable 1.1(第1组,第1个)
// 启用相应断点
(lldb)breakpoint enable 1(组号)
(lldb)breakpoint enable 1.1(第1组,第1个)
// 删除相应断点「只能整组删除,无法删除组中某一个」
(lldb)breakpoint delete 1(组号)
(lldb)breakpoint delete 1.1(第1组,第1个) //只会对单个进行禁用,无法删除
// 用于添加、删除和列出遇到断点时执行的LLDB命令的命令。
(lldb)breakpoint command add 1(组)
(lldb)breakpoint command delete 1(组)
(lldb)breakpoint command list 1(组)
// 用于在调试器上操作的命令目标是执行到断点。「全局断点」
(lldb)target stop-hook add -o "lldb 指令"
> 可以通过 .lldbinit 进行配置,便捷使用,避免每次都要重新设置。
// 查看函数调用堆栈
(lldb)bt
// 查看对应函数详细,通过 up 和 down 可以追踪函数的调用和被调用关系
(lldb) frame select 0
// 查看函数内部的局部变量,例如调用者、方法名称以及参数
(lldb)frame variable