LLDB是运行在osx中的,想要调试iOS,还要debugserver
安装配置 debugserver
默认iOS没有安装debugserver,只有设备连接过Xcode并调试后,后,debugserver安装到/Developer/usr/bin/debugserver
位置。
但是通过Xcode安装的debugserver只能调试自己的App,下面是如何配置:
1). 先导出debugserver
,然后指令集瘦身,如iphone5c的设备对应armv7s
➜ ~ scp root@192.168.1.103:/Developer/usr/bin/debugserver ~/Desktop/debugserver
root@192.168.1.103's password:
debugserver 100% 13MB 1.1MB/s 00:12
➜ ~ cd Desktop
➜ lipo -thin armv7s debugserver -output debugserver-result
2). 给debugserver添加task_for_pid权限
下载http://iosre.com/ent.xml
3). 将经过处理的debugserver
文件拷贝回iOS,目录/usr/bin/debugserver
➜ ~ scp ~/Desktop/ds/debugserver-result root@192.168.1.103:/usr/bin/debugserver
root@192.168.1.103's password:
chenchuangde-iPhone:~ root# chmod +x /usr/bin/debugserver
需要放到/usr/bin
目录的原因:
原版debugserver
是不可写的,无法覆盖;
而且/usr/bin/
下的命令无序输入全路径就可以执行,在任何路径下执行debugserver
都可以启动处理过的debugserver
.
debugserver两种使用场景
1). 启动 debugerver -x backboard IP:port /path/to/executable
debugerver会启动executable,并开启port端口,等待来自ip的lldb接入。
chenchuangde-iPhone:~ root
debugserver-@(
for armv7.
Listening to port 1233 for a connection from *...
2). 附加进程 debugserver IP:port -a "ProcessName"
chenchuangde-iPhone:~ root
debugserver-@(
for armv7.
Attaching to process SpringBoard...
Listening to port 1231 for a connection from *...
使用LLDB
连接
命令: process connect connect://192.168.1.103:1233
常用命令
1). image list
: 列举当前进程中的全部模块
image list-o-f
输出内存地址和模块
(lldb) image list -o -f
[ 0] 0x0008e000 /Applications/MobileSMS.app/MobileSMS(0x0000000000092000)
[ 1] 0x00143000 /Users/tyrad/Library/Developer/Xcode/iOS DeviceSupport/10.3.3 (14G60)/Symbols/usr/lib/dyld
[ 2] 0x000f5000 /Library/MobileSubstrate/MobileSubstrate.dylib(0x00000000000f5000)
[ 3] 0x03180000 /Users/tyrad/Library/Developer/Xcode/iOS DeviceSupport/10.3.3 (14G60)/Symbols/System/Library/Frameworks/Foundation.framework/Foundation
[ 4] 0x03180000 /Users/tyrad/Library/Developer/Xcode/iOS DeviceSupport/10.3.3 (14G60)/Symbols/System/Library/Frameworks/UIKit.framework/UIKit
...
第一列[数字]
为模块序列号;
第二列是模块在虚拟内存中的起始地址因ASLR而产生的随机偏移(ASLR偏移);
第三列为模块的全部路径,括号里是偏移之后的起始地址
根据偏移之后的起始地址和ASLR偏移,我们可以计算出偏移后模块的基地址
系统库如Foundation,基地址是固定的,函数如NSLog相对于Foundation的位置也是固定的。
2). breakpoint 用来设置断点
常用命令:
#在函数的起始位置设置断点
b function
(lldb) b NSLog
Breakpoint 1: 2 locations.
(lldb)
或
#地址处设置断点
br s -a address
(lldb) br s -a 0xCCCCC
Breakpoint 2: where = MobileSMS`_mh_execute_header + 3584, address = 0x000ccccc
或
#地址处设置断点
br s -a 'ASLROffset+address'
3). print
po
可以打印oc对象
p(char*)
强制转换的方式打印c语言基本数据类型
4). nexti、stepi
都是执行下一条机器指令,nexti
不进入函数体,后者进入函数体,可以分别简写为ni
于si
5). register write
给指定的寄存器赋值,从而对程序进行改动.