LLDB — это набор псевдонимов и регулярных выражений для LLDB, а также скрипты на Python, которые помогают в отладке. Эти скрипты созданы исключительно для развлечения автора, но некоторые из них могут быть полезны в вашей работе. Если вы хотите лучше понять, как создавать такие скрипты для LLDB или улучшить понимание работы с LLDB в целом, ознакомьтесь с книгой «Advanced Apple Debugging and Reverse Engineering» (Продвинутое изучение отладки и обратного проектирования Apple).
command script import /path/to/lldb_commands/dslldb.py
.Готово! Вы можете приступать к работе!
Чтобы убедиться, что всё работает правильно, просто попробуйте выполнить одну из команд в отладчике... например, (lldb) help methods
.
Я рекомендую использовать клонирование. Так, когда я объявлю о новом скрипте или исправлении, вы сможете просто выполнить git pull
, вместо того чтобы повторять весь процесс заново.
Для всех команд ниже вы можете просмотреть документацию с помощью команды help {команда}
. Если вы хотите узнать, какие параметры есть у команды, введите {команда} -h
.
TLDR: search
, lookup
и dclass
— хорошие команды для использования независимо от того, являетесь ли вы разработчиком или исследуете без исходного кода.
Если вам нравится swizzling Objective-C, обратите внимание на sclass
. Если вам нравится DTrace, посмотрите pmodule
и snoopie
.
Ищет в куче все живые экземпляры определённого класса. Этот класс должен быть динамическим (то есть наследоваться от класса NSObject
/SwiftObject
). В настоящее время не работает с NSString
или NSNumber
(помеченные указатели на объекты).
Пример:
Найдите все экземпляры и подклассы UIView.
(lldb) search UIView
Найдите все экземпляры UIView, которые являются UIView. Игнорируйте подклассы.
(lldb) search UIView -e
Найдите все экземпляры UIView с тегом, равным 5. Только синтаксис Objective-C. Можно ссылаться на объект через «obj».
(lldb) search UIView -c "(int)[obj tag]==5"
Найдите все экземпляры подкласса UIView, который реализован в модуле SpringBoardUI.
(lldb) search UIView -m SpringBoardUI
Найдите все подклассы UIView, созданные в модуле «Woot», и скройте их.
(lldb) search UIView -m Woot -p "[obj setHidden:YES]"
Ищите UIView, но просто печатайте класс, не печатайте описание объекта (идеально для Swift, где они скрывают указатель).
(lldb) search UIView -b
Помните, что Swift включает модуль в имя класса, поэтому если у вас есть Swift UIView с именем TestView в модуле WOOT...
(lldb) search WOOT.TestView -b
Поиск всех классов, содержащих ссылку на указатель 0xfeedfacf.
(lldb) search -r 0xfeedfacf
Выводит все классы NSObject
/SwiftObject в процессе. Если указать модуль, он будет выводить только классы в этом модуле. Вы также можете фильтровать классы по определённому типу и генерировать заголовочный файл для конкретного класса.
Пример:
Выведите ВСЕ классы (Swift и Objective-C), найденные в процессе.
(lldb) dclass
Вывести информацию ObjC/Swift (если применимо) о классе «Hello.SomeClass» (аналогично dclass -i Hello.SomeClass).
(lldb) dclass Hello.SomeClass
Выведите все классы, которые являются UIViewController в процессе.
(lldb) dclass -f UIViewController
Выведите все классы с регулярным выражением без учёта регистра «viewcontroller» в имени класса.
(lldb) dclass -r (?i)viewCoNtrolLer
Выведите все классы в модуле UIKit.
(lldb) dclass -m UIKit
Выведите все классы в CKConfettiEffect NSBundle, которые являются подклассами UIView.
(lldb) dclass /System/Library/Messages/iMessageEffects/CKConfettiEffect.bundle/CKConfettiEffect -f UIView
Создайте заголовочный файл для указанного класса:
(lldb) dclass -g UIView
Создайте протокол, который можно привести к... Объект для. Идеально подходит для работы с закрытыми классами во время разработки
(lldb) dclass -P UIView
(lldb) dclass -o UIKit
(lldb) dclass -s NSObject -m UIKit
(lldb) dclass -t swift
(lldb) dclass -t objc
(lldb) dclass -i UIView
(lldb) dclass -I UIView
Отображает данные в сегментах/разделах Mach-O исполняемого файла или фреймворков, загруженных в процесс
(lldb) section
(lldb) section UIKit
(lldb) section UIKit __TEXT
(lldb) section UIKit __TEXT.__cstring -l
(lldb) section __TEXT.__entitlements
(lldb) section __DATA.__la_symbol_ptr -l
Альтернатива команде LLDB disassemble
. Использует цвета. Только для терминала и предназначен для x86)64. Поддержка ARM64 появится однажды...
Символизировать обратную трассировку. Символизирует усечённую обратную трассировку из исполняемого файла, если обратная трассировка использует код Objective-C. В настоящее время не работает на aarch64 усечённых исполняемых файлах, но отлично работает на x64 :]
Вы узнаете, как создать эту команду, в книге :]
msl 0xadd7e55 msl или регистрация стека malloc будет принимать адрес и пытаться получить обратную трассировку до момента создания.
Вам нужно установить переменную env MallocStackLogging или выполнить turn_on_stack_logging(1), пока процесс активен
Вы узнаете, как сделать эту команду в книге :]
Выполните поиск по регулярному выражению в исполняемом файле.
Пример:
(lldb) lookup viewDidLoad
(lldb) поиск viewDidLoad -s
(lldb) loo -x StocksFramework .
(lldb) поиск -X (?i)init
(lldb) поиск -S http -m UIKit
(lldb) loo -S ^[a-zA-Z0-9+]{22,22}$ -m libMobileGestalt.dylib -l
(lldb) поиск . -g HonoluluArt -l
Найдите фразу «номинальный» (дескрипторы номинальных типов Swift) в модуле «SwiftTest» и получите адрес, не оценивайте символ (lldb) поиск -G SwiftTest номинальный -l
Разбить, если на функции. Синтаксис: biof regex1 [Необязательный модуль] ||| regex2 Обязательный модуль Точка останова регулярного выражения, которая принимает два входных данных регулярного выражения. Первое регулярное выражение создаёт точку останова для всех совпадающих функций. Второе регулярное выражение создаст точку останова. Условие остановки только при наличии второй точки останова регулярного выражения в трассировке стека
Например, чтобы остановиться, только если код в модуле «TestApp» привёл к вызову метода setTintColor:
biof setTintColor: ||| . Test
В качестве совета было бы разумно иметь ограниченный regex1, который соответствует небольшому количеству функций, сохраняя при этом regex2 любого размера.
Yoink
Принимает путь на iOS/tvOS/watchOS и записывает в каталог /tmp/ на вашем компьютере. Если данные можно прочитать с помощью -[NSData dataWithContentsOfFile:]
, их можно записать на диск.
Пример (на устройстве iOS 10):
(lldb) yoink /System/Library/Messages/iMessageEffects/CKConfettiEffect.bundle/CKConfettiEffect
Pmodule
Создаёт пользовательский скрипт dtrace, который профилирует модули в исполняемом файле на основе его макета памяти и ASLR. Не предоставляйте аргументов с параметром -a, если вы хотите подсчитать все срабатывающие модули. Предоставьте модуль, если хотите выгрузить все методы по мере их появления. Местоположение скрипта копируется на ваш компьютер, чтобы вы могли вставить выполняемый скрипт dtrace в терминал.
ВНИМАНИЕ: ВЫ ДОЛЖНЫ ОТКЛЮЧИТЬ ROOTLESS ДЛЯ ИСПОЛЬЗОВАНИЯ DTRACE
(lldb) pmodule UIKit
(lldb) pmodule -n libsystem_kernel.dylib
(lldb) pmodule -a
Snoopie
Генерирует скрипт DTrace, который будет профилировать только классы, реализованные в основном исполняемом файле, независимо от того, стёрт двоичный файл или нет. Это делается путём профилирования objc_msgSend. Создание этой команды обсуждается в книге.
ВНИМАНИЕ: ВЫ ДОЛЖНЫ ОТКЛЮЧИТЬ ROOTLESS ДЛЯ ИСПОЛЬЗОВАНИЯ DTRACE
Ls
Список каталога с точки зрения процесса. Полезно при работе с реальным устройством.
(lldb) ls /
(lldb) ls /System/Library
Reload_lldbinit
Перезагружает всё содержимое в вашем файле ~/.lldbinit. Полезно, чтобы увидеть, сломался ли ваш скрипт(ы) на Python или вы хотите выполнить инкрементные обновления скрипта Python.
(lldb) reload_lldbinit
Tv
Переключает вид. Скрывает/показывает представление в зависимости от его текущего состояния. Вам не нужно возобновлять работу LLDB, чтобы увидеть изменения. Только ObjC.
(lldb) tv [UIView new]
Pprotocol
Выгружает все необходимые и необязательные методы для конкретного протокола (только Objective-C).
(lldb) pprotocol UITableViewDataSource
Pexecutable
Печатает местоположение (на диске) пути к исполняемому файлу.
(lldb) pexecutable
Pframework
Печатает расположение (на диске) фреймворка.
(lldb) pframework UIKit
Sys
Переход в оболочку для выполнения команд. Обратите внимание, что вы можете выполнять команды LLDB с помощью синтаксиса $().
(lldb) sys ls
(lldb) sys otool -l $(pframework UIKit)
(lldb) sys open -a "Hopper" $(pexecutable)
Methods
Выгрузка всех методов, реализуемых подклассом NSObject (iOS, только подкласс NSObject).
(lldb) methods UIView
Ivars
Выгрузка всех ivars для экземпляра определённого класса, наследуемого от NSObject (iOS, только подкласс NSObject).
(lldb) ivars [UIView new]
Dumpenv
Выгрузка переменных среды, найденных в процессе.
(lldb) dumpenv
TESTMANAGERD_SIM_SOCK=/private/tmp/com.apple.launchd.9BmpbuRgyE/com.apple.testmanagerd.unix-domain.socket
MallocNanoZone=0 ... keychain
Выгружает базу данных связки ключей, относящуюся к процессу.
(lldb) keychain
<__NSArrayM 0x600001fb1590>(
{
acct = "localdevice-AuthToken";
agrp = apple;
"v_Data (str)" = "A8CD94D2-13E3-40B...
info
Определяет, что такое адрес. Определяет, является ли это адресом кучи, MachO или стека.
(lldb) info 0x00007ffee39fd540
0x00007ffee39fd540, адрес стека (SP: 0x7ffee39fd4e8, FP: 0x7ffee39fd540) mach_msg_trap
(lldb) info 0x7ff15e866800
0x7ff15e866800, 0x7ff15e866800 указатель кучи, (0x600 байт)
(lldb) info 0x1279232a6
0x1279232a6, -[MKPlaceInfoViewController viewDidLoad] <+0> `MapKit`__TEXT.__text + 0x1813d6
lsof
Список открытых файловых дескрипторов в процессе. (Без аргументов).
(lldb) lsof
0 /dev/null
1 /dev/null
2 /dev/null
4 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/KeyboardLayouts/USBKeyboardLayouts.bundle/uchrs/US.uchr
gg
Приостанавливает процесс (хорошая игра, также известная как «игра окончена», странная команда, я знаю). (Без аргументов).
dump_app_contents
Выгрузка содержимого пакета приложения. (Без аргументов).
mload
Удобный метод dlopen.
pbpaste
Вставка выбранного текста с вашего Mac на ваше устройство iOS. (Без аргументов, но убедитесь, что у вас есть что-то в буфере обмена).
bdel
Удаление точки останова по адресу.
data
Дамп байтов объекта NSData.
pexecutable
Выводит полный путь к исполняемому файлу. (Без аргументов).
plocalmodulelist
Выгружает локальные модули, специфичные для приложения. (Без аргументов).
overlaydbg
Отображает UIDebuggingInformationOverlay на iOS в версии 11. Ознакомьтесь с инструкциями на сайте http://ryanipete.com/blog/ios/swift/objective-c/uidebugginginformationoverlay/.
# Отображение UIDebuggingInformationOverlay
(lldb) overlaydbg
Вы дочитали до этого места!? Вот видео, в котором рассказывается о некоторых из этих скриптов.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )