LLDB调试器

2018-05-14  本文已影响0人  为自己丶拼个未来

前言

在iOS开发中经常使用NSLog进行打印调试,简单方便。NSLog每次调用会打印大量的信息,时间、名称、进程等信息,多次调用打印会消耗资源,程序变慢效率底下,每次调试完毕要及时清理NSLog。另外,每次想要NSLog打印看到信息,需要重新编译运行,对于较大的项目费时费力,所以调试最好使用调试器,LLDB调试器功能强大,由于能力有限只能简单介绍一下LLDB调试器的皮毛。

LLDB

LLDB是新一代高性能调试器,是Xcode上的默认调试器,支持调试C,Objective-C和C ++。LLDB命令结构有统一的格式。

LLDB命令结构

<noun>命令、<verb>命令操作、options命令选项、argument参数。命令各个元素之间用空格隔开,如果参数之中有空格则需要加上双引号。如果参数中带有反斜杠和双引号,则需要在其前面加上反斜杠。

options命令选项可以放在命令行的任何地方,但是如果argument参数以“-”开头,那么必须在option后面添加“--”结束标志进行区分,从而确定option的正确位置。例如你想启动一程序,“process launch”命令的option为“--stop-at-entry”,同时希望命令的argument为“-program_arg value”,你应该输入的命令为:

(lldb) process launch --stop-at-entry -- -program_arg value

help,它会列举出所有的命令。可以通过 help <command> 来了解更多细节,例 help print、help thread
详细的LLDB命令可以参考 LLDB command examples 命令总览。

在Xcode中使用LLDB调试程序

如果想在某个文件中的某行设置一个断点,可使用以下命令:
(lldb) breakpoint set --file foo.c --line 12

如果想给某个函数设置断点,可使用以下命令:
(lldb) breakpoint set --name foo

如果想给C++中所有命名为foo的方法设置断点,可以使用以下命令:
(lldb) breakpoint set --method foo

如果想给Objective-C中所有命名为alignLeftEdges:的选择器设置断点,则可以使用以下命令:
(lldb) breakpoint set --selector alignLeftEdges: (此命令会将所有方法名为alignLeftEdges:的函数添加断点,可能添加很多个断点)
(lldb)breakpoint set --selector '-[ViewController didReceiveMemoryWarning]' (为ViewController个类中的didReceiveMemoryWarning方法添加断点)

我们可以使用—shlib 来将断点限定在一个特定的可执行库中:
(lldb) breakpoint set --shlib foo.dylib --name foo
看吧,断点设置命令还是很强大的。

apropos 列出与Word或主题相关的调试器命令

breakpoint 操作断点的命令

watchpoint 设置内存断点,当我们逆向第三方程序,不知道源码的时候可以根据内存地址给对象设置断点

bugreport 创建特定领域错误报告的命令。

command 管理自定义LLDB命令的命令。

disassemble 拆卸当前指定的指令,默认为当前函数为当前线程和堆栈帧

expression 评估当前线程上的表达式。任何返回值与LLDB的默认格式。

frame 命令选择和检查当前线程的堆栈帧,GDB远程通过远程GDB服务器连接到进程,如果没有主机指定localhost假设

gui 切换到基于诅咒的GUI模式。

kdp-remote 通过远程KDP服务器连接进程,如果没有UDP端口被指定,假定端口41139。

language 特定于源语言的命令

log 控制LLDB内部记录命令。

memory 在当前目标上操作内存的命令过程

platform 管理和创建平台的命令

plugin 管理LLDB插件.

process 与当前进程交互的命令平台

quit 退出LLDB调试器。

register 为当前线程访问寄存器的命令栈帧

script 使用提供的代码调用脚本解释器,显示任何结果。启动交互式解释器,如果没有提供代码。

settings 管理LLDB设置命令

source 检查由调试描述的源代码的命令,当前目标过程的信息。

target 在调试器对象上操作的命令

thread 中的一个或多个线程操作的命令目前的过程

type 在类型系统上操作的命令.

version 显示LLDB调试器版本.

add-dsym 将调试符号文件添加到目标当前模块中的一个通过指定调试符号文件的路径,或使用选项来指定下载符号的模块。

attach 通过ID或名称附加到进程.

b 使用几个速记格式中的一个设置断点

bt 显示当前线程的调用堆栈。任何数字参数最多显示许多帧。参数“所有”显示所有的线程

c 继续执行当前进程中的所有线程.

call 评估当前线程上的表达式。显示任何返回值与LLDB的默认格式

continue 继续执行当前进程中的所有线程.

detach 从当前目标进程分离.

di 拆卸当前目标中指定的指令,默认为当前线程的当前功能和栈帧

dis 拆卸当前目标中指定的指令,默认为当前线程的当前功能和栈帧

display 在每一站评估表达式(参见“帮助目标”停止钩子)

down 选择一个较新的堆栈帧。默认为移动一帧数字参数可以指定任意数量

env 查看和设置环境变量的简写.

exit 退出LLDB调试器.

f 从当前范围内选择索引的当前堆栈帧线程(见螺纹回溯”。)

file 使用参数作为主要可执行文件创建目标.

finish 完成执行当前堆栈帧后停止返回,默认为当前线程,除非指定****.

image 为一个或多个目标访问信息的命令模块

j 将程序计数器设置为新地址.

jump 将程序计数器设置为新地址.

kill 终止当前目标进程.

l 使用几个速记中的一个列出相关的源代码格式

list 使用几个速记中的一个列出相关的源代码格式

n 源级单步,单步调用。默认为当前线程,除非指定

next 源级单步,单步调用。默认为当前线程,除非指定

nexti 单步单步执行指令,默认为当前线程,除非指定

ni 单步单步执行指令,默认为当前线程,除非指定

p 评估当前线程上的表达式。显示任何返回值与LLDB的默认格式

parray 评估当前线程上的表达式。显示任何返回值与LLDB的默认格式

po 评估当前线程上的表达式。显示任何由类型作者控制的格式返回值

poarray 评估当前线程上的表达式。显示任何返回值与LLDB的默认格式

print 评估当前线程上的表达式。显示任何返回值与LLDB的默认格式

q 退出LLDB调试器

r 在调试器中启动可执行文件

rbreak 在可执行文件中设置断点或断点集。

repl 评估当前线程上的表达式。显示任何返回值与LLDB的默认格式

run 在调试器中启动可执行文件.

s 源级单步,单步调用。默认为当前线程,除非指定

si 单步单步执行指令,默认为当前线程,除非指定

sif 通过当前块,如果直接单步执行停止为一个函数的名称相匹配的targetfunctionname

step 源级单步,单步调用。默认为当前线程,除非指定

stepi 单步单步执行指令,默认为当前线程,除非指定

t 更改当前选定的线程.

tbreak 使用一一个快捷键中的一个设置断点格式

undisplay 停止在每一站显示表达式(由停止钩子指定)指标。)

up 选择一个旧的堆栈帧。默认为移动一帧,一个数字参数可以指定任意数量

x 从当前目标进程的内存中读取

喜欢就点个 💗 吧

如果需更详细了解更多调试资料 请点击 宇文鑫宇 分享的 blog.csdn.net/hardworkingbee/article/details/50441269 极其详细,内容丰富。

上一篇下一篇

猜你喜欢

热点阅读