U bent hier:
  1. Home
  2. Nieuws
  3. Bekijk


Analyse

Nog geen grote rol voor Arm in embedded computers

Arm is energiezuinig en tegenwoordig ook krachtig genoeg om de concurrentie met X86 aan te kunnen in een tradtioneel Intel-domein als embedded computers. Een rondgang langs leveranciers leert echter...

Interview met Georges Gielen

'Leer jongeren innoveren, en begin vroeg'

Nu politici en beleidsmakers hun aandacht hebben gericht op het oplossen van de crisis en de naderende megabezuinigingen schuift het...

Column

De zendmast kleurt groen

Als het van de initiatiefnemers van het Greentouch-consortium afhangt (www.greentouch.org), zullen we binnen tien jaar duizend keer energie-efficiënter kunnen ‘surfen’. Een mooie maar noodzakelijke...

Achtergrond

GDB 7 en Eclipse brengen debuggen stap vooruit - en terug

8 februari 2010

In september kwam de langverwachte versie 7 van de populaire Gnu Debugger (GDB) uit met een aantal interessante nieuwe features, zoals opnemen van sessies en teruggaan in de tijd, Python-scripting en het stilleggen van een enkele thread. Peter Soetens behandelt deze nieuwe functionaliteiten en hun zwaktes en legt uit hoe ze vanuit Eclipse zijn te ontginnen.

GDB, de debugger van het Gnu-project, is een van de bekendste debuggers ter wereld, maar zeker nog niet de meest geavanceerde. Het project lijdt naar opensourcenormen onder trage releasecycli en heeft geduchte concurrenten in Visual Studio van Microsoft, Lauterbachs Trace32 Powerview en Green Hills’ Multi-IDE. Deze twee laatste staan sterk bekend bij ontwerpers van embedded systemen. Ze bieden hardwareprobes of software-instrumentatie waarmee de programma-uitvoer tot in het kleinste detail is te analyseren. Met de release van GDB versie 7 afgelopen september kunnen de gebruikers echter opgelucht ademhalen. Deze editie heeft belangrijke nieuwe features, die naar verwachting het komende jaar verder worden verfijnd tijdens de minor-releases 7.x.

Voor wie zich GDB maar vaag herinnert, een kort overzicht. De Gnu Debugger is een bekwame cross-target, multiplatformdebugger met ondersteuning voor in totaal tien programmeertalen. C/C++, Java, Objective-C/C++ en Ada zijn de belangrijkste. Daarnaast ondersteunt GDB een breed scala aan processoren.

De debugger wordt maar zelden stand-alone gebruikt, meestal dient hij als back-end voor een GUI. De bekendste hiervan zijn DDD (Data Display Debugger) en de C/C++ Development Toolkit (CDT), het pakket binnen Eclipse om met C en C++ te werken. Andere C/C++-IDE’s of geavanceerde teksteditors dienen ook vaak als front-end voor GDB, aangezien de debugger een interface aanbiedt om dergelijke tools te bedienen.

Terug in de tijd

Een van de meest tot de verbeelding sprekende nieuwtjes is reverse debugging: GDB laat toe programma’s vanaf een arbitrair punt op instructieniveau te tracen en hierin terug te stappen of dit geheel opnieuw af te spelen. Het target is verantwoordelijk voor de manier waarop de opnames gebeuren: dit kan via processorsimulatie, hardwaretraces of softwareprobing. Bij de release ondersteunde GDB reverse debugging via de Simics-processorsimulator, die onder meer X86, Arm, Mips en PowerPC kan nabootsen, en het Undo-DB-target, een commercieel record/replay-target voor Intel-architecturen onder Linux. GDB 7 komt zelf met het Process Record-Replay-target (PRec). Dit kan processoren uit de I386- en AMD64-families aansturen en levert opname- en afspeeldiensten voor multithreaded processen op Linux. PRec houdt standaard tot tweehonderdduizend instructies bij, maar dit kan onbeperkt worden verhoogd of verlaagd. Een testje op een Intel Atom-processor toonde aan dat bij ongelimiteerde buffers ongeveer 2 Mbyte Ram-geheugen per seconde wordt opgesoupeerd.

