Как использовать содержимое стека в состоянии точки останова LLDB?

Проблема: я

у нас возникла ситуация, когда во время запуска у нас воспроизводится мультимедиа, и objc_exception_throw () срабатывает примерно 5 раз за этот период, но всегда перехватывается, и этопуть к югу от объекта медиаплеера.

Я устал от (а) необходимости вручную продолжать n раз или (б) от необходимости оставлять точки останова отключенными до завершения воспроизведения.

Что я'мы пробовали:

заставить точку останова игнорировать первые пять попаданий (проблема:не всегда ровно пять раз)создание моей собственной символической точки останова с использованием моей цели в качестве модуля (проблема: ничего не изменилось)

Что я'Я хотел бы сделать:

Одно из решений, которое приходит на ум, - это оценить стек при достижении точки останова и продолжить работу, если в нем указан конкретный метод или функция. Но я понятия не имею, как это сделать.

Другие идеи также приветствуются.

Ответы на вопрос(2)

break command add -s python -o "return any('xyz' in f.name for f in frame.thread)"

Если команда останова Python возвращаетсяFalse, LLDB будет продолжать идти. Так что это говорит: еслиany кадр в стеке имеет строку'xyz' в его имени, затем вернитеTrue (прекратить). В противном случае, если ни один кадр не имеет такого имени, этоany выражение вернетсяFalse (продолжать).

Решение Вопроса

Вы делаете это с помощью Python.

Следующее определяет список игнорирования и функцию, которую вы можете присоединить в качестве команды к точке останова.

Функция захватывает имена функций в обратном следе и устанавливает-пересекает эти имена с помощью списка игнорируемых. Если какие-либо имена совпадают, процесс продолжает выполняться. Это эффективно пропускает попадание в отладчик для нежелательных стеков.

(lldb) b objc_exception_throw
Breakpoint 1: where = libobjc.A.dylib`objc_exception_throw, address = 0x00000000000113c5
(lldb) script
Python Interactive Interpreter. To exit, type 'quit()', 'exit()' or Ctrl-D.
>>> ignored_functions = ['recurse_then_throw_and_catch']
def continue_ignored(frame, bp_loc, dict):
    global ignored_functions
    names = set([frame.GetFunctionName() for frame in frame.GetThread()])
    all_ignored = set(ignored_functions)
    ignored_here = all_ignored.intersection(names)
    if len(ignored_here) > 0:
        frame.GetThread().GetProcess().Continue()

quit()

(lldb) br comm add -F continue_ignored 1
(lldb) r

Я попробовал это против следующего файла, и он успешно пропускает первый бросок внутриrecurse_then_throw_and_catch и падает в отладчик во время броска внутрь.throw_for_real

#import 

void
f(int n)
{
    if (n 
 MikeyWard05 июн. 2013 г., 02:17
Черт, чувак. Лучший ответ, который я могмы надеялись на.
 Jeremy W. Sherman05 июн. 2013 г., 17:40
@JasonMolenda Совершенно верно. "Где угодно в стеке было то, что я считал желанным на основе "оцените стек при достижении точки останова и продолжайте работу, если в нем указан конкретный метод или функция », Было бы просто адаптироваться, чтобы сделатьif frame.GetThread().GetFrameAtIndex(1).GetFunctionName() in ignored_functions: вместо. Основная идея заключается в использовании функции Python в качестве команды точки останова.
 Jason Molenda05 июн. 2013 г., 05:00
Хороший ответ. Единственное предостережение в том, что это будетcontinue если какой-либо изignored_functions появляется где-нибудь в стеке, вместо простой проверки кадра "выше" ,objc_exception_throw
 Jim Ingham14 янв. 2014 г., 19:35
Обратите внимание, что начиная с Xcode 5 's lldb, lldb проверяет возвращаемое значение из команд точки останова Python, и если они возвращают логическое значение False, lldb продолжит работу с точки останова. Может быть, этонемного легче, чем звонитьПродолжить" рукой. Это также означает, что если вы нажмете две точки останова одновременно (что происходит в многопоточном коде), lldb продолжит работу, только если обе попытки останова захотят продолжить.

Ваш ответ на вопрос