【问题标题】:how can made lldb server launching a new process without attaching to the existed one?如何让 lldb 服务器在不附加到现有进程的情况下启动新进程?
【发布时间】:2019-04-18 18:09:18
【问题描述】:

我正在使用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) 命令源 -s 0 '/tmp/BB1ED2A3-3A3E-413A-935D-323D7A7533D1/fruitstrap-lldb-prep-cmds-6a050aabefc708cb7fc6024c4dd1743080d6e20b' 在执行命令 '/tmp/BB1ED2A3-3A3E-413A-935D-323D7A7533D1/fruitstrap-lldb-prep-cmds-6a050aabefc708cb7fc6024c4dd1743080d6e20b'。 (lldb) 平台选择远程 ios --sysroot '/Users/wellbye/Library/Developer/Xcode/iOS DeviceSupport/12.0 (16A366)/Symbols 平台:remote-ios 已连接:无 SDK 路径: "/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) 脚本 fruitstrap_device_app="/private/var/containers/Bundle/Application/1FB0E7E3-6616-4789-8E6F-598C4F5AAC35/mj.app" (lldb) 脚本 fruitstrap_connect_url="connect://127.0.0.1:62276"
(lldb) 目标模块搜索路径添加 /usr "/Users/wellbye/Library/Developer/Xcode/iOS DeviceSupport/12.0 (16A366)/符号/usr" /系统 "/Users/wellbye/Library/Developer/Xcode/iOS DeviceSupport/12.0 (16A366)/符号/系统" “/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” /开发者“/用户/再见/图书馆/开发者/Xcode/iOS DeviceSupport/12.0 (16A366)/Symbols/Developer" (lldb) 命令 脚本导入 “/tmp/BB1ED2A3-3A3E-413A-935D-323D7A7533D1/fruitstrap_6a050aabefc708cb7fc6024c4dd1743080d6e20b.py” (lldb) 命令脚本添加 -f Fruitstrap_6a050aabefc708cb7fc6024c4dd1743080d6e20b.connect_command 连接(lldb)命令脚本添加 -s 异步 -f Fruitstrap_6a050aabefc708cb7fc6024c4dd1743080d6e20b.run_command run
(lldb) 命令脚本添加 -s 异步 -f Fruitstrap_6a050aabefc708cb7fc6024c4dd1743080d6e20b.autoexit_command 自动退出 (lldb) 命令脚本添加 -s 异步 -f Fruitstrap_6a050aabefc708cb7fc6024c4dd1743080d6e20b.safequit_command safequit (lldb) 连接 (lldb) 运行

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

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

【问题讨论】:

    标签: ios lldb


    【解决方案1】:

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

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

    但如果 lldb 不负责启动应用程序的现有副本,那么它不会对此一无所知,也没有办法杀死它。

    【讨论】:

    • 我在启动前添加了检查和杀死代码,但是杀死后,lldb说:Process 0 exited with status = 9 (0x00000009) error: the platform is not currently connected并且没有启动新进程。
    • 即使app没有运行,lldb.target.process.IsValidreturn true,打印过程显示SBProcess: pid = 0, state = connected, threads = 0, executable = mj
    • 一个退出的进程仍然存在(例如,您可以检查退出状态。)但是 process.state 将是 lldb.eStateExited。你不需要杀死那些......
    • 但是,我对 ios-deploy 的工作原理一无所知,因此如果您确实必须关闭当前设备,我无法帮助您如何与设备建立新连接过程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-15
    • 1970-01-01
    • 2018-12-28
    • 2015-02-07
    • 2023-03-28
    • 1970-01-01
    相关资源
    最近更新 更多