Bij Prec dient het terugkeren in de tijd effectief te worden afgespeeld, vergelijkbaar met een hele serie undo’s. Het vooruitgaan in de tijd in een trace komt neer op een serie redo’s. Op tragere targets is het opnemen en afspelen merkbaar langzamer dan gewoon debuggen. Dit in tegenstelling tot sommige tools voor hardwaretracing, die het programma op ware snelheid draaien en vanaf een arbitrair moment kunnen afspelen.

Multi en Powerview kunnen dergelijke hardwaretraces of geïnstrumenteerde softwaretraces al sinds langere tijd reverse debuggen. Toch kun je spreken van een doorbraak voor GDB. Een van de meest tijdrovende handelingen tijdens het debuggen is het herstarten van een programma omdat een breakpoint net te laat stond en de fout al was opgetreden. Ook asserties, die de uitvoering van een programma stilleggen bij het detecteren van een fout, geven niet alle antwoorden. Een pointer mocht niet nul zijn, maar hoe is die nul geworden in eerste instantie? Reverse debugging laat toe vanaf zo’n punt terug te gaan in de tijd en te ontdekken welke functie de fout veroorzaakte. De record trace kan samen met de geheugendump (core file) worden opgeslagen om later of op een ander werkstation af te spelen.

Non-stop

Een andere belangrijke toevoeging is het gebruik van een Python-interpreter voor GDB-scripts. In oudere GDB-versies was de ondersteuning voor scripting zeer beperkt. Versie 7 laat toe arbitraire Python-scripts en -modules uit te voeren als reactie op een opdracht. Het meest zichtbare resultaat is dat er momenteel volop scripts worden ontwikkeld om C++/STL-structuren beter te visualiseren. Een grote ergernis onder de C++-GDB-gebruikers is dat deze structs in ruw formaat worden gepresenteerd, zeg maar de naakte geheugenlay-out. Het kon tot minuten duren om de waarde van een veld manueel te decoderen. Terugvallen op het loggen van deze structuren was helaas meestal de snelste methode.

In de nieuwste Eclipse-versie zijn bij het debuggen niet alleen knoppen beschikbaar om vooruit te stappen in de code en deze af te spelen, maar ook om terug te gaan. Standaard staat deze functionaliteit echter niet aan. Ten eerste moet de nieuwe debuggerinterface DSF worden ingesteld. Dit kan via Window -> Preferences -> Run/Debug -> Launching -> Default Launchers. Daarnaast moet in het debugperspectief de GDB7-functionaliteit worden ontsloten. Dat kan door in het debugperspectief naar Window -> Preferences -> Customize Perspective -> Command Groups Availability te navigeren. In de linkerkolom moet dan ‘Reverse Debugging’ worden aangevinkt. Dit zijn eenmalige aanpassingen die de Eclipse-workspace zal onthouden tussen sessies door.

Aan programmeurs van embedded systemen is ook gedacht. Tot voor versie 7 legde een breakpoint de uitvoering van alle threads in een proces stil. Met de ‘non-stop’-optie laat GDB toe dat slechts een enkele thread wordt stilgelegd terwijl de andere threads gewoon verder werken. Dit is uitermate handig in kleine systemen waar alles in één proces draait en een aantal threads moet blijven werken om de situatie überhaupt te kunnen debuggen. Het is toegelaten meerdere threads selectief te pauzeren of te starten en gebruikers kunnen breakpoints activeren die enkel effect hebben op geselecteerde threads. Een bijkomende eigenschap is dat een step of continue enkel de huidige thread verder laat gaan. In de vroegere versies startten deze commando’s niet enkel de huidige thread, maar alle threads in het proces. Klein detail: non-stop en PRec kunnen niet op hetzelfde moment werken. Wanneer u de ene functie inschakelt, stopt de andere.

