苹果从Xcode5开始弃用了gcc及gdb, 只能使用llvm用lldb。
在越狱机上虽然仍然可以使用gdb进行调试,但lldb是趋势。下面就介绍一种通过Wifi或者USB,在Mac上使用lldb对iOS App进行调试的方法。(仅限越狱机)
1. 在你的Mac上运行下面的命令,装载(mount) Xcode的develop kisk image
hdiutil attach /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/ DeviceSupport/7.0.3\ \(11B508\)/DeveloperDiskImage.dmg
|
2. 拷贝debugserver到某个临时文件夹(我拷贝到Desktop)
|
cp /Volumes/DeveloperDiskImage /usr/bin/debugserver .
|
3.用Xcode创建一个名为entitlements.plist的plist文件。包含以下3个key value键值对:
Key Value
com.apple.springboard.debugapplications true run-unsigned-code true get-task-allow true task_for_pid-allow true
用TextEdit打开内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<?xml version=
"1.0"
encoding=
"UTF-8"
?>
<!DOCTYPE plist PUBLIC
"-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd"
>
<plist version=
"1.0"
>
<dict>
<key>com.apple.springboard.debugapplications</key>
<
true
/>
<key>run-unsigned-code</key>
<
true
/>
<key>
get
-task-allow</key>
<
true
/>
<key>task_for_pid-allow</key>
<
true
/>
</dict>
</plist>
|
4. 签名
|
codesign -s - --entitlements entitlements.plist -f debugserver
|
注也可以采用ldid形式,但有可能卡住
/opt/theos/bin/ldid -Sent.xml debugserver
注意,“-S”选项与“ent.xml”之间是没有空格的。
ent.xml
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.springboard.debugapplications</key>
<true/>
<key>get-task-allow</key>
<true/>
<key>task_for_pid-allow</key>
<true/>
<key>run-unsigned-code</key>
<true/>
</dict>
</plist>
5. 拷贝debugserver到越狱iOS设备
scp debugserver [email protected]:~
|
6. 通过以下命令查看你要调试的程序的进程ID
ps aux | grep
"YouTube"
|
7. 通过ssh登录到iOS设备,运行以下命令
./debugserver *:1234 -a
"YouTube"
|
8. 在Mac终端运行lldb命令后,输入以下2条命令:
1
2
|
platform
select
remote-ios
process connect connect:
//192.168.2.104:1234
|
通过wifi调试很慢,有时候"process connect"命令甚至会失败。如果你也遇到这样的情况,你可以通过USB而不是Wifi进行调试。
1. 首先在你的Mac上下载usbmuxd解压,并运行:
1
2
3
4
|
wget http:
//cgit.sukimashita.com/usbmuxd.git/snapshot/usbmuxd-1.0.8.tar.bz2
tar xjfv usbmuxd-1.0.8.tar.bz2
cd usbmuxd-1.0.8/python-client/
python tcprelay.py -t 1234:1234
|
2. 这样所有试图链接到localhost:1234的连接都会通过USB被重定向到你的iOS设备的1234端口
这样,上面第8步中的process connect命令就可以更改如下:
process connect connect:
//localhost:1234
|
然后你就可以像在Xcode中一样用lldb调试了。
Ref:
http://iphonedevwiki.net/index.php/Debugserver
http://www.kanxue.com/bbs/showthread.php?p=1303343,有提到ARMDisassembler.framework
xcode 5.1.1的版本为例。
找到/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/7.1 (11D167)/DeveloperDiskImage.dmg
将ARMDisassembler.framework 拷贝到手机上/System/Library/PrivateFrameworks目录下。
很多人一定奇怪为啥要这步骤,你们可以自己试试,去掉ARMDisassembler.framework与存在ARMDisassembler.framework,在LLDB调试的过程看ARM反汇编的质量和效果。
lldb调试命令简介
iPhone端
lldb调试-启动进程
debugserver -x backboard IP:port /path/to/executable
lldb调试-附加进程
debugserver IP:port -a "ProcessName"
Mac端
"D:\Program Files (x86)\usbmuxd-1.0.8\python-client\tcprelay.py" -t 1234:1234
lldb
process connect connect://127.0.0.1:1234
image list -o -f
bt
bt all
ni
si
b l
b function
br s –a address
br s –a 'ASLROffset+address'
br s -r Regex
br dis
br en
br del
指定在某个断点得到触发的时候,执行预先设置的指令
br com add 1
Enter your debugger command(s). Type 'DONE' to end.
> po [$r0 class]
> p (char *)$r1
> c
> DONE
p (char *)$r1
用“x”命令打印一个地址处存放的值
register write r0 1