LLDB之详细信息

在iOS开发中,详细大家对Xcode都不陌生,对lldb也不陌生吧,回想大学刚毕业时,第一次出来面试时,面试官问我,在平时的学习和写代码的过程中,是否会使用lldb进行debug,那会还有点懵,貌似没使用过lldb工具吧,殊不知,其实lldb就在我们xcode打断点后,下方弹出的控制台,那个就是lldb,最近一段时间有时间学习,对lldb进行了一次更深层次的了解与学习,lldb是在逆向开发中不可或缺的一样神器。

在正向开发中,我们一般都是通过图形化界面进行断点的置放,在逆向中,通常都是使用lldb来打断点。

通过使用 breakpoint 在lldb环境下,可以对对应的函数名进行断点。

1. breakpoint  

breakpoint set -n  "objectMothed" (对指定函数设置断点)

breakpoint disable  1.1   (对断点列中1.1断点进行 取消断点操作)

breakpoint enable   1.1   (对断点列中1.1断点进行 重启断点操作)

breakpoint delete  1 (在删除断点时,只能按组删除,如果一组中有多个断点,无法通过1.1方式删除指定断点, 如无指定 目标组数 则删除所有断点)

breakpoint list (可查询当前存在多少组断点,并且显示所有断点详情)

通过上面列举的几个AIP 我们来进行简单的操作,详情,请看下面。


现在来解释一下,上面我标注的三处位置。

1 通过使用 breakpoint set -n "viewDidLoad"  成功为项目中所有viewDidLoad 函数打上断点。并且提示 Breakpoint 1: 343 locations. 这里解释一下:Breakpoint 1 代表一组断点  343 locations 代表 有343处

2 通过使用 breakpoint disable 1.1 成功禁止(关闭)1.1位置的断点。

3 通过使用 breakpoint list 查看所有断点,并且打印出 1: name = 'viewDidLoad', locations = 343, resolved = 342, hit count = 0

此处不难看出 name = 'viewDidLoad' 就是我们刚才用 breakpoint 下断点时的函数名称。locations = 343 (共有343处断点)。但是 resolved = 342 (可生效的断点有 432处)。  此时我们看看图中三指的位置(1.1),在hit count = 0  后面 还跟着 Options: disabled ,其他断点都是没有跟 Options: disabled,这个就是我们上面通过 breakpoint disable 1.1 禁止的断点(也就是未生效断点,可通过 breakpoint enable 1.1 使该断点生效)。

在此顺便提一下 1.1中 address = 0x00000002340c30a8(这是该函数的内存地址,因为xcode在编译时就将该函数加载入内存了)

我们还可以通过 breakpoint help 来获取 breakpoint 相关方法介绍 和 使用。



在下断点时,我们是使用 breakpoint set -n "viewDidLoad"来设置的,我们同样可以使用 help breakpoint set 来查看 set中有多少方法可以使用


一个set 就包含了这么多东西,我靠( ‵o′)凸,还是全英文的,各位有兴趣的就自行了解一下就行了。不过里面的方面是经常会使用到的,后续在使用的时候在跟大家慢慢列举和说明。

breakpoint set -r viewDidLoad 该方法是使用正则表达式,在项目中遍历所有包含有viewDidLoad字段的函数名称,为其打上断点。

Tisp:所有 breakpoint set 都能简写为 b 。例如 breakpoint set -r viewDidLoad 可以简化成 b -r viewDidLoad.


2 bt

    使用LLDB能在堆栈中查看信息,在断点后,可以使用bt 来打印堆栈的调用信息。 



在查看堆栈时,还能使用 up down  等命令 去到上一个堆栈信息中。

如果 我们要查看当前堆栈中,某个详细堆栈中的信息,我们可以使用 frame select '堆栈编号'


在这个实例中,我定位到当前堆栈的第39行,使用 frame select 39 后,我们能从当中获取到一些信息,在逆向中时候用时,显示的都是汇编语言,在自己项目中时,这里出现的是源码。

Tisp 在我们定位到某个 函数时,可以使用 frame variable 来获取当前函数调用参数信息。

