gpt4 book ai didi

ios - 如何让 lldb 服务器在不附加到现有进程的情况下启动新进程?

转载 作者:行者123 更新时间:2023-11-28 20:54:59 34 4
gpt4 key购买 nike

我正在使用 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) target create "/Users/wellbye/git-repo/j/mj3d/Product/build/ios/Build/Products/Release-iphoneos/mj.app" Current executable set to '/Users/wellbye/git-repo/j/mj3d/Product/build/ios/Build/Products/Release-iphoneos/mj.app' (arm64). (lldb) script fruitstrap_device_app="/private/var/containers/Bundle/Application/1FB0E7E3-6616-4789-8E6F-598C4F5AAC35/mj.app" (lldb) script fruitstrap_connect_url="connect://127.0.0.1:62276"
(lldb) target modules search-paths add /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) command script import "/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) command script add -s asynchronous -f fruitstrap_6a050aabefc708cb7fc6024c4dd1743080d6e20b.autoexit_command autoexit (lldb) command script add -s asynchronous -f fruitstrap_6a050aabefc708cb7fc6024c4dd1743080d6e20b.safequit_command safequit (lldb) connect (lldb) run

我已经搜索了 lldb 的 python api 引用,但没有看到我可以用于我的目的的任何东西(args 或标志)。

那么我们如何让 lldb 服务器知道它应该终止现有进程并启动一个新进程?

最佳答案

这取决于您是否尝试支持重新运行行为(即您创建一个目标,启动进程,然后使用相同的目标重新运行)或者您是否只想终止应用程序的某些实例正在运行 - 可能是因为它是在设备上用手指启动的或其他什么。

在第一种情况下,由于您正在重用 SBTarget,您可以只检查您的目标是否有进程(调用 target.process.IsValid()),如果有则用 target.process.Kill() 启动前。

但如果 lldb 不负责启动应用程序的现存副本,那么它不会知道任何关于它的信息,也没有办法将其终止。

关于ios - 如何让 lldb 服务器在不附加到现有进程的情况下启动新进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53322853/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com