iOS 64位程序调试环境搭建

一、背景

调试ios程序经常使用gdb,但是gdb还未支持arm64,需要使用XCode的lldb调试IOS下64位程序。因为xcode默认调试工具是lldb,开始各种尝试在xcode中使用Debug-》Attach to Process 直接attach进程,但是只能看见进程却无法挂接。最终发现可以使用lldb命令行方式调试,lldb调试方法跟gdb最大的不同,在于前者是用OSX中的lldb远程连接debugserver,由debugserver作为lldb和iOS的中转,执行命令和返回结果;而后者是gdb直接运行在iOS上。但对于一般的开发、调试来说,区别不大。

二、基本知识

首先了解下各个iphone对应的cpu类型,这些知识将在调试准备工作中用到:

设备

Cpu类型

iPhone 4

armv7

iPhone 4s

armv7

iPhone 5

armv7s

iPhone 5c

armv7s

iPhone 5s

armv64

iPhone 6

armv64

iPhone 6 Plus

armv64

iPad 2

armv7

iPad mini

armv7

iPad with Retina display

armv7s

iPad Air

armv64

iPad Air 2

armv64

iPad mini with Retina display

armv64

iPad mini 2

armv64

iPad mini 3

armv64

iPad touch 5

armvv7

三、lldb调试

3.1 准备工作

使用lldb调试需要准备服务端程序,即debugserver。在默认情况下,iOS上并没有安装debugserver,只有在设备连接过一次Xcode,并在Window-》Devices菜单中添加此设备后,debugserver才会被Xcode安装到iOS的“/Developer/usr/bin/”目录下。确定有了debugserver后再一次执行以下步骤:

1、拷贝debugserver到本地计算机中:

       scp root@iOSDeviceIP:/Developer/usr/bin/debugserver ~/debugserver

2、由于ldid不支持的fat二进制文件,所以要给debugserver瘦身,通过lipo指定要支持的指令类型,以arm64为例:

        lipo -thin arm64 ~/debugserver -output ~/debugserver

 3、给debugserver添加task_for_pid权限,保存以下内容为ent.xml文件:

       com.apple.springboard.debugapplications

      

       get-task-allow

      

       task_for_pid-allow

      

       run-unsigned-code

      

然后执行以下命令添加权限:

ldid -Sent.xml debugserver

4、给debugserver重新签名,保存以下内容为entitlements.plist文件:

       com.apple.springboard.debugapplications

      

       run-unsigned-code

      

       get-task-allow

      

       task_for_pid-allow

      

然后运行以下命令给的debugserver签名:

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

5、到此准备工作完成,重新拷贝debugserver回手机中:

scp ~/debugserver root@iOSDeviceIP:/usr/bin/debugserver

3.2 调试

利用的lldb调试首先需要的启动debugserver的并,attach到要调试的进程,然后在通过lldb连接debugserver,具体步骤如下:

1、  从shell登录ios设备:

ssh root@iOSDeviceIP

然后会提示输入root密码,输入即可,如下图所示:

2、  如果是第一次使用还需给debugserver添加可执行属性:

chmod +x /usr/bin/debugserver

3、  接下来直接使用debugserver来attach一个进程,debugserver命令行格式如下:

debugserver [] host: [ ...]

 其中各个参数选项如下:

Option

Effect

-a process

Attach debugserver to process. The process can be a pid or executable name.

-d integer

Assign the waitfor-duration.

-f ?

 ?

-g

Turn on debugging.

-i integer

Assign the waitfor-interval.

-l filename

Log to file. Set filename to stdout to log to standard output.

-t

Use task ID instead of process ID.

-v

Verbose.

-w ?

 ?

-x method 

--launch=method

How to launch the program. Can be one of:

·auto: Auto-detect the best launch method to use.

·fork: Launch program using fork(2) and exec(3).

·posix: Launch program using posix_spawn(2).

·backboard: Launch program via BackBoard Services.

--lockdown

Obtain parameters from lockdown (?)

 其中最常用的参数为-a,后接进程名或进程pid,命令如下:

debugserver *:1234 -a "Clover"

debugserver *:1234 -a 444

  至此ios设备端操作完毕。

4、  另打开一个shell,启动lldb客户端,直接输入lldb进入lldb命令行模式。

5、  在lldb命令行的连接debugserver:

process connect connect://iOSDeviceIP:1234

在我实际使用过程中,此操作需要较长时间,连接成功后如下图所示:

6、  接下来就是一系列lldb相关命令操作:

四、lldb & gdb命令

可能大家使用较多的是gdb,对gdb命令更为熟悉,为了方便大家查阅、对比lldb和gdb命令,罗列出了一些常用命令供大家参考。

