漫谈LLDB:从入门到精通
先声明两点:
1. 本系列谈的LLDB侧重于iOS系统,且基于Xcode。
2. 因为是开发HMLLDB总结的经验,所以内容会侧重于自定义Python脚本。
前言
我前不久开源了一个LLDB命令库HMLLDB,其中涉及到很多知识并不能用一篇文章简单讲完,所以准备写一系列相关的文章。这是第1篇,给出学习路线和资料。
入门
- 首先自然是掌握LLDB自带的命令,通过命中断点或点击
Pause program execution
进入LLDB调试模式后,输入help
就能看到所有的命令。网上有大量的介绍文章,大同小异,请读者自行搜索,多看几篇,同时也试一试这些命令。其中要重点了解expression
、breakpoint
和target
命令。 - 在WWDC的调试(Debugging)主题把所有相关的视频都看完。其中有个必看的视频Advanced Debugging with Xcode and LLDB。
- 这本书Advanced Apple Debugging and Reverse Engineering非常值得一看,优先看介绍LLDB系统命令和自定义LLDB命令的这两个章节。
进阶
- 了解如何用Python自定义命令脚本。同样的,先看网上的一些教程(上面那本书也有一章节也专门讲自定义命令),动手集成一个小脚本体验。然后再看官网的这节介绍Create a new lldb command using a Python function。
- 到这里应该已经了解如何自定义命令脚本,但是写LLDB脚本会遇到非常多的坑和不熟悉的SB API,所以参考项目越多就越好,看看别人怎么处理、怎么调用。这里首先推荐两个项目,一个是我写的HMLLDB,另一个是Derek Selander(上面那本书的作者)的LLDB项目,这两个项目架构简单(几乎不存在架构),大多数命令执行一整段代码也对初学者较友好。其次推荐Facebook的chisel项目,命令简单实用。最后推荐的就是LLDB项目本身提供的examples。
- 了解SB API。挖掘LLDB丰富的功能绕不开SB API,而官网对API注释很少,所以参考上面的项目中用到的API很重要。不过你还可以尝试HMLLDB项目中的plldbClassInfo命令,这个命令是我用来帮助理解部分SB API的。当然也可以看源码,也许能猜出一些API的用法。
- 如果你掌握了大部分常用SB API,也能比较愉快地写命令脚本了,接下来就可以看看源码深入了解。但在此之前,我还建议看看Jim Ingham在stackoverflow回答。我把他在2017年至今所有Answers看了一遍,受益匪浅。
精通
任何技术要达到精通,都要全面深入去学习,甚至还需要多方面的知识储备。全面掌握LLDB系统命令的每个子命令和选项、全面熟悉SB API,熟悉不同平台下LLDB的使用等等。其他相关(例如LLVM)的知识也要有所了解。这部分以我的水平难以给出有效的学习路径,但有一个最直接的途径那就是看懂项目的源码。
资料汇总
- HMLLDB:https://github.com/chenhuimao/HMLLDB
- Derek Selander的LLDB项目:https://github.com/DerekSelander/LLDB
- chisel:https://github.com/facebook/chisel
- LLDB项目的examples:https://github.com/llvm/llvm-project/tree/main/lldb/examples/python
- WWDC调试(Debugging)主题:https://developer.apple.com/videos/developer-tools/debugging
- Advanced Debugging with Xcode and LLDB:https://developer.apple.com/videos/play/wwdc2018/412/
- Advanced Apple Debugging and Reverse Engineering:https://store.raywenderlich.com/products/advanced-apple-debugging-and-reverse-engineering
- 官网Create a new lldb command using a Python function:https://lldb.llvm.org/use/python-reference.html#create-a-new-lldb-command-using-a-python-function
- 官网SB API参考:https://lldb.llvm.org/python_api.html
- plldbClassInfo命令脚本:https://github.com/chenhuimao/HMLLDB/blob/master/commands/HMLLDBClassInfo.py
- Jim Ingham的主页:https://stackoverflow.com/users/2465073/jim-ingham
- LLVM&LLDB的源码:https://github.com/llvm/llvm-project/