这不是一个实际的答案。我很抱歉,但探索太有趣了,不能分享,太长不能发表评论,我很想看到有人以此为基础。
我首先设置要调试的应用程序 (PT_TRACE_ME),然后触发断点 (SIGTRAP)。这只是从 Swift 中的按钮 IBAction 调用的。
#include "debug.h"
#import <dlfcn.h>
#import <sys/types.h>
#include <signal.h>
typedef int (*ptrace_ptr_t)(int _request, pid_t _pid, caddr_t _addr, int _data);
void debugme() {
void* handle = dlopen(0, RTLD_GLOBAL | RTLD_NOW);
ptrace_ptr_t ptrace_ptr = dlsym(handle, "ptrace");
ptrace_ptr(0, 0, 0, 0);
dlclose(handle);
kill(0, SIGTRAP);
}
(我确信这会禁止您进入应用商店。我绝不会将其包含在运输应用的生产版本中。)
这所以接近工作了(如果你已经在 Xcode 下运行,发送你自己SIGTRAP 确实有效,但在这种情况下你可以设置一个断点)。它挂起程序,程序不会因为未能处理其运行循环而被终止,并且它作为可能的目标显示在“调试,附加到进程”列表中。但是,当您尝试实际连接时,Xcode 抱怨它无法连接到它。在你得到的 iOS 日志中:
default 16:10:52.889240 -0400 debugserver error: Attach failed: "(os/kern) invalid task".
这可能不足为奇,因为应用的父级并不期望它被调试。所以也许这表明这确实是不可能的。
所以,好吧,它失败了。但这就是它变得有点奇怪的地方:
这个应用程序不会死。我的意思是强制杀死不会杀死这个应用程序。它仍然显示在 Xcode 的进程列表中。主页按钮会将您带到跳板,如果您重新启动应用程序,您只会得到一个白屏(我猜是因为它甚至无法重新绘制自己?)
当应用程序在前台时屏幕锁定时,主页按钮不再起作用以将其唤醒。 power 按钮不再起作用。按住电源关机最终给出了触觉脉冲,但没有关闭手机。我必须进行重置(电源+家庭)才能重新启动。我很惊讶我可以从沙盒用户态进程中如此艰难地锁定手机。
所以也许这不是最好的方法,但感觉与实际答案非常接近,我还是想分享它。