一、概述
debugserver、lldb
是协同工作的,debugserver
依附在APP
上,时刻监听APP
的运行状态,并有控制APP
执行的能力;lldb
是在APP
外部的,可以和debugserver
建立连接,通过debugserver
获取APP
运行状态,并且能通知debugserver
对APP
做一些事情。在真机调试的时候,Xcode
将debugserver
加入到APP
中,通过lldb
来调试APP
,那么同样也可以在iterm
上对越狱手机上的任意APP
进行调试。
Mac(Xcode(lldb)) -> APP(debugserver)
二、debugserver位置
Xcode
中debugserver
的位置:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/13.2
如下图:
双击dmg
查看debugserver
位置:/usr/bin/debugserver
如下图:
知道debugserver
的位置后,可以使用该工具scp
到越狱手机上,附加到任意应用。
三、越狱手机调试环境配置
1、处理Xcode中获取手机对应版本的debugserver
工具
查看描述文件:
ldid -e debugserver
- 导出描述文件:
ldid -e debugserver > debuger.entitlements
- 在描述文件中新增
get-task-allow、task_for_pid-allow
字段设置为YES
使用描述文件对debugserver
工具进行重签名:
ldid -Sdebuger.entitlements debugserver
- 签名后的
debugserver
就可以用到越狱手机上调试了。
使用scp
工具将debugserver
传入到越狱手机中:
scp -r debugserver root@10.15.32.45:/usr/bin/
- 2、越狱手机启动
debugserver
服务
debugserver ip:port –a app
ip
对应的手机ip
直接使用*,port
为对外开放的端口号(可以自定义)app
为要附加的应用名称。
查看进程:
ps -A
- 将
debugserver
附加到微信进程上:
debugserver *:12345 –a WeChat
- 3、使用Mac终端启动lldb和越狱手机上的debugserver建立连接
在终端运行lldb
,连接debugserver
:
process connect connect://127.0.01:12345
- 这样就连接上了,可使用
lldb
来调试越狱手机上的应用。
注意:在手机的
/Developer/usr/bin/
中也存在手机对应的debugserver
工具,同上我们可以将该debugserver
传到电脑上,重签名后再回传到手机/usr/bin/
。
四、lldb常用命令
breakpoint使用
1、下断点
breakpoint set --name test1
- 或
breakpoint set -n test1
- 打印:
Breakpoint 2: where = LLDB`-[ViewController test1] + 23 at ViewController.m:25:5, address = 0x0000000109de9f97
- 断点位置信息,执行便能在该处断住。
连续下多个断点:
breakpoint set -n "-[ViewController save:]" -n "-[ViewController pause:]" -n "-[ViewController continues:]"
- 运行
c
继续运行,n
单步执行,s
进入函数内部执行,finish执行到函数尾部。
2、查看断点列表
breakpoint list
- 打印:
1: file = '/Users/hibo/Documents/test/LLDB/LLDB/ViewController.m', line = 21, exact_match = 0, locations = 1 Options: disabled
1.1: where = LLDB`-[ViewController touchesBegan:withEvent:] + 70 at ViewController.m:22:6, address = 0x0000000109de9f46, unresolved, hit count = 2 Options: disabled
2: name = 'test1', locations = 1, resolved = 1, hit count = 7
2.1: where = LLDB`-[ViewController test1] + 23 at ViewController.m:25:5, address = 0x0000000109de9f97, resolved, hit count = 7
3、禁用断点
breakpoint disable //禁用所有断点
breakpoint disable 1.1 //禁用第一个断点
4、启用断点
breakpoint enable //启用所有断点
breakpoint enable 1.1 //启用1处断点
- 5、删除所有断点
breakpoint delete
breakpoint delete 1
- 删除只能删除一组,不能单个删除
6、设置selector
breakpoint set --selector touchesBegan:withEvent:
将为所有该方法设置断点
7、设置文件中的selector
断点
breakpoint set --file ViewController.m --selector touchesBegan:withEvent:
8、设置带有相同字符串的方法断点
breakpoint set -r Game:
打印:
Current breakpoints:
1: regex = 'Game:', locations = 3, resolved = 3, hit count = 0
1.1: where = LLDB`-[ViewController pauseGame:] + 43 at ViewController.m:31:5, address = 0x00000001010dff0b, resolved, hit count = 0
1.2: where = LLDB`-[ViewController continueGame:] + 43 at ViewController.m:34:5, address = 0x00000001010dff5b, resolved, hit count = 0
1.3: where = LinkPresentation`-[LPGameCenterInvitationMetadata setGame:], address = 0x00007fff2733e5e9, resolved, hit count = 0
- 如上也给其他带有
Game
字符的类下了断点。
给某一个文件下的带有相同字符串的方法下断点:
breakpoint set --file ViewController.m -r Game
简写:
breakpoint->b
打印列表需要写全:breakpoint list
或者break list
bt、frame命令
1、查看函数相关信息,使用p、down
追踪函数的调用和被调用关系
frame select
使用bt
命令查看函数调用堆栈
2、查找方法的调用者及方法名称
frame variable
methods、pviews
1、methods
打印当前对象的属性和方法
methods self
2、pviews
打印当前视图的层级结构
以上两个命令是lldb
插件名中的命令。chisel安装
……