2016-08-12 11 views
0

типичный шаблон отладки:lldb: условная точка останова на наиболее производный тип

class Button : public MyBaseViewClass 
{ 
... 
}; 

.... 
void MyBaseViewClass::Resized() 
{ 
//<---- here I want to stop in case MyBaseViewClass is really a Button, but not a ScrollBar, Checkbox or something else. I.e. I want a breakpoint condition on a dynamic (most derived) type 
} 

тривиальные подходы, как в контрольной точке на strstr (TypeId (* это) .name(), "Button") не работает, потому что на TypeID lldb консоли говорит:

(lldb) p typeid(*this) 
error: you need to include <typeinfo> before using the 'typeid' operator 
error: 1 errors parsing expression 

безусловно #include в консоли перед выполнением вызова не помогает

ответ

1

Вы можете сделать это в 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 

так что вы не должны продолжать переименовывать его.

+0

приятно иметь поддержку через python, но IMHO такая вещь должна быть действительно встроена внутри самого отладчика. –

+0

Пожалуйста, укажите ошибку, запрашивающую это, либо с помощью lugb.llvm.org, либо с помощью http://bugreporter.apple.com. –

+0

Есть ли удобный способ передать дополнительные аргументы функции my_functions.function выше? Очевидно, что я могу обернуть вызов, но он пахнет, написав слишком много кода, в идеале это будет что-то вроде:> breakpoint command add -F my_functions.function YourClassNameHere, который должен идти в качестве аргумента или внутри этого внутреннего_дикта –

 Смежные вопросы

  • Нет связанных вопросов^_^