debugserver+lldb
一、概述
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
的位置:
1 | /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/13.2 |
如下图:
双击dmg
查看debugserver
位置:/usr/bin/debugserver
如下图:
知道debugserver
的位置后,可以使用该工具scp
到越狱手机上,附加到任意应用。
三、越狱手机调试环境配置
1、处理debugserver
工具
- 从
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/
该路径下获取手机对应版本的debugserver
工具 - 或从越狱手机的
/Developer/usr/bin
路径下拉取debugserver
到Mac
上:scp -r -P2222 root@localhost:/Developer/use/bin/debugserver /Users/hibo/Desktop/
通过Xcode
或直接创建一个en.plist
文件:
1 |
|
保存后对获取到的debugserver
进行重签名,赋予新权限:
1 | codesign -s - --entitlements en.plist -f debugserver |
将重签后的debugserver
传入到越狱手机的/usr/bin/
路径下:
1 | scp -r -P2222 /Users/hibo/Desktop/debugserver root@localhost:/usr/bin/ |
2、越狱手机启动debugserver
服务
debugserver ip:port –a app
ip
对应的手机ip
直接使用,port
为对外开放的端口号(可以自定义) app
为要附加的应用名称。
查看进程:
1 | ps -A |
将debugserver
附加到微信进程上:
1 | debugserver localhost:12345 –a WeChat |
或
1 | debugserver *:12345 –a WeChat |
注意:使用*:12345
会导致连接失败:error: failed to get reply to handshake packet
,请使用第一种连接方式即可。
3、使用Mac
终端启动lldb
和越狱手机上的debugserver
建立连接
通过USB
连接手机,使用iproxy
映射端口:
1 | iproxy 12345 12345 |
- 第一个12345为本机使用端口号
- 第二个12345为手机对外开启的端口号
在终端运行lldb
,连接debugserver
:
1 | process connect connect://localhost:12345 |
这样就连接上了,可使用lldb
来调试越狱手机上的应用。
四、lldb常用命令
breakpoint使用
1、给函数下断点
1 | breakpoint set --name test1 |
打印:
1 | Breakpoint 2: where = LLDB`-[ViewController test1] + 23 at ViewController.m:25:5, address = 0x0000000109de9f97 |
断点位置信息,执行便能在该处断住。
连续下多个断点:
1 | breakpoint set -n "-[ViewController save:]" -n "-[ViewController pause:]" -n "-[ViewController continues:]" |
运行c
继续运行,n
单步执行,s
进入函数内部执行,finish
执行到函数尾部。
使用lldb
命令进入断点模式,相当于Xcode
上的pause program execution
1 | br s -r . -s XXX |
2、给指定方法下断点
1 | breakpoint set --method game |
3、指定选择器下断点
1 | breakpoint set --selector touchesBegan:withEvent: |
4、指定文件、选择器下断点
1 | breakpoint set --file ViewController.m --selector touchesBegan:withEvent: |
5、指定行设置断点
1 | breakpoint set --file ViewController.m --line 22 |
6、设置别名
1 | breakpoint set --file game.m --line 55 |
7、取消别名
1 | command unalias bfl |
8、查看断点列表
1 | breakpoint list |
打印:
1 | 1: file = '/Users/hibo/Documents/test/LLDB/LLDB/ViewController.m', line = 21, exact_match = 0, locations = 1 Options: disabled |
9、禁用断点
1 | breakpoint disable //禁用所有断点 |
10、启用断点
1 | breakpoint enable //启用所有断点 |
11、删除所有断点
1 | breakpoint delete |
删除只能删除一组,不能单个删除
12、设置带有相同字符串的方法断点
1 | breakpoint set -r Game: |
打印:
1 | Current breakpoints: |
如上也给其他带有Game
字符的类下了断点。
给某一个文件下的带有相同字符串的方法下断点:
1 | br s -f ViewController.m -r Game |
13、使应用进入断点
1 | process interrupt |
或
1 | br s -r . -s Shortcuts |
14、继续
1 | process continue |
15、下一步
1 | thread step-over |
16、进入
1 | thread step-in |
17、跳出
1 | thread step-out |
简写:
breakpoint->br
打印列表:breakpoint list
或者br list
bt、frame命令
1、查看函数相关信息,使用p、down
追踪函数的调用和被调用关系
1 | frame select |
使用bt
命令查看函数调用堆栈
2、查找方法的调用者及方法名称
1 | frame variable |
methods、pviews
1、methods
打印当前对象的属性和方法
1 | methods self |
2、pviews
打印当前视图的层级结构
以上两个命令是lldb
插件名中的命令。chisel安装
……