通过lldb远程调试iOS App

在了解LLDB的用法之前,需要对LLDB的一个大Bug有所了解:Xcode 6所附带的LLDB(版本号320.x.xx)在armv7和armv7s设备上有时会混淆ARM和THUMB指令,根本无法调试,且在本书截稿之时,此Bug仍未得到修复。一个暂时的解决方案是从
https://developer.apple.com/downloads/index.action下载安装Xcode 5.0.1或Xcode 5.0.2,它们所附带的LLDB(版本号300.x.xx)可以正常调试armv7和armv7s设备。在安装旧版Xcode的时候,注意将其安装在与当前Xcode不同的路径下,如/Applications/OldXcode.app,这样就不会影响当前的Xcode了。


通过lldb远程调试iOS App

苹果从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 root@192.168.1.106:~

 

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

Click image for larger versionName:	2.jpgViews:	8Size:	896 KBID:	90974

 将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



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值