EXECUTION COMMANDS

GDB

LLDB

Launch a process no arguments.

(gdb) run
(gdb) r

(lldb) process launch
(lldb) run
(lldb) r

Launch a process with arguments .

(gdb) run 
(gdb) r

(lldb) process launch -- 
(lldb) r

Launch a process for with arguments a.out 1 2 3 without having to supply the args every time.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/636345.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Android studio,安卓手机编译安装yolov8部署ncnn,频繁出现编译错误

从编译开始就开始出现错误,解决步骤: 1.降低graddle版本,7.2-bin --->>> 降低为 6.1.1-all #distributionUrlhttps\://services.gradle.org/distributions/gradle-7.2-bin.zip distributionUrlhttps\://services.gradle.org/di…

OpenHarmony 蓝牙相关API用法

介绍 本示例通过使用蓝牙低功耗心率服务,展示蓝牙相关API用法。实现了以下几点功能: 发现具有特定服务的设备。连接到设备。发现服务。发现服务的特征、如何读取给定特征的值、为特征设置通知等。 相关概念 BLE扫描:通过BLE扫描接口实现对…

【Java框架】Spring框架(三)——Spring整合Mybatis及Spring声明式事务

目录 回顾Mybatis和新对象思路整理 Spring和MyBatis的整合步骤1. 创建Web工程,导入Spring和MyBatis的相关依赖2. 建立开发目录结构,创建实体类3. 创建数据访问接口和SQL映射语句文件4. 使用Spring配置文件配置数据源4.1 database.properties4.2spring配置…

生成人工智能体:人类行为的交互式模拟论文与源码架构解析(2)——架构分析 - 核心思想环境搭建技术选型

4.架构分析 4.1.核心思想 超越一阶提示,通过增加静态知识库和信息检索方案或简单的总结方案来扩展语言模型。 将这些想法扩展到构建一个代理架构,该架构处理检索,其中过去的经验在每个时步动态更新,并混合与npc当前上下文和计划…

eBay、亚马逊自养号测评如何避免风控账号关联选择合适网络IP环境

在自养号下单中选择适合的网络环境至关重要。经过多次实践与测试,积累了大量的经验,希望能够与大家分享,帮助大家避开陷阱,顺利前行。 市面上的网络环境种类繁多,从纯IP类的Luminati、Rola,到纯环境类的VM…

力扣-LCP 02.分式化简

题解: class Solution:def fraction(self, cont: List[int]) -> List[int]:# 初始化分子和分母为 0 和 1n, m 0, 1# 从最后一个元素开始遍历 cont 列表for a in cont[::-1]:# 更新分子和分母,分别为 m 和 (m * a n)n, m m, (m * a n)# 返回最终的…

python多线程技术(Threading)

文章目录 前言一、多线程(Threading)是什么?二、threading库1.初识多线程2.增加新线程2.1 多线程的基本使用2.2 对多线程是同时进行的进行一个直观上的演示(非重点--理解是实时就行)2.3 thread.join()功能2.4 使用queue(队列)功能获取多线程的返回值(重要,这就是前面那…

深度学习之图像分割从入门到精通——基于unet++实现细胞分割

模型 import torch from torch import nn__all__ [UNet, NestedUNet]class VGGBlock(nn.Module):def __init__(self, in_channels, middle_channels, out_channels):super().__init__()self.relu nn.ReLU(inplaceTrue)self.conv1 nn.Conv2d(in_channels, middle_channels, …

Junit 扩展-ApiHug准备-测试篇-012

🤗 ApiHug {Postman|Swagger|Api...} 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱,有温度,有质量,有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace 这里涉及…

告别轮询,SSE 流式传输可太香了!

嗨!我是小谷,大家好久不见~ 今天想和大家分享的一个技术是 SSE 流式传输。如标题所言,通过 SSE 流式传输的方式可以让我们不再通过轮询的方式获取服务端返回的结果,进而提升前端页面的性能。对于需要轮询的业务场景来说&#xff…

【Linux 杂货铺】进程间通信

1.进程为什么要通信呢? ①🍎 为了进程之间更好的协同工作,举个例子,在学校,学院的管理人员给教师安排课程的时候,必须事先知道该教师平常的上课情况,不然会将教师的课程安排到一起造成麻烦&…

安装mathutils方法

使用blenderproc的时候,需要安装mathutils,但是直接pip会出现问题,这里记录一下如何安装。 官方安装方法 这里是mathutils的库,里面写了安装方式: mathutils 3.3.0 on PyPI - Libraries.io git clone https://gitl…