Как установить точку останова, которая срабатывает только в пределах определенной родительской функции? - PullRequest
0 голосов
/ 13 ноября 2018

Я хотел бы добавить точку останова к методу rb_vm_check_ints, но только когда он вызывается из rb_ary_collect_bang. Выполняется несколько потоков.

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

В ответ на ответ Джима, это также можно сделать как один вкладыш, без создания именованной функции:

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")'
0 голосов
/ 13 ноября 2018

Вам нужно написать обратный вызов точки останова Python.Это описано здесь:

http://lldb.llvm.org/python-reference.html

в разделе «Запуск скрипта Python при достижении точки останова».

В документах вы обнаружите, что если обратный вызов возвращает False, то lldb не остановится для этого достижения точки останова.

Кроме того, один из аргументов, переданных в обратный вызовэто кадр, содержащий код, который только что достиг точки останова.Объект frame на самом деле является объектом lldb.SBFrame.Документы для SBFrame находятся здесь:

http://lldb.llvm.org/python_reference/lldb.SBFrame-class.html

Свойство parent SBFrame возвращает кадр вызывающего абонента.Свойство name возвращает имя функции.Итак, вы хотите сделать что-то вроде:

def MyCallback(frame, bp_loc, dict):
    if frame.parent.name == "rb_ary_collect_bang":
       return True
    else
       return False
...