2016-08-12 7 views
0

typisches Debug-Muster:LLDB: bedingter Haltepunkt auf einem am meisten abgeleiteten Typ

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 
} 

trivial Ansätze wie ein Haltepunkt auf strstr (typeid (* this) .name(), "Button") funktioniert nicht, weil auf typeid LLDB Konsole sagt: das ist in Python tun kann ziemlich leicht

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

sicher # include in der Konsole, bevor Sie den Anruf nicht

Antwort

1

Sie hilft. Stellen Sie den Breakpoint - sagen, es Breakpoint 1 - dann tun:

(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 

Der einzige schwierige Bit ist hier, dass, wenn Findvariable Aufruf ich lldb.eDynamicDontRunTarget geleitet, die LLDB sagte dem „dynamischen“ Typ der Variablen zu holen, im Gegensatz zu der statische Typ. Nebenbei könnte ich auch lldb.eDynamicRunTarget verwendet haben, aber ich weiß zufällig, dass lldb das Ziel nicht ausführen muss, um C++ dynamische Typen zu erhalten.

Diese Möglichkeit, das Problem zu lösen, ist schön, weil Sie RTTI nicht dafür brauchen müssen, um zu funktionieren (obwohl wir dann nur Klassen bekommen können, die irgendeine virtuelle Methode haben - seit wir benutze die vtable, um diese Magie auszuführen.) Es ist auch schneller als eine Methode, die Code im debugee ausführen muss, wie dein Ausdruck es tun müsste.

BTW, wenn Sie mögen diesen Trick, können Sie auch den Breakpoint-Code in eine Python-Funktion in einigen Python-Datei setzen kann (nur die def oben kopieren), verwenden Sie dann:

(lldb) command script import my_functions.py 
(lldb) breakpoint command add -F my_functions.function 

so tun Sie nicht muss es immer wieder tippen.

+0

nice, um Unterstützung über Python zu haben, aber IMHO sollte so etwas wirklich in den Debugger selbst eingebettet werden. –

+0

Bitte reichen Sie einen Fehler ein, der dies entweder mit dem Bugtracker von lldb.llvm.org oder http://bugreporter.apple.com anfordert. –

+0

Gibt es einen bequemen Weg, um zusätzliche Argumente zu my_functions.function oben zu übergeben? Offensichtlich kann ich den Anruf einpacken, aber es riecht, indem ich zu viel Code schreibe, im Idealfall wäre es so etwas wie:> Breakpoint-Befehl add -F my_functions.function YourClassNameHere was als var Argument oder in diesem internal_dict gehen soll –

Verwandte Themen