美文网首页
LLDB之详细信息

LLDB之详细信息

作者: 小昊昊_iOS | 来源:发表于2019-12-14 16:56 被阅读0次

在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,重新打开才能生效。)

相关文章

  • LLDB之详细信息

    在iOS开发中,详细大家对Xcode都不陌生,对lldb也不陌生吧,回想大学刚毕业时,第一次出来面试时,面试官问我...

  • xcode调试技巧

    Xcode调试技巧之:LLDB Xcode调试技巧之:LLDB 1.输出视图层级关系(这是一个被隐藏的命令):po...

  • iOS之LLDB常用调试命令

    iOS之LLDB常用调试命令熟练使用 LLDB,让你调试事半功倍使用facebook开源的Chisel调试Home...

  • iOS调试之LLDB

    iOS调试之LLDB Xcode内嵌了LLDB控制台,在Xcode代码编辑区的下方。shift + cmd + y...

  • iOS LLDB插件之LLDB

    下载LLDB[https://github.com/DerekSelander/LLDB]后,将文件拷贝到~/op...

  • LLDB-iOS高效开发必备利器详解

    LLDB 一、什么是lldb lldb官网文档地址:https://lldb.llvm.org/[https://...

  • 动态调试高级用法

    LLDB - lldb_commands 下载地址LLDB 安装将下载文件解压,并将lldb_commands目录...

  • iOS逆向之HOOK原理介绍

    上一篇文章地址: iOS逆向之动态调试 (LLDB)介绍 上篇文章讲了如何使用LLDB进行动态调试. 如果你对文...

  • iOS LLDB调试

    掌握以下lldb命令,够用. ### LLDB调试总结 eNSString*$str=@"test"...

  • IOS逆向_动态调试:LLDB

    1. LLDB简介; 2. 常用的LLDB语法; 1. LLDB简介: 1.1 概念: LLDB是Xcod...

网友评论

      本文标题:LLDB之详细信息

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