当 我们想给对象的某个属性添加断点时,我们可以使用 watchpoint set expression + 对象属性的内存地址,当该属性发生改变时,就会触发该断点,让我们来详细看看下图。


watchpoint set expression +对象属性的内存地址后,显示已经成功添加一个内存断点。这时我们使用c跳过当前断点后,我们进行对象属性值的改变,这时就会触发已经设置好的内存断点,并且在断点时,还是打印出了 old value 和 new value 并在后面附带出内存地址 ,我们通过常用的lldb命令 PO 打印内存地址中的参数,在此,我们是否想到了跟开发中KVO有点类似??KVO同样有 old value 和 new value 


同样的,我们可以为断点添加运行代码,让我们来看看下文。

breakpoint command add + 断点组数 为该断点添加,并提示 Enter your debugger command(s).  Type 'DONE' to end.

当你在最后写入DONE时,结束该允许代码添加。

同样的,我们也可以删除我们编写的内存代码,查看断点中内存组数。

使用 breakpoint command list 5 查看 内存断点中相关的代码。

使用 breakpoint command delete 5 删除 内存断点中相关的代码。


3 target stop-hook 

在执行断点时,有时,我们需要在触发断点时,顺带打印一些信息,例如函数的参数。这时,我们就可以使用 target stop-hook  ,接下来让我们使用help 来了解一下 target stop-hook 有哪些功能呢。


这个 target stop-hook 里面的内容结构跟breakpoint 结构类似, 增删查禁启,细心的小伙伴不难发现,这其中的用法基本都是一样的,在我看来 这里面除了需要仔细研究 add 中是否有其他构造形式,其他几个用法 都比较单一。

这时,我们来试试 target stop-hook add help 看看 add里面有没有更深层次的东西。

当我们在lldb中输入 target stop-hook add help 时 会发现 :Enter your stop hook command(s).  Type 'DONE' to end.再次出现内存代码块命令模式。(我在里面一顿操作猛如虎,暂时还不知道如何触发,后期研究到了再回来改写一下。)

从上面得知 target stop-hook add help 不行,那我们就换种写法,help target stop-hook add 此时lldb终于迎来我们熟悉的界面了。


在此就不一一翻译了,有兴趣研究的小伙伴,私下去研究一下。后续,我有用到的也会更新上来。


Tisp:如果有些常用的lldb语句,在每次一次启动后,都要手动敲进去是不是很麻烦。??在此,我们可以使用预加载文件,当我们项目跑起来的时候,就会自动把lldb语句加载入当期项目中,接下来,让我们一起来了解一下。

首先,在我们的系统的根目录下 查找一下 看看是否存在 ".lldbinit" 文件(由于.开头的文件都是隐藏文件,还需打开文件夹隐藏文件显示才能看到),如果没有我们可以使用 终端命令在跟目录下创建一个. 

1. touch .lldbinit

2. open .lldbinit   打开.lldbinit文件,然后把 示例代码  target stop-hook add -o "frame variable"  放入文件中 command + S 保存,这是重新运行项目就会发现控制台会自己动把  target stop-hook add -o "frame variable" 添加进入。(注:然后是刚创建 .lldbinit 的 则需要完全关闭Xcode,重新打开才能生效。)

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

推荐阅读更多精彩内容

  • iOS调试之LLDB Xcode内嵌了LLDB控制台,在Xcode代码编辑区的下方。shift + cmd + y...
    comst阅读 1,478评论 0 3
  • Xcode Debugging 你的代码,或者任何人的代码中总会有bug存在,你可以把调试看做是更好地理解代码的一...
    吃蘑菇De大灰狼阅读 2,448评论 0 2
  • [转]浅谈LLDB调试器文章来源于:http://www.cocoachina.com/ios/20150126/...
    loveobjc阅读 2,507评论 2 6
  • 你是否曾经苦恼于理解你的代码,而去尝试打印一个变量的值? NSLog(@"%@", whatIsInsideThi...
    木易林1阅读 955评论 0 4
  • 管理应用程序的数据模型以及和系统的交互. Topics Application : 确保用户数据的隐私 :通过保护...
    Natus_Vincere阅读 581评论 0 0