lldb调试器知多少
lldb调试器简介
lldb 是一个有着 REPL 的特性和 C++ 、Python 插件的开源调试器。lldb调试器的由来是伴随着Xcode的版本升级而来。
Xcode4.3之前使用的默认调试器是gdb, 到Xcode4.3之后便改成了lldb。gdb是UNIX及UNIX-like下的调试工具,是来自于GNU组织。
后被苹果进行优化,功能添加后,改名为lldb。可以说lldb是gdb的高版本。
lldb调试器是一个可执行Mach-O文件,因为通常是和xcode集成在一起,会让人误以为是xcode的一个功能,或者是xcode的一个插件。
然后并非如此,它是一个可执行的应用,可以任意组合,比如:
Mac系统就有自带调试器lldb:
1 | /Library/Developer/CommandLineTools/usr/bin/lldb |
Xcode中也自带来了调试器lldb:
1 | /Applications/Xcode.app/Contents/Developer/usr/bin/lldb |
lldb调试器使用
在Xcode集成环境中,lldb使用方法简单;
运行Xcode工程后暂停项目,在lldb调试器窗口就可以使用lldb命令进行调试了。
如果没有Xcode集成环境怎么使用lldb呢?
这就有许多步骤需要我们手动完成了。
1.先通过ps查询当前运行的程序:
1 2 3 4 | 192:~ zhoufei$ ps aux | grep /Applications zhoufei 1496 0.8 4.2 6501004 348924 ?? S 10:14下午 0:35.31 /Applications/YoudaoNote.app/Contents/MacOS/YoudaoNote zhoufei 1255 0.0 2.0 8894360 168828 ?? S 10:01下午 0:43.20 /Applications/Firefox.app/Contents/MacOS/firefox |
2.开启调试一个静止的app程序
1 2 3 4 5 6 7 | //通过lldb调试器打开静态程序 192:bin zhoufei$ lldb firefox //或者 //通过lldb调试器打开 带参数的 静态程序 192:bin zhoufei$ lldb firefox 11 22 |
3.将lldb调试器附加到一个正在运行的app程序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | //1.先打开lldb调试器 192:bin zhoufei$ lldb //2.将调试器附加到要调试的目标可执行文件上 (lldb) process attach --name firefox Process 1255 stopped * thread #1, queue = 'com.apple.main-thread' , stop reason = signal SIGSTOP frame #0: 0x00007fff7570920a libsystem_kernel.dylib`mach_msg_trap + 10 libsystem_kernel.dylib`mach_msg_trap: -> 0x7fff7570920a <+10>: retq 0x7fff7570920b <+11>: nop libsystem_kernel.dylib`mach_msg_overwrite_trap: 0x7fff7570920c <+0>: movq %rcx, %r10 0x7fff7570920f <+3>: movl $0x1000020, %eax ; imm = 0x1000020 Target 0: (firefox) stopped. Executable module set to "/Applications/Firefox.app/Contents/MacOS/firefox" . Architecture set to: x86_64h-apple-macosx. (lldb) thread list |
4.根据调试命令进行调试
lldb调试器常用命令
lldb的命令结构如下:
Command subCommand action -opt argument
命令 子命令 动作 选项 参数。
1 | <command> [<subcommand> [<subcommand>...]] <action> [-options [option-value]] [argument [argument...]] |
1.打印命令
1 2 3 4 | //同expression p //打印对象 po |
2.项目中mach-o文件查询
//在app使用到的所有mach-o文件中查询
image lookup
1 2 3 4 5 6 7 8 9 10 11 12 | //查询 类型UITableViewCell 在mach-o中的定义信息,并打印出最佳匹配 image lookup -t UITableViewCell //查询 崩溃内存地址0x000000010e041b62 在mach-o中的定义信息,并打印出最佳匹配 //4 WYDoctorConsultModule_Example 0x000000010e041b62 -[WYFastConsultViewController //emptyViewModelDidRefreshOrderList:] + 162 image lookup -a 0x000000010e041b62 //查询 方法名或者符号名为emptyViewModelDidRefreshOrderList: 在mach-o中的定义信息,并打印出最佳匹配 image lookup -n emptyModelDidRefreshOrderList: //查询 app中所有使用的mach-o信息,并打印出最佳匹配 image list |
3.项目中对某个内存数据进行监控,如:全局变量,静态变量
watchpoint set variable
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | //对变量self->_pageNo进行监控 watchpoint set variable self ->_pageNo //对内存地址&(self->_pageNo)进行监控 watchpoint set expression &( self ->_pageNo) //查询所有的内存监控 watchpoint list //删除序号为:1 的内存监控 watchpoint delete 1 //额外命令追加 //当序号:2 断点触发时,执行追加的命令 watchpoint command add 2 //删除序号:2的命令追加 watchpoint command delete 2 //查询所有追加命令的列表 watchpoint command list |
4.为项目源码外的第三方静态库,动态库添加断点
breakpoint set
1 2 3 4 5 6 7 | breakpoint set -a 函数地址 breakpoint set -n 函数名称 //为符合正则表达式函数全部添加断点 breakpoint set -r 任意包含此字符串的函数名称 //breakpoint set -s 动态库名称 -n 动态库方法名 breakpoint set -s dyld -n load |
5.函数调用堆栈控制
比Xcode视图展示的线程堆栈更加详细
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | //打印当前栈帧frame的堆栈信息 thread backtrace bt命令同上 //函数提前返回 thread return [返回值] //当前栈帧的所有局部变量 frame variable //源码级 代码单步执行,下一步 thread step-over, next, n //指令级 汇编单步执行,下一步 thread step-inst-over, nexti, ni |
6.原始命令
原始命令命令后面默认都是参数,
如果要跟选项的话,需要添加 — 声明结束,后面跟着参数。
1 2 3 4 5 | expression (就是 p/print/call) expression -o(就是 po) //打印对象内存地址 expression -o -- 0x1111 |
7.辅助命令 apropos
可以通过模糊搜索,查询带有关键字的命令
如: apropos list //查询出所有包含list命令的lldb命令。
lldb调试器扩展
chisel是facebook开源的插件
安装方式简单:
1 | brew install chisel |
安装成功后,修改~/.lldbinit文件,在文件的末尾增加一行:
1 | command script import /usr/local/opt/chisel/libexec/fblldb.py |
后保存, 重启Xcode或者重新打开终端,让修改生效。
最后
平时的iOS开发中,使用的OC或者Swift是编译性语言,每次修改都有重新编译后才能看到结果,如果合理使用lldb调试器,将会大大提高开发效率。
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了