Я пытаюсь сделать что-то немного причудливое здесь, но документы предполагают, что это должно быть возможно.Может быть, 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 быстро мигает, когда оно приостанавливается и возобновляетсявыполнение. Обычно я сожалею об этом, потому что он перестает отвечать и вскоре падает.)
Итак: Есть идеи?Технология еще не готова, или я просто упускаю какой-то умный кусок головоломки, который все исправит?Или я должен полностью отказаться и просто жить с тем фактом, что есть некоторые части внутренних объектов, которые я никогда не пойму? ...