Knopje

Er zijn dus wat paarden bijgezet onder de motorkap, maar deze kracht kan pas ten volle worden benut met een gebruiksvriendelijke interface. In juni vorig jaar werd Eclipse 3.5, Galileo, vrijgegeven. Een opmerkelijke verbetering was te merken in de C/C++ Development Toolkit. De CDT kwam met een nieuw debugraamwerk, het Debugger Services Framework (DSF). Niet in het minst geholpen door ingenieurs van Ericsson ondersteunde DSF de GDB 7-features nog voor deze versie zelf werd vrijgegeven. Als standaard staat de oude GDB-interface echter nog actief. Om DSF te gebruiken, moeten de instellingen worden gewijzigd.

Helaas zult u ook dan niet veel merken van de aanwezigheid van reverse debugging-capaciteiten, want de toolbar met de nodige knopjes staat standaard uitgeschakeld. Deze moet u eerst aanzetten. In de debugsessie krijgt u dan een klein knopje dat aangeeft dat recording aan- of uitgeschakeld kan worden. Wanneer u het inschakelt en uw programma een stap heeft laten zetten, verschijnen de reverse-varianten van alle forward-step-functies. De instructiebuffergrootte is in te stellen via een commando in de GDB-console. De GDB-handleiding documenteert alle mogelijke opties. De hoop is dat een aantal van deze opties in de loop der tijd doorsijpelen naar de GUI. De GDB/Eclipse-combo wordt ondersteund op Windows, Mac OS X en Linux. Zoals eerder vermeld, is reverse debugging via PRec enkel ondersteund onder Linux. Via Simics is deze optie wel beschikbaar onder Windows.

Rooskleurig

Indien u dit op een meer dan triviaal programma op 64 bit processoren zou testen, dan zal de recording snel worden onderbroken. Het PRec-target van GDB 7 ondersteunt namelijk nog geen SSE-instructies, terwijl de GCC-compilers deze standaard inzet op 64 bit platforms, bijvoorbeeld voor efficiënte implementaties van de strlen()- of memset()-functies. Ook op 32 bit platforms is een foutloze recording nog niet gegarandeerd. Alles beschouwd, is de record/replay-infrastructuur nog niet volwassen genoeg om grote applicaties aan te pakken. Hiervoor dienen eerst nog meer instructies te worden ondersteund en moet Eclipse DSF nog verder uitrijpen. In de loop van 2010 valt hier zeker verbetering in te verwachten.

Hiermee valt het gebruik van Eclipse voor debuggen of C/C++-programmeren natuurlijk niet in het water. De tool biedt vele andere krachtige opties die niet altijd gekend zijn of waar we niet meer bij stilstaan. De Eclipse CDT-debuggers kunnen zich aan meerdere processen hechten, zowel lokaal als op een target. Target Management laat toe meerdere remote targets te beheren om er bouwproducten af te leveren en applicaties op te starten. De C/C++-IDE biedt krachtige en intelligente auto-completion aan, ook van functies uit de systeembibliotheken. Met de Mylyn-plug-in zijn Bugzilla en andere bugtrackers te integreren met Eclipse. Ook versiebeheerplug-ins zijn er bij de vleet. De toekomst ziet er sowieso rooskleurig uit voor Eclipse. Steeds meer softwareontwerptools enten zich op Eclipse en gemeenschappelijke interfaces worden ontwikkeld om de integratie tussen al deze plug-ins vlot te laten verlopen. Iedere Eclipse-release is een reden meer om ernaar over te stappen.

Peter Soetens (peter@verwijder-dit.thesourceworks.com) is sinds 2001 actief met embedded en realtime Linux en ondersteunt bedrijven in het opzetten van besturingsplatforms met opensource technologieën.

Peter Soetens

Terug naar overzicht



© Bits & Chips | Deze pagina op internet: http://www.bits-chips.nl/nieuws/bekijk/artikel/gdb-7-en-eclipse-brengen-debuggen-stap-vooruit-en-terug.html