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

时间:2018-11-15 15:35:44

标签: 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)命令源-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)平台选择remote-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)/符号“(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”   “ /用户/ wellbye / git-repo / j / mj3d / Product / build / ios / Build / Products / Release-iphoneos”   “ / var /容器/捆绑/应用程序/ 1FB0E7E3-6616-4789-8E6F-598C4F5AAC35”   “ /用户/ wellbye / git-repo / j / mj3d / Product / build / ios / Build / Products / Release-iphoneos”   /开发人员” /用户/ wellbye /库/开发人员/ Xcode / iOS   DeviceSupport / 12.0(16A366)/ Symbols / Developer“(lldb)命令   脚本导入   “ /tmp/BB1ED2A3-3A3E-413A-935D-323D7A7533D1/fruitstrap_6a050aabefc708cb7fc6024c4dd1743080d6e20b.py”   (lldb)命令脚本添加-f   fruittrap_6a050aabefc708cb7fc6024c4dd1743080d6e20b.connect_command   连接(lldb)命令脚本添加-s异步-f   fruittrap_6a050aabefc708cb7fc6024c4dd1743080d6e20b.run_command run
  (lldb)命令脚本添加-s异步-f   fruittrap_6a050aabefc708cb7fc6024c4dd1743080d6e20b.autoexit_command   autoexit(lldb)命令脚本添加-s异步-f   fruittrap_6a050aabefc708cb7fc6024c4dd1743080d6e20b.safequit_command   safequit(lldb)connect(lldb)运行

我已经搜索了lldb的python API参考,但是没有看到任何我可以使用的参数(参数或标志)。

那么我们如何让lldb服务器知道它应该杀死现有进程并开始一个新进程?

1 个答案:

答案 0 :(得分:2)

这取决于您是否要尝试支持重新运行行为(即,您创建一个目标,启动该过程,然后使用相同的目标来重新运行)还是仅想杀死该应用程序的某个实例。运行-可能是因为它是在设备或其他设备上用手指发射的。

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

但是,如果lldb不负责启动该应用程序的现有副本,则它将对此一无所知,并且实际上没有杀死它的方法。