Вы можете сделать это в Python довольно легко. Установите контрольную точку - говорят, что это контрольная точка 1 - то сделать:
(lldb) break command add -s python 1
Enter your Python command(s). Type 'DONE' to end.
def function (frame, bp_loc, internal_dict):
"""frame: the lldb.SBFrame for the location at which you stopped
bp_loc: an lldb.SBBreakpointLocation for the breakpoint location information
internal_dict: an LLDB support object not to be used"""
this_value = frame.FindVariable("this", lldb.eDynamicDontRunTarget)
this_type = this_value.GetType().GetPointeeType().GetName()
if this_type == "YourClassNameHere":
return True
return False
DONE
Единственной хитростью является то, что при вызове FindVariable я прошел lldb.eDynamicDontRunTarget
, который сказал lldb, чтобы принести «динамический» тип переменной, в отличие от статический тип. Как в стороне, я мог бы также использовать lldb.eDynamicRunTarget
, но я знаю, что lldb не должен запускать цель, чтобы получить динамические типы C++.
Этот способ решения проблемы хорош в том, что вам не нужно использовать RTTI для его работы (хотя тогда мы сможем получить только тип классов, имеющих какой-либо виртуальный метод), поскольку мы используйте vtable, чтобы сделать эту магию.) Он также будет быстрее, чем метод, который требует запуска кода в дебюге, поскольку ваше выражение должно было бы сделать.
Кстати, если вам нравится этот трюк, вы можете также поставить точку останова код в функции питона в некоторых питона файл (просто скопировать выше размораживание), а затем использовать:
(lldb) command script import my_functions.py
(lldb) breakpoint command add -F my_functions.function
так что вы не должны продолжать переименовывать его.
приятно иметь поддержку через python, но IMHO такая вещь должна быть действительно встроена внутри самого отладчика. –
Пожалуйста, укажите ошибку, запрашивающую это, либо с помощью lugb.llvm.org, либо с помощью http://bugreporter.apple.com. –
Есть ли удобный способ передать дополнительные аргументы функции my_functions.function выше? Очевидно, что я могу обернуть вызов, но он пахнет, написав слишком много кода, в идеале это будет что-то вроде:> breakpoint command add -F my_functions.function YourClassNameHere, который должен идти в качестве аргумента или внутри этого внутреннего_дикта –