iOS: многострочные команды точки останова LLDB не работают должным образом - PullRequest
4 голосов
/ 28 марта 2012

Я пытаюсь сделать что-то немного причудливое здесь, но документы предполагают, что это должно быть возможно.Может быть, 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 работает нормально, если я делаю это вручную: если я подожду, пока не сработает точка останова, запустите «script» и введите те же строки, это будет работать какожидается.Некоторые части будут даже работать изолированно, например, если я удаляю все, кроме частей, которые получают процесс и вызывает process.Continue () и автоматически запускает те, которые «работают» (то есть я вижу, что приглашение lldb быстро мигает, когда оно приостанавливается и возобновляетсявыполнение. Обычно я сожалею об этом, потому что он перестает отвечать и вскоре падает.)

Итак: Есть идеи?Технология еще не готова, или я просто упускаю какой-то умный кусок головоломки, который все исправит?Или я должен полностью отказаться и просто жить с тем фактом, что есть некоторые части внутренних объектов, которые я никогда не пойму? ...

1 Ответ

3 голосов
/ 17 октября 2012

Команды точки останова не могут возобновить выполнение и затем вернуть управление снова, по крайней мере, сегодня.Есть много нерешенных вопросов о том, что произойдет, если точка останова 1 запустит процесс, а затем точка останова 2 будет достигнута.Помимо всего вопроса о том, может ли база кода действительно правильно обрабатывать вложенные точки останова (она была разработана для ...), что это значит, если точка останова 2 решает, что выполнение должно быть остановлено?Состояние точки останова 1 выбрасывается?

Кажется немного эзотерическим беспокоиться о том, что точка останова попадает в другую точку останова при переходе к низшему процессу, но если все детали не проработаны, пользователю легко выстрелить себе в ногу.Таким образом, на сегодняшний день команды точек останова могут либо останавливаться при достижении точки останова, либо продолжать работать, но нет никакой возможности запустить немного и выполнить больше обработки.Я знаю, что это была бы действительно полезная возможность для определенных задач, но есть много ошибок, которые необходимо продумать, прежде чем это можно будет сделать.

В некоторых случаях можно справиться с этим другим способомвокруг ... если вы хотите остановиться в функции parser() только тогда, когда она была вызвана функцией lexer(), легко установить точку останова на lexer() с помощью нескольких команд python, чтобы перейти на один стек вверхстека и посмотреть, что вызывает функция.Если это не lexer(), продолжайте.Я не думаю, что это будет относиться к тому, что вы пытаетесь сделать.

...