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

2018021947637ldid.png

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接入。

#效果会打开短信app
chenchuangde-iPhone:~ root# debugserver -x backboard *:1233 /Applications/MobileSMS.app/MobileSMS
debugserver-@(#)PROGRAM:debugserver  PROJECT:debugserver-360.0.26.3
 for armv7.
Listening to port 1233 for a connection from *...

2). 附加进程 debugserver IP:port -a "ProcessName"

#debugsercer会添加`SpringBoard`,并开启port端口,等待来自IP的LLDB接入。
chenchuangde-iPhone:~ root# debugserver  *:1231 -a  "SpringBoard"
debugserver-@(#)PROGRAM:debugserver  PROJECT:debugserver-360.0.26.3
 for armv7.
Attaching to process SpringBoard...
Listening to port 1231 for a connection from *...

使用LLDB

连接

命令: process connect connect://192.168.1.103:1233

2018022096974fuc.png

常用命令

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不进入函数体,后者进入函数体,可以分别简写为nisi

5). register write

给指定的寄存器赋值,从而对程序进行改动.