Handleiding DDD.

© Harry Broeders.

Inleiding.

Op het practicum RTSOF maken we gebruik van het gcc commando van QNX. Dit commando roept de GNU gcc compiler aan. De bij gcc behorende debugger heet gdb. Deze debugger heeft een commando gestuurde interface en is daarom lastig te gebuiken. GNU heeft daarom DDD ontwikkeld; een grafische schil die het gebuik van gdb sterk vereenvoudigd. In de lokalen D2.003 en D1.049 is DDD op alle QNX VMware images geïnstalleerd.

Gedetailleerde informatie over gcc, gdb en DDD kun je vinden op de GNU website:

Voorbeeld 1: Debuggen van sort.c

Als eerste voorbeeld gaan we het programma sort.c debuggen. Om gdb (en dus ook DDD) te kunnen gebruiken moet een programma eerst worden gecompileerd met de -g optie.

$ qcc -g -o sort.out sort.c

Je kunt DDD starten via de Launch button (Launch, Development, DDD) of via de command line:

$ ddd

Je kunt het programma dat je wilt debuggen laden via het menu: File, Open program... selecteer sort.out. Als je DDD vanaf de command line start, kun je meteen opgeven welk programma geladen moet worden:

$ ddd sort.out

Je ziet nu de volgende windows:

 

Het "Source Window" bevat de code van het programma. Het "Debug Console" toont een "gdb" prompt waar eventueel commando's kunnen worden ingevoerd. Er is ook een popup window waarmee je veelvoorkomende commando's met 1 druk op de knop kunt uitvoeren.

Je kunt het programma starten door op de Run button te drukken. De naam van deze button is misleidend. Het machine code programma wordt door het run commando alleen maar geladen, de debugger stopt automatisch bij de eerste instructie. Je kunt nu een breakpoint zetten. Plaats de cursor op de desbetreffende plek in je programma code en houdt de rechter muisknop ingedrukt, selecteer Set Breakpoint en laat de rechter muisknop weer los. Op de desbetreffende plek in het programma code verschijnt nu een rood stopteken.

Je kunt nu het programma uitvoeren met de Cont button of via het menu: Program, Continue. Natuurlijk stopt het programma bij het breakpoint. Dit wordt aangegeven met een groene pijl. Je kunt nu door het programma stappen met behulp van de buttons:

Het selecteren van text in het source window gaat onder QNX niet goed! De geselecteerde text verspringt steeds. Je kunt dit probleem voorkomen door regelnummering aan te zetten: Alt+N.

Je kunt de waarde van een variabele op een aantal manieren zichtbaar maken:

  • Als je een variabele aanwijst met de muis zal een popup venster verschijnen waarin de waarde wordt weergegeven.

  • Door een variabele te selecteren en met de rechter muisknop de optie: Print te kiezen wordt de waarde van de variabele in het gdb console geprint.

  • Door een variabele te selecteren en met de rechter muisknop de optie: Display te kiezen wordt de waarde van de variabele in een speciaal display window getoont. Als de variabele van waarde veranderd wordt dit in het display window weergegeven. De laatst veranderde waarden krijgen een gele achtergrond. Je kunt eenvoudige variabelen in het display window weergeven (bijvoorbeeld i) maar ook hele expressies (bijvoorbeeld namen[i].roepnaam).

De uitvoer van het programma wordt getoond in het gdb console. Omdat in dit window ook alle gdb commando's worden getoond is dit niet zo handig. Door voordat je een programma runt de menu optie: Run in Execution Window aan te vinken verschijnt de uitvoer in een appart window.

Voorbeeld 2: Debuggen van opdr2.cpp

Als tweede voorbeeld gaan we het multi-threaded programma opdr2.cpp debuggen. Als het programma in DDD is geladen moeten we de command line parameters opgeven. Dit kan door te kiezen voor het menu: Program, Run...waarna je de parameters kunt invullen. Je kunt nu 3 breakpoints zetten: op de eerste pthread_join, op de aanroep van b.put(c) en op de aanroep van b.get(). Je kunt het programma nu met de Cont button telkens tot het volgende breakpoint laten lopen. Je kunt de globale buffer in het display window opnemen door te kiezen voor het menu: Data, Displays... Create a new display... b. Open de semaphoren door links te klikken (vasthouden) en Show All te kiezen.

Je kunt kijken welke threads draaien met het menu: Status, Threads.

Als het programma gestopt is bij een breakpoint kun je ook een QNX tool gebruiken om de threads te bekijken. Deze tool laat ook de verschillende prioriteiten en de huidige toestand van de threads zien. Deze tool kan gestart worden via de Lanch button: Launch, Utilities, System Information.

De toestand van de verschillende threads kan ook zichtbaar gemaakt worden met het pidin commando:

pidin -p opdr2.out -f abpJBK

Software ontwikkelen met DDD.

Je kunt DDD ook gebruiken als ontwikkelomgeving. Met de Edit button wordt vi gestart met daarin de source code van het programma. Zodra het editten klaar is kun je de wijzigingen opslaan en vi verlaten met het commando :x. Direct wordt er teruggesprongen naar de debugger met de nieuwe programma code erin. Voordat er verder kan worden gegaan moet het nieuwe programma wel eerst worden gecompileerd, alleen de C/C++ file was namelijk aangepast maar nog niet de executable. Dit kan eenvoudig met behulp van een make file en de Make button. De Make button kan de makefile alleen vinden als het werkdirectory correct is ingesteld. Je kunt het huidige werkdirectory controlleren in de gdb console:

(gdb) pwd

Je kunt het werkdirectory wijzigen met behulp van het gdb cd commando of via het menu: File, Change Directory...

Als je niet z'n fan bent van vi dan kun je ook een andere editor kiezen via het menu: Edit, Preferences... In het veld Edit Sources kun je dan bijvoorbeeld ped @FILE@ invullen.