1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/bqlin-LLDB

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

LLDB

LLDB — это набор псевдонимов и регулярных выражений для LLDB, а также скрипты на Python, которые помогают в отладке. Эти скрипты созданы исключительно для развлечения автора, но некоторые из них могут быть полезны в вашей работе. Если вы хотите лучше понять, как создавать такие скрипты для LLDB или улучшить понимание работы с LLDB в целом, ознакомьтесь с книгой «Advanced Apple Debugging and Reverse Engineering» (Продвинутое изучение отладки и обратного проектирования Apple).

Установка

  1. Чтобы установить, скопируйте или клонируйте папку lldb_commands в любую директорию по вашему выбору.
  2. Откройте или создайте файл ~/.lldbinit.
  3. Добавьте следующую команду в файл ~/.lldbinit: command script import /path/to/lldb_commands/dslldb.py.

Готово! Вы можете приступать к работе!

Чтобы убедиться, что всё работает правильно, просто попробуйте выполнить одну из команд в отладчике... например, (lldb) help methods.

Я рекомендую использовать клонирование. Так, когда я объявлю о новом скрипте или исправлении, вы сможете просто выполнить git pull, вместо того чтобы повторять весь процесс заново.

Скрипты LLDB

Для всех команд ниже вы можете просмотреть документацию с помощью команды help {команда}. Если вы хотите узнать, какие параметры есть у команды, введите {команда} -h.

TLDR: search, lookup и dclass — хорошие команды для использования независимо от того, являетесь ли вы разработчиком или исследуете без исходного кода.

Если вам нравится swizzling Objective-C, обратите внимание на sclass. Если вам нравится DTrace, посмотрите pmodule и snoopie.

search

Ищет в куче все живые экземпляры определённого класса. Этот класс должен быть динамическим (то есть наследоваться от класса 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

dclass

Выводит все классы 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

Только выгрузить классы, суперкласс которых имеет тип NSObject и находится в модуле UIKit. Идеально для поиска конкретных классов, таких как источник данных, который, скорее всего, наследуется от NSObject

(lldb) dclass -s NSObject -m UIKit

Выгружать только классы Swift

(lldb) dclass -t swift

Выгружать только классы Objective-C

(lldb) dclass -t objc

Получить упрощённый «дамп класса» для класса UIView

(lldb) dclass -i UIView

Узнать больше о UIView, чем хотелось бы

(lldb) dclass -I UIView

Раздел

Отображает данные в сегментах/разделах Mach-O исполняемого файла или фреймворков, загруженных в процесс

Дамп сегментов Mach-O для основного исполняемого файла

(lldb) section

Дамп сегментов Mach-O для UIKit

(lldb) section UIKit

Дамп разделов Mach-O сегмента __TEXT для UIKit

(lldb) section UIKit __TEXT

Получение адреса загрузки всех жёстко закодированных строк uint8_t * в двоичном файле UIKit

(lldb) section UIKit __TEXT.__cstring -l

Получение разрешений для исполняемого файла (только для симулятора, разрешения для реального приложения находятся в __LINKEDIT)

(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), пока процесс активен

Вы узнаете, как сделать эту команду в книге :]

Поиск

Выполните поиск по регулярному выражению в исполняемом файле.

Пример:

Найти все методы, содержащие фразу viewDidLoad

(lldb) lookup viewDidLoad

Найдите сводку всех модулей, у которых есть известная функция, содержащая фразу viewDidLoad

(lldb) поиск viewDidLoad -s

Поиск кода Objective-C в усечённом модуле (например, в SpringBoard)

(lldb) loo -x StocksFramework .

Искать код Objective-C, содержащий фразу init без учёта регистра внутри усечённого основного пакета

(lldb) поиск -X (?i)init

Ищите все жёстко запрограммированные символы char * внутри исполняемого файла, содержащего фразу http внутри UIKit

(lldb) поиск -S http -m UIKit

Дампить все md5'd base64 ключи в libMobileGestalt вместе с адресом в памяти

(lldb) loo -S ^[a-zA-Z0-9+]{22,22}$ -m libMobileGestalt.dylib -l

Дампить весь глобальный код bss, на который ссылается DWARF. Идеально подходит для доступа к статическим переменным, когда они не в области видимости

(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

Проследить весь код Objective-C в UIKit

(lldb) pmodule UIKit

Отследить весь не-Objective-C код в libsystem_kernel.dylib (т. е. pid$target:libsystem_kernel.dylib::entry)

(lldb) pmodule -n libsystem_kernel.dylib

Выгрузить всё. Отображает только количество вызовов функций из модулей после завершения сценария. Предупреждение: медленно

(lldb) pmodule -a

Snoopie

Генерирует скрипт DTrace, который будет профилировать только классы, реализованные в основном исполняемом файле, независимо от того, стёрт двоичный файл или нет. Это делается путём профилирования objc_msgSend. Создание этой команды обсуждается в книге.

ВНИМАНИЕ: ВЫ ДОЛЖНЫ ОТКЛЮЧИТЬ ROOTLESS ДЛЯ ИСПОЛЬЗОВАНИЯ DTRACE

Команды LLDB

Ls

Список каталога с точки зрения процесса. Полезно при работе с реальным устройством.

Список содержимого корневого каталога на реальном устройстве iOS

(lldb) ls /

Список содержимого для /System/Library на реальном устройстве iOS

(lldb) ls /System/Library

Reload_lldbinit

Перезагружает всё содержимое в вашем файле ~/.lldbinit. Полезно, чтобы увидеть, сломался ли ваш скрипт(ы) на Python или вы хотите выполнить инкрементные обновления скрипта Python.

Перезагрузите/обновите ваши скрипты LLDB

(lldb) reload_lldbinit

Tv

Переключает вид. Скрывает/показывает представление в зависимости от его текущего состояния. Вам не нужно возобновлять работу LLDB, чтобы увидеть изменения. Только ObjC.

Переключить представление на или выключить

(lldb) tv [UIView new]

Pprotocol

Выгружает все необходимые и необязательные методы для конкретного протокола (только Objective-C).

Протоколирование для UITableViewDataSource

(lldb) pprotocol UITableViewDataSource

Pexecutable

Печатает местоположение (на диске) пути к исполняемому файлу.

(lldb) pexecutable

Pframework

Печатает расположение (на диске) фреймворка.

(lldb) pframework UIKit

Sys

Переход в оболочку для выполнения команд. Обратите внимание, что вы можете выполнять команды LLDB с помощью синтаксиса $().

ls каталог, в котором работает LLDB

(lldb) sys ls

Используйте otool -l во фреймворке UIKit

(lldb) sys otool -l $(pframework UIKit)

Откройте основной исполняемый файл в другой программе

(lldb) sys open -a "Hopper" $(pexecutable)

Methods

Выгрузка всех методов, реализуемых подклассом NSObject (iOS, только подкласс NSObject).

Получить все методы UIView

(lldb) methods UIView

Ivars

Выгрузка всех ivars для экземпляра определённого класса, наследуемого от NSObject (iOS, только подкласс NSObject).

Получите все ivars в только что созданном экземпляре UIView

(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 )

Вы можете оставить комментарий после Вход в систему

Введение

Сборник псевдонимов и регулярных выражений LLDB, а также скриптов на Python для упрощения сеансов отладки. Развернуть Свернуть
GPL-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/bqlin-LLDB.git
git@api.gitlife.ru:oschina-mirror/bqlin-LLDB.git
oschina-mirror
bqlin-LLDB
bqlin-LLDB
master