值得持续学习的LLDB技巧

2021-03-09  本文已影响0人  双鱼子曰1987

一、概述

开发调试中,常常使用LLDB加快调试,更快速简单的定位到问题点。
下面是之前收集并且整理的常用命令 、插件和 使用技巧。

二、命令

关于命令的详细用法,使用help <command> <subcommand>进行查看

2.0、关于~/.lldbinit

LLDB有了一个启动时加载的文件~/.lldbinit,每次启动都会加载。
可以添加一些自定义命令,加载插件等等。

cat ~/.lldbinit查看文件内容,包含以下信息:

2.1、打印命令

2.2、堆栈

2.3、线程

2.4、表达式

2.5、关于imageimage是LLDB给 target modules 取的别名 )

2.6、断点

调试技巧:断点编辑,xcode中可以右键某个断点,可以进行断点编辑,可以设置某种条件下触发断点,实际开发中蛮实用。

2.6.1、breakpoint set 断点设置,其中breakpoint可以缩写为b
2.6.2、breakpoint command 给断点设置一些命令
2.6.3、其他

2.7、watchpoint 内存断点

如果说breakpoint是对方法生效的断点,watchpoint就是对地址生效的断点。
想要知道某个属性什么时候被篡改了,我们该怎么办呢?就可以使用watchpoint。

2.7.1、设置
2.7.2、命令
2.7.3、其他

2.8、流程控制语句

2.9、targets

2.9.1、modules
2.9.2、stop-hook

breadpointwatchpoint 断点停止的时候,去执行一些命令。

2.9.3、target symbols add(add-dsym)

当我们对接framework的时候,如果只有framework代码,没有工程代码,能不能debug呢?其实我们只需要拿到工程的ipa和dSYM文件,就可以debug了,通过Attach to Process,使用命令add-dsym将dSYM文件加入target,即可只debug framework,不需要工程的代码

2.10、其他

使用例子demo
1、image list
读取app的image进程内存首地址

[  0] 67EC1881-E7CC-38BC-A49E-D6FE5E755FB0 0x000000010ebe1000

2、memory read addr
addr-符号表的符号地址,可以通过mach-o查看。

1.png

addr = 第一步首地址 + mach-o的offset地址
0x10EBE9050 = 0x000000010ebe1000 + 0x00008048

2.png

3、dis -s addr
这一步的addr是上一步红框的倒叙(由于iOS是小端模式,内存地址8位倒着读)。

3.png

输出:HelloWorld/fxNSlog:,其中 fxNSlog: 是用fishhook NSLog的替换函数。

三、LLDB 和 Python

3.1、插件的原理

LLDB 有内建的,完整的 Python 支持。在LLDB中输入 script,会打开一个 Python REPL。

3.2、Chisel插件(facebook开源调试利器,原理同时)

GitHub地址

常用的命令:

** 更多好用的用法,请参考help命令,值得你深入研究。 **

四、XCode调试

NSString *str = @"helloworld";
id __weak objc = str;
NSLog(@"%@", objc);
image.png

参考

LLDB调试小节
objc.io#19#与调试器共舞 - LLDB 的华尔兹
iOS中教你快速掌握LLDB调试技巧
Chisel-LLDB命令插件,让调试更Easy

上一篇 下一篇

猜你喜欢

热点阅读