В ответ на ответ Джима, это также можно сделать как один вкладыш, без создания именованной функции:
breakpoint command add -s python -o 'return frame.parent.name == "rb_ary_collect_bang"'
lldb создает для вас функцию-обертку (которая имеет параметр frame
), и ключом является return
результат сравнения, потому что, как сказал Джим, lldb остановится, если результат равен true, и сохранит происходит, если результат ложен.
Это может быть расширено до просмотра любой вызывающей функции в стеке:
br c add -s python -o 'return any(f.name == "rb_ary_collect_bang" for f in frame.thread)'
Это немного более непрозрачно. Выражение frame.thread
является итератором всех кадров в стеке текущего потока. Выражение [f.name for f in frame.thread]
даст вам список всех имен функций в стеке. Выражение any(f.name == "abc" for f in frame.thread)
возвращает true, если функция "abc" находится где-либо в стеке.
В GDB есть несколько вспомогательных функций для этих случаев, и я написал аналогичные функции для lldb. https://github.com/kastiglione/lldb-helpers. Используя эти функции, вы можете написать:
break com add -F 'caller_is("rb_ary_collect_bang")'