ios - 如何让 lldb 服务器启动一个新进程而不附加到现有进程?
问题描述
我正在使用ios-deploy
自动启动 ios 应用程序,它工作正常,但只是一个问题:如果它已经在运行,它不会重新启动应用程序。
我研究了它的源代码并了解到它使用lldb
命令来启动应用程序。lldb 脚本是(部分):
def run_command(debugger, command, result, internal_dict):
device_app = internal_dict['fruitstrap_device_app']
args = command.split('--',1)
error = lldb.SBError()
lldb.target.modules[0].SetPlatformFileSpec(lldb.SBFileSpec(device_app))
args_arr = []
if len(args) > 1:
args_arr = shlex.split(args[1])
args_arr = args_arr + shlex.split('{args}')
launchInfo = lldb.SBLaunchInfo(args_arr)
global listener
launchInfo.SetListener(listener)
#This env variable makes NSLog, CFLog and os_log messages get mirrored to stderr
#https://stackoverflow.com/a/39581193
launchInfo.SetEnvironmentEntries(['OS_ACTIVITY_DT_MODE=enable'], True)
lldb.target.Launch(launchInfo, error)
lockedstr = ': Locked'
if lockedstr in str(error):
print('\\nDevice Locked\\n')
os._exit(254)
else:
print(str(error))
启动命令:
(lldb) command source -s 0 '/tmp/BB1ED2A3-3A3E-413A-935D-323D7A7533D1/fruitstrap-lldb-prep-cmds-6a050aabefc708cb7fc6024c4dd1743080d6e20b' Executing commands in '/tmp/BB1ED2A3-3A3E-413A-935D-323D7A7533D1/fruitstrap -lldb-prep-cmds-6a050aabefc708cb7fc6024c4dd1743080d6e20b'。(lldb) platform select remote-ios --sysroot '/Users/wellbye/Library/Developer/Xcode/iOS DeviceSupport/12.0 (16A366)/Symbols' Platform: remote-ios Connected: no SDK Path: "/Users/wellbye/ Library/Developer/Xcode/iOS DeviceSupport/12.0 (16A366)/Symbols" (lldb) 目标创建"/Users/wellbye/git-repo/j/mj3d/Product/build/ios/Build/Products/Release-iphoneos/mj .app" 当前可执行文件设置为 '/Users/wellbye/git-repo/j/mj3d/Product/build/ios/Build/Products/Release-iphoneos/mj.app' (arm64)。
(lldb) 目标模块搜索路径添加 /usr "/Users/wellbye/Library/Developer/Xcode/iOS DeviceSupport/12.0 (16A366)/Symbols/usr" /System "/Users/wellbye/Library/Developer/Xcode/iOS DeviceSupport/12.0 (16A366)/Symbols/System""/private/var/containers/Bundle/Application/1FB0E7E3-6616-4789-8E6F-598C4F5AAC35""/Users/wellbye/git-repo/j/mj3d/Product/build /ios/Build/Products/Release-iphoneos" "/var/containers/Bundle/Application/1FB0E7E3-6616-4789-8E6F-598C4F5AAC35" "/Users/wellbye/git-repo/j/mj3d/Product/build/ios /Build/Products/Release-iphoneos" /Developer "/Users/wellbye/Library/Developer/Xcode/iOS DeviceSupport/12.0 (16A366)/Symbols/Developer" (lldb) 命令脚本导入"/tmp/BB1ED2A3-3A3E-413A-935D-323D7A7533D1/fruitstrap_6a050aabefc708cb7fc6024c4dd1743080d6e20b.py" (lldb) command script add -f fruitstrap_6a050aabefc708cb7fc6024c4dd1743080d6e20b.connect_command connect (lldb) command script add -s asynchronous -f fruitstrap_6a050aabefc708cb7fc6024c4dd1743080d6e20b.run_command run
(lldb) 命令脚本添加 -s 异步 -f fruitsstrap_6a050aabefc708cb7fc6024c4dd1743080d6e20b.autoexit_command 自动退出 (lldb) 命令脚本添加 -s 异步 -f fruitsstrap_6a050aabefc708cb7fc6024c4dd1743080d6e20b.safequitlldb) 运行安全quitdb
我已经搜索了 lldb 的 python api 参考,但没有看到任何可以用于我的目的的东西(参数或标志)。
那么我们如何让 lldb 服务器知道它应该终止现有进程并启动一个新进程呢?
解决方案
这取决于您是否尝试支持重新运行行为(即您创建一个目标,启动进程,然后使用相同的目标重新运行)或者您是否只是想终止正在运行的应用程序的某个实例 - 也许因为它是在设备或其他设备上用手指发射的。
在第一种情况下,由于您正在重用 SBTarget,您只需检查您的目标是否有进程(调用target.process.IsValid()
)以及是否target.process.Kill()
在启动之前将其杀死。
但是如果 lldb 不负责启动应用程序的现有副本,那么它就不会对此一无所知,也没有办法杀死它。
推荐阅读
- jquery - 如何在 PHPMailer 中使用 JSON 和 AJAX 与不同的消息内容
- python - 将逗号分隔的数据框列传递到 API 时失败
- android - Android-Xmpp:失败地址
- ios - Swift 5 从 https 请求解析 Json 数据
- c# - 构建 C# 应用程序并将结果发送到 SonarQube 仪表板
- sql - 如何执行 IF ELSE THEN T-SQL?
- bash - 使用包含间隔文本的列来格式化表格
- r - 在 Linkedin 和 Medium 上写博客文章时可以使用 R 代码吗
- node.js - 带有 NGINX 的 Ubuntu 20 为现有 IP 添加子域
- c++ - 这个双循环的大 O 复杂度