Я пытаюсь сделать здесь что-то немного необычное, но документы предполагают, что это должно быть возможно. Может быть, LLDB все еще слишком нов, но я получаю много сбоев / взаимоблокировок отладчика, и даже когда этого не происходит, похоже, что он работает не так, как я ожидал.
Я пытаюсь собрать отладочную оболочку для всех вызовов селекторов, чтобы извлечь граф вызовов сообщений внутри определенного фрагмента кода. (Я мог бы объяснить, почему, если вы действительно хотите знать, но это не имеет отношения к проблеме с отладчиком.)
Я начинаю с точки останова Xcode в строке, где я хочу начать отслеживать вещи (для бонусных баллов это происходит во вторичном потоке, но, прежде чем вы спросите, нет, ничто в любом другом потоке не делает никаких доступов к этому объекту или что-либо в его подграфе свойств):
[myObject startProcessing];
Срабатывает точка останова, и я запускаю "bt" только для извлечения:
* thread #5: tid = 0x2203, 0x000277d2 .........
Затем я делаю что-то мягкое зло: я ставлю точку останова в objc_msgSend прямо в той инструкции, где она обращается к реальному селектору объектов. objc_msgSend выглядит так:
libobjc.A.dylib`objc_msgSend:
...(instructions)...
0x37babfa4: bx r12
...(more instructions)...
(На самом деле есть два вызова bx, но давайте не будем усложнять.) Я запускаю:
breakpoint set -a 0x37babfa4 -t 0x2203
(TID включен, потому что у меня достаточно проблем с отслеживанием этого потока, и мне не нужно, чтобы посторонние вещи мешали.)
Вот тут-то и появляются сценарии. Описанная выше установка работает именно так, как мне бы хотелось. Если я возобновлю выполнение до срабатывания точки останова, я могу запустить:
frame select 0
thread step-inst -m this-thread 5
frame info
continue
и эффект будет таким, что отладчик:
- перемещается в кадр objc_msgSend
- шагов на одну инструкцию, продвигая ее в кадр селектора объектов, на который она указывала
- отображает соответствующие детали (тип объекта, вызываемый селектор)
- возобновляет исполнение
в этот момент я могу продолжать вставлять эти четыре команды снова и снова и копировать вывод, пока не возненавижу себя.
Если, с другой стороны, я запускаю:
breakpoint command add -s command
и вставьте эти те же самые команды, все сломается. Он не переходит к рамке селектора объектов. Он не показывает детали кадра или, по крайней мере, неправильные — в зависимости от различных настроек (см. ниже) он может отображать или не отображать «objc_msgSend» как текущую функцию. Он не возобновляет выполнение.
В этом случае, если бы я мог заставить этот пример работать, я был бы в основном счастлив. Но для еще большего количества бонусных баллов я также попробовал это с python, который я бы предпочел, потому что он позволит вести гораздо более сложную регистрацию:
breakpoint command add -s python
> thread = frame.GetThread()
> thread.StepInstruction(1)
> newFrame = thread.GetFrameAtIndex(0)
> print " " * thread.GetNumFrames() + newFrame.GetFunctionName()
> process = thread.GetProcess()
> process.Continue()
> DONE
Опять ничего хорошего. Опять же, в зависимости от мельчайших деталей, это может напечатать или не напечатать что-то (обычно objc_msgSend), но никогда не напечатает правильную вещь. Он никогда не продвигает инструкцию вперед. После этого он никогда не возобновляет выполнение.
И опять же, версия Python отлично работает, если я делаю это вручную: если я подожду, пока сработает точка останова, затем запущу «скрипт» и введу те же самые строки, все будет работать так, как ожидалось. Некоторые части будут работать даже изолированно, например. если я удалю все, кроме частей, которые получают процесс и вызывают process.Continue(), и запускаю их автоматически, это «работает» (это означает, что я вижу быстро мигающую подсказку lldb, когда она приостанавливает и возобновляет выполнение. Обычно я сожалею об этом, потому что это становится не отвечает и вскоре после этого вылетает.)
Итак: Есть идеи? Является ли технология еще не готовой, или я просто упускаю какую-то умную часть головоломки, которая все исправит? Или я должен полностью сдаться и просто жить с фактом, что есть некоторые части внутренностей объекта, которые я никогда не пойму?...