lldb调试器知多少
/Library/Developer/CommandLineTools/usr/bin/lldb
Xcode中也自带来了调试器lldb:
/Applications/Xcode.app/Contents/Developer/usr/bin/lldb
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程序
//通过lldb调试器打开静态程序
192:bin zhoufei$ lldb firefox //或者 //通过lldb调试器打开 带参数的 静态程序
192:bin zhoufei$ lldb firefox 11 22
3.将lldb调试器附加到一个正在运行的app程序
//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.根据调试命令进行调试
<command> [<subcommand> [<subcommand>...]] <action> [-options [option-value]] [argument [argument...]]
1.打印命令
//同expression
p
//打印对象
po
2.项目中mach-o文件查询
//查询 类型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
//对变量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 -a 函数地址
breakpoint set -n 函数名称
//为符合正则表达式函数全部添加断点
breakpoint set -r 任意包含此字符串的函数名称 //breakpoint set -s 动态库名称 -n 动态库方法名
breakpoint set -s dyld -n load
//打印当前栈帧frame的堆栈信息
thread backtrace
bt命令同上 //函数提前返回
thread return [返回值] //当前栈帧的所有局部变量
frame variable //源码级 代码单步执行,下一步
thread step-over, next, n
//指令级 汇编单步执行,下一步
thread step-inst-over, nexti, ni
expression (就是 p/print/call)
expression -o(就是 po) //打印对象内存地址
expression -o -- 0x1111
brew install chisel
command script import /usr/local/opt/chisel/libexec/fblldb.py
后保存, 重启Xcode或者重新打开终端,让修改生效。
最后
平时的iOS开发中,使用的OC或者Swift是编译性语言,每次修改都有重新编译后才能看到结果,如果合理使用lldb调试器,将会大大提高开发效率。
lldb调试器知多少的更多相关文章
- iOS LLDB调试器
随着Xcode 5的发布,LLDB调试器已经取代了GDB,成为了Xcode工程中默认的调试器.它与LLVM编译器一起,带给我们更丰富的流程控制和数据检测的调试功能.LLDB为Xcode提供了底层调试环 ...
- 使用Python脚本强化LLDB调试器
LLDB是Xcode自带的调试器,作为一个iOS应用开发程序员,平时我在开发应用时会使用LLDB来调试代码.在逆向应用时,也会用到LLDB来跟踪应用的执行过程. LLDB还内置了一个Python解析器 ...
- 学习笔记之--认识Xcode中的重要成员:lldb调试器
之前对lldb调试器了解比较少,平时主要用来打印日志和暂定时用鼠标查看属性数据以及使用p po一些简单的命令语句. 今天看了一些关于lldb的文章,顿时觉得之前对它了解太少了,原来它还有那么多的功能. ...
- iOS LLDB调试器和断点调试
技巧一:运行时修改变量的值 你以前怎么验证是不是某个变量的值导致整段程序不能正常工作?修改代码中的变量的值,然后cmd+r重新启动app?现在你不需要这么做了,只需要设置一个断点,当程序在这进入调试模 ...
- iOS - 浅谈LLDB调试器
摘要 LLDB是Xcode默认的调试器,它与LLVM编译器一起,带给我们更丰富的流程控制和数据检测的调试功能.平时用Xcode运行程序,实际走的都是LLDB.熟练使用LLDB,可以让你debug事半功 ...
- LLDB调试器
你是否曾经苦恼于理解你的代码,而去尝试打印一个变量的值? NSLog(@"%@", whatIsInsideThisThing); 或者跳过一个函数调用来简化程序的行为? NSNu ...
- iOS之LLDB调试器
LLDB被定位为下一代的高性能调试器,默认内置于Xcode IDE内, 支持在PC.iOS设备以及模拟器上调试C.Objective-C和C++. 关于LLDB的官方介绍:LLDB 常用命令: 1. ...
- Ubuntu18.04上使用LLDB调试Chromium Android C++代码。
###动机###Chromium Android源代码庞大且复杂.在调试器LLDB下能帮助我们更好的理解代码流程.介绍使用LLDB调试器调试android上chromium的C++代码. [1] 编译 ...
- 在lldb调试中调用c++函数
在lldb调试时,调用oc对象的方法不足为奇,因为msgSend是有原型导出的,oc对象的方法都运行期绑定的,绑定信息都在objc_class中.只要在调试中[receiver sel]之类,lldb ...
随机推荐
- TP5 在模板读出Session值
模板取值: <p class="info">后台登录中心{$Request.session.username}</p> 也可以 {$Think.sessio ...
- Vue 父组件往子组件传递方法
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- H3C RIPv2配置举例
- echarts 图表自适应外部盒子大小
项目中用到了echarts,由于页面是自适应的,还得兼容移动, 因此图表还需要根据盒子的大小来变化. 自适应窗口及盒子大小 页面中有一个[放大.缩小]功能,及全屏展示和预览图表 窗口自适应 let m ...
- Python--day38--JoinableQueue解决生产者消费者模型
############################# # 在消费者这一端: #每次获取一个数据 #处理一个数据 #发送一个记号:标志一个数据被处理成功 #在生产者这一端: #每一次生成一个数据 ...
- Django入门6--Django超链接
- H3C FTP双TCP连接方式
- 用户模式 Linux 移植
用户模式 Linux (UML) 是一个有趣的概念. 它被构建为一个分开的 Linux 内核移植, 有 它自己的 arch/um 子目录. 它不在一个新的硬件类型上运行, 但是; 相反, 它运行在一 ...
- C# 在基类定义好方法让子类继承接口就能实现
在 C# 里面,接口的定义只需要类里面存在和接口声明相同的方法或属性就可以,而存在的方法或属性是在子类定义的还是基类里面定义的都无所谓.也就是在基类里面写好了方法,但不继承接口,等子类继承接口的时候就 ...
- Linux 内核 ksets 之上的操作
对于初始化和设置, ksets 有一个接口非常类似于 kobjects. 下列函数存在: void kset_init(struct kset *kset); int kset_add(struct ...