简介
LLDB是Low Lever Debugger的简称,翻译成中文应该叫做底层调试器,它是LLVM项目的调试器组件。LLVM是构架编译器(compiler)的框架系统,以C++编写而成,用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time),对开发者保持开放,并兼容已有脚本。如果你了解过Swift语言及其作者,那么一定对Chris Lattner博士不陌生,那这里为什么要提到他呢?没错LLVM开发最初就是由Chris Lattner博士主持开展的。
LLDB支持调试C、Objective-C和C++编写的程序。Swift社区维护了一个版本,增加了对该语言的支持。默认内置于Xcode中,LLDB提供了一组广泛的命令,旨在与老版本的GDB命令兼容。除了使用标准配置以外,还可以很容易的自定义LLDB命令以满足实际需要。可以在Xcode的控制器进入lldb调试模式后,输入help可以查看所有Debugger commands,也可以在这个网站查询
breakpoint命令
断点命令,在平时使用Xcode开发的过程中,我们设置断点一般都是通过在界面上点击代码所在的行数设置的。其实也可以使用lldb的命令来设置断点。
根据名字设置断点
设置C函数名断点
<img src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/c1df1a8fc0824a1eb514cbc346414faf~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image) 在touchedBegan方法中,我们从界面设置了一个断点,进入了lldb调试模式,再输入以下命令设置函数断点:breakpoint set -n "test1",-n是--name的缩写,然后点击继续按钮,或者输入lldb命令c继续执行,可以看到其实Xcode集成的很多的调试功能就是从lldb这来的。调试下一步就在lldb输入n或者s,n遇到子函数不会进入,s遇到子函数会进入" style="margin: auto" />
设置OC方法名断点
先搭建个如图所示的简单界面 <img src="https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/026b14e3117e49d6b98f474643da37e3~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image) 然后暂停程序,在控制台输入如下命令:breakpoint set -n "-[ViewController save:]" -n "-[ViewController pause:]" -n "-[ViewController continue:]"这样就设置了一组断点,它有三个断点。可以使用以下命令查看当前所有断点:breakpoint list .
breakpoint set -r save:这样就会根据-r后面的参数去寻找所有能匹配到的方法
同样的,我们可以配合指定文件来使用这个命令 breakpoint set -r save: --file ViewController.m
断点执行命令
breakpoint command add 编号可以给断点加一些命令,这样断点来到的时候,可以自动执行这些命令,能否为我们节省一些操作
以上这些所有的lldb命令,都可以缩写,比如:breakpoint set -r save: --file ViewController.m可以缩写成b -r save: -f ViewController.m``breakpoint list可以缩写成break li``breakpoint disable 8.1可以缩写成bre dis 8.1``breakpoint enable 8.1可以缩写成bre en 8.1反正你可以去各种尝试,多一个少一个字母或许都能行,比较随意,比起普通的命令错一个字符都不行还是蛮牛逼的。
expression命令
我们平时在lldb控制台里面干的最多的是什么?po打印某个对象吧,那么这个po到底是什么意思呢?可以在终端输入如下命令查看一下: help po
通过help po我们知道就是在主线程执行表达式,那么我们可以试试在lldb中修改一些常见的属性,比如self.view.backgroundColor,首先来到touchesBegan:断点,在lldb输入如下指令p self.view.backgroundColor = [UIColor redColor];<img src="https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/dc5c508108d54a81a3481ba930115338~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image) 发现确实执行了这句代码,但是却报了一个让人疑惑的错误,而且过掉断点之后并没有任何效果,当然了明明执行都报错了,怎么可能会有效果呢。。。但是这一行代码,在程序中运行的话,肯定是没有问题的,我们查看UIView的头文件也可以发现它确定是有backgroundColor这个属性的。至于为什么我在网上搜索半天没有找到任何答案,感觉可能是lldb的bug?虽然这句代码无效,但是我们依然可以尝试使用其他的方式来修改,比如:p [self.view setValue:[UIColor blueColor] forKey:@"backgroundColor"]
KVC还是牛逼啊,还有一种办法,我们知道UIView真正用来显示的是它的layer,修改layer:p self.view.layer.backgroundColor = [UIColor yellowColor].CGColor  0x102b959f0 - 0x102b8c000 = 0x99F0在使用MachOView查看我们APP的Mach-O文件,找到地址0x99F0,看看是不是这个a的值0x123456678
有些同学可能会好奇,这个怎么是这个样子,其实这是因为机器的存取数据方式决定的,有些是大端模式,而有些机器是小端模式,这里贴一下百度的[大小端模式](https://link.juejin.cn/?target=https%3A%2F%2Fbaike.baidu.com%2Fitem%2F%25E5%25A4%25A7%25E5%25B0%258F%25E7%25AB%25AF%25E6%25A8%25A1%25E5%25BC%258F%2F6750542%3Ffr%3Daladdin "https://baike.baidu.com/item/%E5%A4%A7%E5%B0%8F%E7%AB%AF%E6%A8%A1%E5%BC%8F/6750542?fr=aladdin"" style="margin: auto" />
从这里也可以看出我们的全局变量是存放在__DATA,__data节的。
本文详细介绍了LLDB调试器的各种命令,包括breakpoint设置、禁用/启用/删除断点、expression命令用于修改属性、bt命令查看调用栈、watchpoint内存断点以及target stop-hook和.lldbinit文件的使用。特别强调了在逆向工程中如何使用内存断点,并探讨了ASLR对逆向调试的影响。此外,还展示了如何通过image指令查看进程加载的镜像信息和设置内存地址断点。
2214

被折叠的 条评论
为什么被折叠?



