In 10.4 haben wir einen völlig neuen Debugger für C++Builder für Windows 64-Bit, mit einer stark verbesserten Inspektion des Inhalts von STL und anderen Typen, sowie Stabilität.
Ein neuer Debugger
Bevor wir uns mit den Details befassen, möchten wir Ihnen mitteilen, was wir in 10.4 ausliefern: einen neuen Debugger für C++ Win64, der auf der modernen LLDB basiert und die Auswertung komplexer STL- und anderer Typen unterstützt. Diese Unterstützung für komplexe Typen ist auch vollständig erweiterbar, wenn Sie mit Ihren eigenen komplexen Datenstrukturen zu kämpfen haben. Dies ist eine enorme Verbesserung für Ihre Produktivität, sowohl in Bezug auf die Stabilität des Debuggers als auch in Bezug auf die Daten, die Ihnen beim Debuggen zur Verfügung stehen.
Historische Fehlersuche in C++ unter Windows
Abhängig von der Sprache, mit der Ihre Anwendung erstellt wurde, sowie von der Plattform und der Bitrate, auf die Ihre Anwendung abzielt, verwendet RAD Studio einen von mehreren verschiedenen Debuggern und Dateiformaten für Debug-Informationen. Eine Plattform, die besonderer Aufmerksamkeit bedarf, ist Win64 für C++, und zwar aus zwei Gründen: die Debugger-Technologie und die Nebeneffekte des Clang-Compilers.
Ausgaben
Vor 10.4 verwendete C++ unter Win64 das DWARF v2 Debug-Format und einen eigenen Debugger.
Normalerweise gehen wir in Blog-Beiträgen nicht auf Probleme ein, aber in der Vergangenheit war dieser Debugger nicht unproblematisch. Bei einigen Kunden kam es zu Fehlern, die auf einen Fehler oder Absturz im Debugger hinweisen (manchmal auch in der Anwendung selbst, die der Debugger nicht verarbeiten konnte). Manchmal schien die IDE für einige Zeit einzufrieren, was in Wirklichkeit daran lag, dass die IDE darauf wartete, dass der Debugger eine Zeitüberschreitung erreichte.
Inspektion oder Bewertung von komplexen Typen
Außerdem war es, vor allem aufgrund von Optimierungen auch im Debug-Modus, schwierig, den Inhalt von Strukturen wie STL-Typen zu untersuchen. Der Aufruf von Methoden, wie z.B. c_str() zur Auswertung einer Zeichenkette, konnte nicht ausgewertet werden, wenn die Methode nicht eingebunden und daher für den Debugger nicht verfügbar war. Bei anderen Typen wie std::vector oder std::map waren die Accessor-Methoden manchmal inlined oder, wenn sie nicht verwendet wurden, nicht eingebunden und in beiden Fällen für den Debugger auch nicht als aufrufbare Methode verfügbar.
Dadurch war es schwierig, die Container-Elemente in Tooltips, Lokale Variablen, Auswerten/Ändern, Überwachen usw. zu sehen. Das Ergebnis war, dass die Daten nicht immer einfach zu bewerten oder zu visualisieren waren.
Diese Probleme traten nicht nur bei C++Builder auf: andere IDEs haben gekämpft auch mit ihm. Das ist ein häufiges Problem bei C++.
In 10.4 gehen wir diese beiden Probleme an, indem wir einen neuen Debugger für C++ einführen. Der Debugger basiert auf einer modernen Version von LLDB, verwendet ein aktuelles Debug-Format, ist stabil, verarbeitet komplexe Typen, einschließlich gängiger STL-Typen, und ist vollständig erweiterbar.
Der neue C++ Debugger
Zunächst einmal die technischen Informationen. In 10.4 verwendet C++Builder eine angepasste Version von LLDB v9 für das Debugging unter Windows 64-Bit. Soweit ich weiß, sind wir der erste Anbieter, der LLDB für Windows unterstützt - obwohl es auf anderen Plattformen üblich und der De-facto-Standard ist, gab es das bisher nicht für Windows. (Wir waren auch die ersten, die Clang für Windows ausgeliefert und unterstützt haben, mit Clang 3.1 mit C++Builder XE3 im Jahr 2012.)
Wir kombinieren LLDB mit DWARF v4, wobei wir aus verschiedenen technischen Gründen, die mit dem Clang-Compiler zusammenhängen, v4 statt v5 verwenden. Dies führt zu Verbesserungen bei den verfügbaren Debug-Informationen - d.h. was "gesehen" und debuggt werden kann.
In Bezug auf die Stabilität wollen wir erreichen, dass LLDB deutlich stabiler ist als der bisherige Debugger für Win64. Die häufigsten Ursachen für Instabilität im alten Debugger, die wir untersucht haben und die bekannt sind, sind im neuen Debugger nicht vorhanden. Außerdem haben wir die Interaktion der IDE mit dem Debugger verbessert, einschließlich der Anzeige informativerer Fehlermeldungen.
Komplexe Typen debuggen
So weit so gut - neuer Debugger, modern, stabil. Die aufregendste Funktion ist jedoch das verbesserte Debugging mit Unterstützung für STL und andere komplexe Typen. Mit C++Builder 10.4 werden Sie in der Lage sein, den Inhalt Ihrer Vektoren, Maps, Strings und mehr einfach auszuwerten und zu sehen.
Um es noch einmal zusammenzufassen: Es gibt eine Reihe von Gründen, warum die Untersuchung oder Auswertung komplexer Typen für C++ schwierig sein kann, und zwar für alle C++-Toolchains. Einer ist, dass die Datenstrukturen kompliziert sind: Es ist nicht trivial, ein Element in einer std::map zu finden, und selbst in einem String können die Daten in zwei verschiedene Orte. Das bedeutet, dass es nicht einfach ist, Daten manuell zu lokalisieren. Ein weiterer Punkt ist, dass die Methoden, mit denen auf Elemente zugegriffen wird, für den Debugger zugänglich sein müssen. Eine Methode, die nie aufgerufen wird, wird herausoptimiert; eine Methode, die aufgerufen wird, kann inline sein, sogar in einem Debug-Build, da die STL nur für Header gilt. Eine Methode, die nicht eingebunden oder inlined ist, ist nicht aufrufbar (sie existiert nicht als separate, eigenständige Methode) und kann daher vom Debugger nicht verwendet werden. Das Endergebnis ist, dass es für einen Debugger nicht immer möglich ist, den Inhalt einer Zeichenkette oder das n-te Element eines Vektors auszuwerten, weil das Verständnis für das Datenlayout oder die Methoden, die diese Daten umhüllen, nicht vorhanden ist.
C++Builder 10.4 verwendet LLDB-Formatierer um dieses Problem zu lösen. Für einen komplexen Datentyp gibt es ein kleines Python-Skript, das die Datenstruktur versteht. Der Debugger ruft dieses Skript auf und es ist dieses Skript, das Daten zurückgibt, die in den Ansichten Tooltip, Überwachen, Auswerten/Ändern, Prüfen und Lokale Variablen angezeigt werden.
In diesen Bildern sehen Sie den Win64 C++ Debugger von 10.4, der den Inhalt verschiedener Stringtypen anzeigt (STL narrow und wide Strings, Unicode Strings, einen Delphi UTF8 String); einen shared_ptr, der sowohl den Inhalt des Elements, auf das gezeigt wird, als auch den refcount, einschließlich schwacher Referenzen, anzeigt; und den Inhalt einer std::map, einem der komplexesten STL Container.
Die vollständige Liste der Formatierer, die wir in 10.4 ausliefern, lautet
- std::string
- std::wstring
- std::vector
- std::deque
- std::map
- std::shared_ptr
- AnsiString-Typen einschließlich UTF8String
- String/UnicodeString
- WideString
Bei diesen Typen handelt es sich um die am häufigsten verwendeten STL-Container, plus die STL-Stringtypen, die alle extrem häufig vorkommen und in der Vergangenheit Probleme bei der Auswertung haben könnten; plus einen intelligenten Zeiger, für den mehr Informationen als nur das Objekt, auf das gezeigt wird, nützlich sind; plus Delphi-Stringtypen. D.h. es handelt sich um eine Reihe hochwertiger Typen, die möglicherweise visualisiert werden müssen. (Das ist nicht bei allen Typen der Fall - eine durchschnittliche Struktur oder Klasse reicht aus, und die meisten Typen profitieren von dem verbesserten Debug-Format und Debugger, ohne dass ein Formatierer erforderlich ist. Formatierer sind nützlich für komplexe Typen, bei denen ein Verständnis des Speicherlayouts oder der Debug-Methoden erforderlich sein kann).
Sie können diese Skripte auch selbst schreiben. Wenn Ihre Anwendung über komplexe Datentypen verfügt und Sie Schwierigkeiten haben, diese auszuwerten, können Sie ein kurzes Skript schreiben, um die Daten innerhalb Ihres Datentyps auf die gewünschte Weise darzustellen. Der Debugger ist vollständig erweiterbar.
Insgesamt
C++Builder 10.4 führt einen neuen Debugger für Win64 ein. Er basiert auf einer aktuellen Version von LLDB und ist stabil und modern. Er verfügt außerdem über Formatierer, die die Auswertung komplexer Typen einschließlich der wichtigsten STL-Datentypen ermöglichen. Unser Ziel ist es, die Debugging-Erfahrung in 10.4 viel stabiler und leistungsfähiger zu machen und die Produktivität zu steigern, indem wir dafür sorgen, dass die Debugging-Daten flüssig funktionieren und das auf dem Bildschirm angezeigt wird, was Sie wollen.
Wir sind wirklich begeistert von dieser Funktion und können es kaum erwarten, dass C++Builder 10.4 veröffentlicht wird und Sie es ausprobieren können!
Dies ist eine Vorschau auf eine kommende Version von RAD Studio. Es kann immer wieder zu Fehlern oder Änderungen in letzter Minute kommen. Nichts hier ist endgültig, bis die Version offiziell zur Verfügung gestellt wird.

