Как заставить сервер lldb запускать новый процесс, не подключаясь к существующему? - PullRequest
0 голосов
/ 15 ноября 2018

Я использую 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-323D7Ab40650b6-df050b6-dfb5-df5-db6-df5-df5-df5-df5-df5-df5-df5-df6(lldb) платформа select remote-ios --sysroot '/ Users / wellbye / Библиотека / Разработчик / Xcode / iOS DeviceSupport / 12.0 (16A366) / Платформа символов: remote-ios Подключено: нет пути SDK: "/ Users / wellbye /Библиотека / Разработчик / Xcode / iOS DeviceSupport / 12.0 (16A366) / Целевые символы (lldb) target create "/ 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 / container / Bundle / Application / 1FB0E7E3-6616-4789-8E6F-598C4F5AAC35 / mj.app" (lldb) сценарий fruitstrap_connect_url = "connect: //127.0.0.1: 62276"
(lldb) пути поиска целевых модулей добавить / usr "/ Пользователи / wellbye / Библиотека / Разработчик / Xcode / iOS DeviceSupport / 12.0 (16A366) / Символы / usr" / Система "/ Пользователи / wellbye / Библиотека / Разработчик / 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 / Продукты / Release-iphoneos "" / var / container / Bundle / Application / 1FB0E7E3-6616-4789-8E6F-598C4F5AAC35 "" / Пользователи / wellbye / git-repo / j / mj3d / Product / build/ ios / Build / Продукты / Release-iphoneos "/ Developer" / Пользователи / wellbye / Библиотека / Разработчик / Xcode / iOS DeviceSupport / 12.0 (16A366) / Импорт сценария команды символов / Developer "(lldb)" / tmp / BB1ED2A3-3A3E-413A-935D-323D7A7533D1 / fruitstrap_6a050aabefc708cb7fc6024c4dd1743080d6e20b.py "(lldb) добавить командный скрипт -е fruitstrap_6a050aabefc708cb7fc6024c4dd1743080d6e20b.connect_command подключения (lldb) команда сценарий добавить -s -f асинхронного fruitstrap_6a050aabefc708cb7fc6024c4dd1743080d6e20b.run_command запустить
(lldb) командного сценария добавить -s -f асинхронного fruitstrap_6a050aabefc708cb7fc6024c4dd1743080d6e20b.autoexit_command AutoExit (lldb) команда сценарий добавить -s -f асинхронным fruitstrap_6a050aabefc708cb7fc6024c4dd1743080d6e20b.safequit_command safequit (lldb) connect (lldb) run

Я искал ссылку на API Python для lldb, но не увидел ничего (аргументы или флаги), которое мог бы использовать для своих целей.

Итак, как мы можем сообщить серверу lldb, что он должен уничтожить существующий процесс и запустить новый?

1 Ответ

0 голосов
/ 16 ноября 2018

Это зависит от того, пытаетесь ли вы поддерживать поведение при повторном запуске (то есть, вы делаете цель, запускаете процесс, затем используете ту же цель для повторного запуска) или хотите ли вы просто отключить какой-то экземпляр приложения, которое было работает - возможно, потому что он был запущен пальцем на устройстве или что-то еще.

В первом случае, так как вы повторно используете SBTarget, вы можете просто проверить, есть ли у вашей цели процесс (вызов target.process.IsValid()) и если он убивает его с помощью target.process.Kill() перед запуском.

Но если lldb не несет ответственности за запуск существующей копии приложения, то он ничего об этом не узнает и на самом деле не сможет убить его.

...