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

LLDB Extensions

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

LLDB Extensions

Avito.iOS Winter Edition '17 Moscow

Avatar for Sergey Lem

Sergey Lem

March 13, 2018
Tweet

Other Decks in Programming

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