LLDB调试器

前言

在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调试程序

  • breakpoint 操作断点的命令

如果想在某个文件中的某行设置一个断点,可使用以下命令:
(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 设置内存断点,当我们逆向第三方程序,不知道源码的时候可以根据内存地址给对象设置断点

  • (lldb)watchpoint set v -w read_write _abc3 (给对象_abc3添加断点,进行观察_abc3值的变化)

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 极其详细,内容丰富。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,186评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,858评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,620评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,888评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,009评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,149评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,204评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,956评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,385评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,698评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,863评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,544评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,185评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,899评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,141评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,684评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,750评论 2 351

推荐阅读更多精彩内容

  • [转]浅谈LLDB调试器文章来源于:http://www.cocoachina.com/ios/20150126/...
    loveobjc阅读 2,488评论 2 6
  • 前言 在iOS开发中经常使用NSLog进行打印调试,简单方便。NSLog每次调用会打印大量信息,时间、名称、进程等...
    z4ywzrq阅读 1,232评论 0 5
  • 对于LLDB调试相信很多开发者都不陌生但是也仅仅停留在下断点看数据的阶段,使用最多的命令也就是po甚至包括我在内的...
    初光夫阅读 1,254评论 2 51
  • LLDB的Xcode默认的调试器,它与LLVM编译器一起,带给我们更丰富的流程控制和数据检测的调试功能。平时用Xc...
    CoderSC阅读 1,351评论 0 2
  • 转载 与调试器共舞 - LLDB 的华尔兹: https://objccn.io/issue-19-2/ 推荐:i...
    F麦子阅读 3,331评论 0 10