debugserver+lldb使用

本文介绍如何在越狱的手机上使用Xcode的lldb工具进行APP调试,包括debugserver的配置与使用,以及lldb的常见命令。通过在Mac上操作,可以实现对手机上任意APP的远程调试。

一、概述

debugserver、lldb是协同工作的,debugserver依附在APP上,时刻监听APP的运行状态,并有控制APP执行的能力;lldb是在APP外部的,可以和debugserver建立连接,通过debugserver获取APP运行状态,并且能通知debugserverAPP做一些事情。在真机调试的时候,Xcodedebugserver加入到APP中,通过lldb来调试APP,那么同样也可以在iterm上对越狱手机上的任意APP进行调试。

Mac(Xcode(lldb)) -> APP(debugserver)

二、debugserver位置

Xcodedebugserver的位置:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/13.2 如下图:

position.jpg

双击dmg查看debugserver位置:/usr/bin/debugserver如下图:

debugserver.jpg

知道debugserver的位置后,可以使用该工具scp到越狱手机上,附加到任意应用。

三、越狱手机调试环境配置

1、处理debugserver工具

  • /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/该路径下获取手机对应版本的debugserver工具
  • 或从越狱手机的/Developer/usr/bin路径下拉取debugserverMac上:scp -r -P2222 root@localhost:/Developer/use/bin/debugserver /Users/hibo/Desktop/

通过Xcode或直接创建一个en.plist文件:

<?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>

保存后对获取到的debugserver进行重签名,赋予新权限:

codesign -s - --entitlements en.plist -f debugserver

将重签后的debugserver传入到越狱手机的/usr/bin/路径下:

scp -r -P2222 /Users/hibo/Desktop/debugserver root@localhost:/usr/bin/

2、越狱手机启动debugserver服务

debugserver ip:port –a app ip对应的手机ip直接使用*,port为对外开放的端口号(可以自定义)app为要附加的应用名称。

查看进程:

ps -A

debugserver附加到微信进程上:

debugserver localhost:12345 –a WeChat

debugserver *:12345 –a WeChat

3、使用Mac终端启动lldb和越狱手机上的debugserver建立连接

通过USB连接手机,使用iproxy映射端口:

iproxy 1234 1234
  • 第一个1234为本机使用端口号
  • 第二个1234为手机对外开启的端口号

在终端运行lldb,连接debugserver

process connect connect://127.0.01:12345

这样就连接上了,可使用lldb来调试越狱手机上的应用。

四、lldb常用命令

breakpoint使用

1、给函数下断点

breakpoint set --name test1 
br s -n test1 
b test1

打印:

Breakpoint 2: where = LLDB`-[ViewController test1] + 23 at ViewController.m:25:5, address = 0x0000000109de9f97

断点位置信息,执行便能在该处断住。

连续下多个断点:

breakpoint set -n "-[ViewController save:]" -n "-[ViewController pause:]" -n "-[ViewController continues:]"
br s -n "-[ViewController save:]" -n "-[ViewController pause:]" -n "-[ViewController continues:]"

运行c继续运行,n单步执行,s进入函数内部执行,finish执行到函数尾部。

使用lldb命令进入断点模式,相当于Xcode上的pause program execution

br s -r . -s XXX

2、给指定方法下断点

breakpoint set --method game
br s -m game

3、指定选择器下断点

breakpoint set --selector touchesBegan:withEvent:
br s -S touchesBegan:withEvent:

4、指定文件、选择器下断点

breakpoint set --file ViewController.m --selector touchesBegan:withEvent:
br s -f ViewController.m --selector touchesBegan:withEvent:

5、指定行设置断点

breakpoint set --file ViewController.m --line 22
br s -f ViewController.m -l 22

6、设置别名

breakpoint set --file game.m --line 55
br s -f game.m -l 55

command alias bfl br s -f %1 -l %2
bfl game.m 55

7、取消别名

command unalias bfl
command alias bfl breakpoint

8、查看断点列表

breakpoint list
br list

打印:

1: file = '/Users/hibo/Documents/test/LLDB/LLDB/ViewController.m', line = 21, exact_match = 0, locations = 1 Options: disabled 

 1.1: where = LLDB`-[ViewController touchesBegan:withEvent:] + 70 at ViewController.m:22:6, address = 0x0000000109de9f46, unresolved, hit count = 2 Options: disabled 

