Wie schreibt man einen custom native visualizer-DLL für Visual Studio 2012-debugger?
Was nötig ist zum schreiben eines benutzerdefinierten native visualizer-DLL in C++ für Visual Studio 2012-debugger? Ich will angezeigter Wert kann nur berechnet werden, aus einer Klasse/struct on-demand-also eine native visualizer-DLL ist erforderlich. Visual Studio 2012 verwendet eine neue Methode für die Umsetzung von native-Visualisierungen genannt Natvis. Ab diesem Zeitpunkt, es gibt sehr wenig richtige Informationen auf Natvis und vor allem auf die Verwendung Natvis zu nennen visualizer-DLL. Die DLL wird die Berechnung einer display-saite, basierend auf der Klasse/struct member-Werte.
- code.msdn.microsoft.com/windowsdesktop/...
- Das ist eine große natvis post, die ich auch weiter unten erwähnt, es muss aber nicht ein Wort über das schreiben eines benutzerdefinierten native visualizer dll. Ich werde großzügig sein und sagen, dass es zu früh das Spiel für die Microsoft zur Abdeckung des gesamten Themas.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist der C++ - code, umfasst das Add-in-DLL. Ich benannte die Datei NatvisAddIn.cpp und das Projekt erstellt NatvisAddIn.dll.
Hier ist die .natvis-Datei, die Visual Studio 2012-debugger verwendet, um den Wert anzuzeigen. Platzieren Sie es in einem .natvis-Datei. Ich nannte es NatvisAddIn.natvis. Die Datei weist VS-2012-debugger zu nennen NatvisAddIn.dll. Die dll enthält zwei visualizer-Methode ruft; MyClassFormatter formatieren MyClass und MyStructFormatter formatieren MyStruct. Der debugger zeigt die Methode der formatierte Wert in der Auto -, Uhren-oder tooltip-Anzeige für jede Instanz des angegebenen Typs (MyClass, MyStruct).
Sowohl die kompilierte NatvisAddIn.dll Datei und die NatvisAddIn.natvis-Dateien in einem der folgenden drei Orte:
Müssen Sie sicherstellen, dass die folgenden Registrierungsschlüssel vorhanden ist und den Wert 1:
Wenn alles gut geht, werden Sie sehen, natvis-Nachrichten werden in die Visual Studio-debugger-Ausgabefenster. Die Nachrichten zeigen wird, ob Natvis war in der Lage zu analysieren .natvis-Dateien. Die Ergebnisse der Analyse jeder .natvis-Datei wird in Ausgabe-Fenster. Wenn etwas falsch ist, verwenden Sie den Befehl "dumpbin/exports ", um zu überprüfen, dass die DLL-Methoden' Namen sind genau das passende .navis Dateityp=. Auch stellen Sie sicher, dass die aktuellen .dll-und .natvis-Dateien in das entsprechende Verzeichnis kopiert.
Test-Programm:
Informationen Ressourcen:
GetRealAddress
undReadDebuggeeMemoryEx
Umgang mit 64-bit-Adressen.%ENV_VAR%
und${ENV_VAR}
, kein Glück.Für 64-bit-version Debuggen, sollten folgende Einträge verwendet werden:
Zur vorherigen Beispiel, die 64bit version könnte wie folgt Aussehen:
Ich brauche eine Klarstellung bezüglich Suchpfad(en) gesucht werden für das laden der oben genannten "NatvisAddIn.dll". Lassen Sie mich versuchen zu erklären, durch die Erweiterung des obigen Beispiel
Zu visualisieren, meine benutzerdefinierte C++ - Klassen-Objekt(sagen wir mal MyCustomeType), muss ich anrufen einige zusätzliche APIs (zum berechnen der Anzeige-Zeichenfolge für MyCustomeType) in der Implementierung der Funktion(sagen MyClassFormatter), der erwähnt wird im "Export" - Attribut des "DisplayString" XML.
Aufruf dieser zusätzliche APIs erstellen Sie eine Bibliothek/dll-Abhängigkeit auf die oben genannten "NatvisAddIn.dll". Wenn diese zusätzliche Abhängigkeit ist nur ein oder zwei die Bibliothek, ich kann die Bibliothek an der gleichen Stelle, wo NatvisAddIn.dll vorhanden ist. Allerdings, in meinem Fall die Abhängigkeit enthält eine lange Kette von Bibliotheken.
Kann jemand empfehlen, mir einige elegante Weise zu lösen, die Abhängigkeit, ohne zu ziehen, die komplette Kette von Bibliotheken in %USERPROFILE%\My Documents\Visual Studio 2012\Visualizer-Ordner?
Zur demonstration der meine, lassen Sie uns betrachten Sie das folgende Abhängigkeitsstruktur:
NatvisAddIn.dll
ein.dll
a1.dll
a2.dll
a3.dll
Kopierte ich die a.dll an derselben Stelle, wo NatvisAddIn.dll. Es ist abhängig von dlls (a1, a2 und a3) vorhanden sind, an der Position, die Hinzugefügt werden, um die PATH-variable. Wenn ich versuche zu visualisieren MyCustomeType-Objekt in visual studio-debugger, der natvis diagonostic geben die folgende Fehlermeldung im Ausgabefenster
Natvis: C:\Users\myUser\Documents\Visual Studio 2017\Visualizer\mydata.natvis(9,6): Error: Failed to load addin aus C:\Users\myuser\Documents\Visual Studio 2017\Visualizers\NatvisAddIn.dll für Typ MyCustomeType: : Das angegebene Modul konnte nicht gefunden werden.
Mein Verständnis für oben genannten Fehler, der visual studio-debugger nicht in der Lage war zu lösen, Abhängigkeit von a.dll (a1, a2 und a3) und damit es nicht geladen werden konnte NatvisAddIn.dll
Als ich versuchte zu verwenden a.dll in meinem testApplication und berechnen Sie die DisplayString für MyCustomeType, Abhängigkeit bekommen beheben, a.dll ist geladen und ich bekomme das erwartet string, ohne Sie zu kopieren a1.dll, a2.dll und a3.dll. die abhängige dll behoben werden/abgeholt von Fenster-variable PATH. Aber Im Fall von visual studio-debugger, abhängige DLL NICHT gelöst werden, von PATH-variable.
Als identifiziert wird, hängt-tool, einige dlls, die nicht gelöst werden, indem debugger sind:
api-ms-win-core-errorhandling-l1-1-0.dll
api-ms-win-crt-time-l1-1-0.dll
api-ms-win-crt-heap-l1-1-0.dll
Einige dieser dll vorhanden sind visual studio-installation, andere sind in c:\windows\WinSxS
Habe ich versucht, meine auf visual studio 2012 und visual studio 2017. Ich landete in derselben Ausgabe mit der visual studios.