4 Stimmen

Wie kann man eine vtable in Visual C++ untersuchen?

Angenommen, man hat eine komplexe Codebasis (in Visual C++, vermutlich 2003 oder vielleicht später) mit einem großen und komplexen Vererbungsgraphen geerbt. Nehmen wir an, er ist tief und es gibt viele virtuelle Funktionen und möglicherweise sogar Mehrfachvererbung. (Ja, ein ziemlicher Wartungsalptraum). Jeder Versuch, diese Klassenhierarchie in etwas Vernünftigeres umzuwandeln, muss wissen, welche Implementierung jeder virtuellen Funktion jede Klasse verwendet.

Wenn wir eine beliebige Blattklasse L1 nehmen - die von der Basisklasse B1 abgeleitet ist, die wiederum von der Basisklasse B2 abgeleitet ist, usw. - hat sie eindeutig eine vtable für die Klasse, die so etwas wie eine (Pseudo-Vtable) darstellt:

L1::F1
B3::F2
B1::F3
L1::F4
etc.

...abhängig davon, welche virtuellen Funktionen genau von welcher Klasse überschrieben wurden.

Wie kann man eine solche Tabelle in einer solchen Form sehen? Es wäre möglich, sie von Hand zu rekonstruieren, indem man den Code durchliest, aber das ist fehleranfällig und mühsam. Vermutlich könnte man auch in ein Objekt der Klasse im Debugger einbrechen, um die vtable in einem Watch-Fenster über den vtable-Zeiger für diese eine Klasse zu inspizieren, aber das ist eine umständliche Lösung, besonders wenn man auch die vtables für L2, L3, ... sehen will. LN.

Bietet DbgHelp.dll die Möglichkeit, die vtables programmatisch zu überprüfen (und die Ausgabe in jeder gewünschten Form zu ermöglichen)? Oder gibt es eine andere Methode?

14voto

kervin Punkte 11462

In Visual Studio 2005 gibt es zwei undokumentierte Flags, die genau das tun, was Sie brauchen. Sie sind die reportAllClassLayout y reportSingleClassLayout Flaggen. Versuchen Sie zum Beispiel "/d1 reportAllClassLayout" in der cl.exe Befehlszeile. Es zeigt Ihnen das gesamte Klassenlayout einschließlich der virtuellen Tabellen an. Ejemplo . Siehe auch http://blogs.msdn.com/vcblog/archive/2007/05/17/diagnosing-hidden-odr-violations-in-visual-c-and-fixing-lnk2022.aspx Es gibt nicht allzu viele Informationen über diese Flags, da sie im Moment nicht dokumentiert sind, aber vielleicht wird Microsoft sie in zukünftigen Versionen von Visual Studio offiziell unterstützen.

Ein anderer Ansatz, den ich eigentlich bevorzuge, ist die Verwendung der IDA Pro Interaktiver Disassembler. Es gibt eine enorme Lernkurve, aber IDA ist intelligent genug, um Ihnen bei der Erstellung von VTables zu helfen und sie mit Ihren Klassen zu verknüpfen. Es wird verwendet, um Binärdateien zurückzuentwickeln, für die Sie traditionell keine Symbole haben, aber es verwendet auch Visual Studio Pdb-Dateien. Auf diese Weise werden Sie sehen genau was alle wie Ihre vTabellen aussehen. Welche virtuellen Tabellen werden für welche Methoden verwendet oder welche Methoden werden überschrieben, während Sie durch den Code schreiten. Mit anderen Worten: Sie sehen, wie Ihre Methodenaufrufe verfolgt werden. in die vTabelle während des Debuggens zur Laufzeit. Typische Debugger wie VS Debugger verfolgen keine virtuellen Tabellen, wie Sie bemerkt haben.

1voto

coppro Punkte 14158

Ich empfehle dringend die Verwendung von Doxygen als Werkzeug für jede Art von Code-Analyse wie diese. Ich glaube nicht, dass es eine schnelle Möglichkeit bietet, den endgültigen Overrider für eine Funktion in einem Typ zu finden, aber es sollte eine Auflistung dessen liefern, was vererbt und was implementiert wird, so dass Sie den Baum schnell durchsuchen können, um den Overrider für eine beliebige Funktion zu identifizieren (normalerweise ist Ihre Hierarchie nicht groß genug, um dies zu einer großen Sache zu machen). Es kann auch Aufrufdiagramme, Beziehungsdiagramme und mit Hyperlinks versehenen Quellcode erzeugen, was ein fantastisches Werkzeug ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X