2: name = 'test1', locations = 1, resolved = 1, hit count = 7

 2.1: where = LLDB`-[ViewController test1] + 23 at ViewController.m:25:5, address = 0x0000000109de9f97, resolved, hit count = 7 

9、禁用断点

breakpoint disable  //禁用所有断点
breakpoint disable 1.1 //禁用第一个断点
br disable
br disable 1.1

10、启用断点

breakpoint enable   //启用所有断点
breakpoint enable 1.1  //启用1处断点  
br enable
br enable 1.1

11、删除所有断点

breakpoint delete
breakpoint delete 1
br delete
br delete 1

删除只能删除一组,不能单个删除

12、设置带有相同字符串的方法断点

breakpoint set -r Game:
br s -r Game:

打印:

Current breakpoints:

1: regex = 'Game:', locations = 3, resolved = 3, hit count = 0

 1.1: where = LLDB`-[ViewController pauseGame:] + 43 at ViewController.m:31:5, address = 0x00000001010dff0b, resolved, hit count = 0 

 1.2: where = LLDB`-[ViewController continueGame:] + 43 at ViewController.m:34:5, address = 0x00000001010dff5b, resolved, hit count = 0 

 1.3: where = LinkPresentation`-[LPGameCenterInvitationMetadata setGame:], address = 0x00007fff2733e5e9, resolved, hit count = 0 

如上也给其他带有Game字符的类下了断点。

给某一个文件下的带有相同字符串的方法下断点:

br s -f ViewController.m -r Game

13、使应用进入断点

process interrupt 

br s -r . -s Shortcuts

14、继续

process  continue
continue
c

15、下一步

thread step-over
Next
n

16、进入

thread step-in
step
s

17、跳出

thread step-out
finish
f

简写:breakpoint->br
打印列表:breakpoint list或者br list

bt、frame命令

1、查看函数相关信息,使用p、down追踪函数的调用和被调用关系

frame select

使用bt命令查看函数调用堆栈

2、查找方法的调用者及方法名称

frame variable

methods、pviews

1、methods打印当前对象的属性和方法

methods self 

2、pviews打印当前视图的层级结构

以上两个命令是lldb插件名中的命令。chisel安装

……

### 鼠标连点器的下载与使用教程 #### 软件功能概述 鼠标连点器是一种能够帮助用户自动完成重复性鼠标点击操作的工具,适用于多种场景,例如游戏操作、办公自动化等。其主要作用在于提升效率并减少手动操作带来的疲劳感[^1]。 #### 下载途径 通常情况下,鼠标连点器可以通过以下几种方式获取: - **官方网站**:许多开发者会提供官方版本供用户免费或付费下载。 - **第三方平台**:部分应用分发网站也会提供此类软件,但在选择时需注意安全性,避免下载到带有恶意代的版本。 - **自制脚本**:对于熟悉编程技术的用户来说,可以利用 Python 等语言自行开发适合自己的鼠标连点器[^4]。 #### 安装过程 安装鼠标连点器的过程相对简单,一般遵循以下流程: 1. 下载完成后打开 `.exe` 文件启动安装向导; 2. 按照提示逐步设置安装路径及其他参数,默认选项即可满足大部分需求; 3. 点击“完成”按钮结束整个安装环节[^2]。 #### 基础配置与使用说明 首次运行该类应用程序后,可能需要进行一定的初始化设定才能正常使用全部特性: - 设置触发条件:定义何时启用连续点击模式,比如通过指定快捷键实现开关控制。 - 自定义频率调节:依据实际应用场景调整每秒钟内的点击次数或者两次之间的时间间隔。 - 功能扩展支持:某些高级产品还允许绑定额外的功能模块,像图片识别定位目标位置再实施动作等功能[^3]。 #### 制作个性化解决方案 (可选) 如果现有市场上的成品无法完全契合个人特殊要求,则考虑借助开源社区资源学习如何构建专属方案也是一个不错的选择。以下是基于 Python 的简易示例代片段用于创建基础型鼠标连点器: ```python import time import threading from pynput.mouse import Button, Controller as MouseController from pynput.keyboard import Listener, KeyCode, Key delay = 0.01 button = Button.left start_stop_key = KeyCode(char='s') exit_key = KeyCode(char='e') class ClickMouse(threading.Thread): def __init__(self, delay, button): super().__init__() self.delay = delay self.button = button self.running = False self.program_running = True def start_clicking(self): self.running = True def stop_clicking(self): self.running = False def exit(self): self.stop_clicking() self.program_running = False def run(self): while self.program_running: while self.running: mouse.click(self.button) time.sleep(self.delay) mouse = MouseController() click_thread = ClickMouse(delay, button) click_thread.start() def on_press(key): if key == start_stop_key: if click_thread.running: click_thread.stop_clicking() else: click_thread.start_clicking() elif key == exit_key: click_thread.exit() listener.stop() with Listener(on_press=on_press) as listener: listener.join() ``` 上述脚本实现了简单的按键切换逻辑来开启/关闭自动点击行为,并提供了退出机制以便安全终止进程。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值