In 10.4 hebben we een compleet nieuwe debugger voor C++Builder voor Windows 64-bit, met sterk verbeterde inspectie van de inhoud van STL en andere types, evenals stabiliteit.
Een nieuwe debugger
Voordat we in de details duiken, hier is wat we uitbrengen in 10.4: een nieuwe debugger voor C++ Win64 gebaseerd op moderne LLDB en met ondersteuning voor het evalueren van complexe STL en andere types. Deze ondersteuning voor complexe types is ook volledig uitbreidbaar als u worstelt met uw eigen complexe datastructuren. Dit is een enorme verbetering voor uw productiviteit, zowel in termen van debugger-stabiliteit als in termen van de gegevens die voor u beschikbaar zijn tijdens het debuggen.
Historisch debuggen in C++ op Windows
Afhankelijk van de taal waarmee je applicatie is gebouwd en het platform en de bitness waarop je app is gericht, gebruikt RAD Studio een van de verschillende debuggers en bestandsformaten voor debug-informatie. Een platform dat speciale aandacht nodig heeft is Win64 voor C++, om twee redenen: debugger-technologie en neveneffecten van de Clang compiler.
Problemen
Vóór 10.4 gebruikte C++ op Win64 het DWARF v2 debug-formaat en een aangepaste debugger.
Hoewel we ons normaal gesproken niet richten op problemen in blogposts, was deze debugger in het verleden niet zonder problemen. Sommige klanten kunnen 'disconnected session' fouten hebben ervaren, wat in feite duidt op een fout of crash in de debugger (soms in de applicatie zelf, die de debugger niet aankon). Soms leek de IDE enige tijd te bevriezen, wat eigenlijk de IDE was die wachtte tot de debugger een time-out had.
Complexe types inspecteren of evalueren
Daarnaast is het, meestal door optimalisaties zelfs in debugmodus, moeilijk om de inhoud van structuren zoals STL-types te inspecteren. Het aanroepen van methodes, zoals c_str() om een string te evalueren, zou niet kunnen evalueren als de methode niet gelinkt was en daarom niet beschikbaar was voor de debugger. Voor meer andere types, zoals std::vector of std::map, waren de accessormethodes soms geïnlinieerd, of indien niet gebruikt niet gelinkt, en in beide gevallen ook niet beschikbaar als aanroepbare methode voor de debugger.
Dit maakte het moeilijk om de containerelementen te zien in tooltips, Lokale Variabelen, Evalueren/Wijzigen, Horloges, enzovoort. Het eindresultaat was dat gegevens niet altijd gemakkelijk te evalueren of te visualiseren waren.
Deze problemen waren niet uniek voor C++Builder: andere IDE's hebben geworsteld er ook mee. Het is een veelvoorkomend probleem in C++.
In 10.4 pakken we beide problemen aan door een nieuwe debugger voor C++ te introduceren. De debugger is gebaseerd op een moderne versie van LLDB, gebruikt een recente debug-indeling, is stabiel, kan goed omgaan met complexe types, inclusief veelgebruikte STL-types, en is volledig uitbreidbaar.
De nieuwe C++ Debugger
Eerst de technische informatie. In 10.4 gebruikt C++Builder een aangepaste versie van LLDB v9 voor Windows 64-bit debugging. Voor zover ik weet, zijn wij de eerste leverancier die LLDB voor Windows ondersteunt - terwijl het gebruikelijk is en de de-facto standaard op andere platformen, is het nog niet op Windows geweest. (We waren ook de eersten die Clang voor Windows leverden en ondersteunden, met Clang 3.1 met C++Builder XE3 in 2012.)
We koppelen LLDB met DWARF v4, waarbij we v4 gebruiken in plaats van v5 om verschillende technische redenen die te maken hebben met de Clang compiler. Dit zorgt voor verbeteringen in de beschikbare debug-informatie - dat wil zeggen, wat kan worden "gezien" en gedebugged.
Op het gebied van stabiliteit streven we ernaar dat LLDB aanzienlijk stabieler is dan de vorige debugger die voor Win64 werd gebruikt. De meest voorkomende oorzaken van instabiliteit in de oude debugger, die we onderzocht hebben en bekend zijn, zijn niet aanwezig in de nieuwe debugger. Daarnaast hebben we ook de interactie van de IDE met de debugger verbeterd, inclusief het tonen van meer informatieve foutmeldingen.
Debuggen van complexe typen
Tot nu toe goed - nieuwe debugger, modern, stabiel. De meest opwindende functie is echter de verbeterde debugging met ondersteuning voor STL en andere complexe types. Met C++Builder 10.4 kunt u eenvoudig de inhoud van uw vectoren, mappen, strings en meer evalueren en bekijken.
Samengevat zijn er een paar redenen waarom het inspecteren of evalueren van complexe types moeilijk kan zijn voor C++, voor alle C++ toolchains. Een daarvan is dat de gegevensstructuren ingewikkeld zijn: het is niet triviaal om een element te vinden in een std::map, en zelfs in een string kunnen de gegevens in twee verschillende plaatsen. Dat betekent dat het niet eenvoudig is om gegevens handmatig te lokaliseren. Een ander punt is dat de methoden die gebruikt worden om toegang te krijgen tot elementen toegankelijk moeten zijn voor de debugger. Een methode die nooit aangeroepen wordt, zal geoptimaliseerd worden; een methode die wel aangeroepen wordt, kan zelfs in een debug build geinlineed worden, gezien de header-only aard van de STL. Een methode die niet gelinkt is of geïnlineed is, is niet aanroepbaar (het bestaat niet als een aparte, zelfstandige methode) en dus kan de debugger deze niet gebruiken. Het eindresultaat is dat het niet altijd mogelijk is voor een debugger om de inhoud van een string of het n-de element van een vector te evalueren, omdat het begrip van de gegevenslay-out of de methoden die die gegevens omhullen er niet zijn.
C++Builder 10,4 gebruikt LLDB-formatters om dit probleem op te lossen. Voor een complex gegevenstype is er een klein Python-script dat de gegevensstructuur begrijpt. De debugger roept dit aan en het is dit script dat gegevens retourneert die worden weergegeven in de weergaven Tooltip, Watches, Evaluate/Modify, Inspect en Local Variables.
In deze afbeeldingen ziet u de Win64 C++ debugger van 10.4 die de inhoud van verschillende stringtypes toont (STL smalle en brede strings, Unicode strings, een Delphi UTF8 string); een shared_ptr die zowel de inhoud van het item waarnaar verwezen wordt als de refcount toont, inclusief zwakke referenties; en de inhoud van een std::map, een van de meest complexe STL-containers.
De volledige lijst van formatters die we uitbrengen in 10.4 is:
- std::string
- std::wstring
- std::vector
- std::deque
- std::map
- std::shared_ptr
- AnsiString-typen inclusief UTF8String
- String/UnicodeString
- WideString
Deze types zijn de meest gebruikte STL-containers, plus de STL-stringtypes, die allemaal extreem veel voorkomen en in het verleden problemen konden hebben met evalueren; plus een smart pointer waarvoor meer informatie dan alleen het object waarnaar verwezen wordt nuttig is; plus Delphi stringtypes. Dit is een verzameling van types met een hoge waarde die mogelijk gevisualiseerd moeten worden. (Niet alle types hebben dat nodig - een gemiddelde struct of class is prima, en de meerderheid van de types hebben baat bij het verbeterde debug-formaat en de debugger zonder dat ze een formatter nodig hebben. Formatters zijn nuttig voor complexe types waar begrip van geheugenlayout of debug-methodes nodig kan zijn).
Je kunt deze scripts ook zelf schrijven. Als je app complexe gegevenstypes heeft en je hebt problemen om ze te evalueren, dan kun je een kort script schrijven om de gegevens in je gegevenstype te presenteren zoals jij dat wilt. De debugger is volledig uitbreidbaar.
Overall
C++Builder 10.4 introduceert een nieuwe debugger voor Win64. Gebaseerd op een recente versie van LLDB, is het stabiel en modern. Het bevat ook formatters die evaluatie van complexe types mogelijk maken, inclusief belangrijke STL datatypes. Ons doel is om de debug-ervaring in 10.4 veel stabieler en krachtiger te maken, en veel productiever door debug-gegevens vloeiend te laten werken en te presenteren wat je wilt op het scherm.
We zijn erg enthousiast over deze functie en we kunnen niet wachten tot C++Builder 10.4 wordt uitgebracht en voor u om het uit te proberen!
Dit is een preview van een aankomende release van RAD Studio. Er kunnen altijd last-minute bugs of wijzigingen zijn. Niets hier is definitief totdat de release officieel beschikbaar is gemaakt.

