Upgrade to Pro — share decks privately, control downloads, hide ads and more …

LLDB Extensions

LLDB Extensions

Avito.iOS Winter Edition '17 Moscow

Sergey Lem

March 13, 2018
Tweet

Transcript

  1. Расширения LLDB RegEx команды command regex asyncMainAfter 's/(\d+) (.+)/expression --

    (lldb) asyncMainAfter 3 self.update() Выполняем выражение без перезапуска DispatchQueue.main.async { DispatchQueue.main.asyncAfter(deadline: .now() + %1) { %2 } }/'
  2. Расширения LLDB RegEx команды • Множество задач можно решить подстановкой

    в шаблон выражения • Зависят от контекста • Длинные выражения тяжело писать и поддерживать • Нельзя выполнить несколько команд
  3. Расширения LLDB RegEx команды command regex assetName 's/(.+)/expression -l objc

    -O -- [(UIImageAsset*)[(UIImage*)%1 imageAsset] assetName]/' Пример без привязки к контексту (lldb) assetName 0x600deafbeaf0 Придется использовать адрес
  4. Расширения LLDB Python extensions • Интерфейс к отладчику • SB-объекты

    - Scripting Bridge Модуль lldb • Биндинги к C++ объектной модели
  5. Расширения LLDB Python extensions Хуки для брейкпоинтов frame: SBFrame -

    текущий фрейм bp_location: SBBreakpointLocation - место срабатывания
  6. Расширения LLDB Python extensions breakpoint command add -F module.breakpoint_hook <breakpoint_number>

    без указания breakpoint_number добавляет команду к последнему созданному
  7. Расширения LLDB Python extensions • SBBreakpointLocation и SBBreakpoint содержат API,

    который использует Xcode • return False --> "Automatically continue..."
  8. Расширения LLDB Python extensions Команды на Python class CommandClass: def

    __init__(self, dbg, session_dict): print 'Command "AwesomeCommand" is ready for use!' def __call__(self, dbg, args, exec_context, output): doSomeMagic(args) def Command(dbg, args, exec_context, output, session_dict): doSomeMagic(args)
  9. Расширения LLDB Создание команды на Python Конфигурация command script -c

    <module>.<class> <command_name> command script -f <module>.<function> <command_name>
  10. Расширения LLDB Создание команды на Python def __lldb_init_module(debugger, internal_dict): module

    = __name__ cmd = 'command script add -c %s.Command Command' % module debugger.HandleCommand(cmd) Удобный способ конфигурации
  11. Расширения LLDB Создание команды на Python ~/.lldbinit command alias reloadCommands

    command script import /Path/To/commands.py reloadCommands Удобный способ импорта
  12. Расширения LLDB Выводы Зачем использовать? • Обойти ограничения lldb •

    Упростить анализ • Новые инструменты исследования
  13. Расширения LLDB Выводы Как использовать? • Определять команды в отдельных

    модулях • Не привязываться к контексту • Явно указывать модули (import / @import) • Добавить help и usage
  14. Расширения LLDB Выводы Ограничения и проблемы Множество примеров в сети

    Скромная документация Выражения работают неочевидно Со временем к этому привыкаешь :)
  15. Расширения LLDB Что делать дальше? • Что занимает много времени?

    • Что заставляет пересобирать приложение? Проанализируйте свой опыт Новые команды
  16. Расширения LLDB Что делать дальше? 1. Документация LLDB https://lldb.llvm.org/python-reference.html 2.

    Набор полезных команд от Facebook https://github.com/facebook/chisel 3. Еще немного команд https://github.com/DerekSelander/LLDB 4. Сессия о приемах работы с lldb https://developer.apple.com/videos/play/wwdc2016/417/ @turbulem @iamlem