© Harry Broeders.
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:
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:
Next
met behulp van deze button stap je naar de volgende instructie.
Je springt over functieaanroepen heen.
Step
met behulp van deze button ga je naar de volgende instructie.
Je springt functieaanroepen in.
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:
|
|
|
|
![]() |
![]() |
|
![]() |
![]() |
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.
![]() |
![]() |
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
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.