C:
Tulostetaan virheenjäljitystietoja
Kuinka:
C:ssä yleisin tapa tulostaa debug-tuloste on käyttämällä printf
-funktiota standardin I/O-kirjastosta. printf
-funktio mahdollistaa muotoillun tulosteen standardilähtölaitteelle, tyypillisesti näytölle. Tässä on yksinkertainen esimerkki:
#include <stdio.h>
int main() {
int x = 5;
printf("Debug: x:n arvo on %d\n", x);
// Ohjelmasi logiikka täällä
return 0;
}
Esimerkkituloste:
Debug: x:n arvo on 5
Monimutkaisempaa debug-tulostusta varten saatat haluta sisällyttää tiedostonimen ja rivinumeron tiedot. Tämä voidaan tehdä käyttämällä __FILE__
ja __LINE__
esimääriteltyjä makroja näin:
#define DEBUG_PRINT(fmt, args...) fprintf(stderr, "DEBUG: %s:%d: " fmt, __FILE__, __LINE__, ##args)
int main() {
int testiarvo = 10;
DEBUG_PRINT("Testiarvo on %d\n", testiarvo);
// Ohjelmasi logiikka täällä
return 0;
}
Esimerkkituloste:
DEBUG: esimerkki.c:6: Testiarvo on 10
Huomaa, että tässä esimerkissä käytämme fprintf
:ää tulostamaan standardivirhevirtaan (stderr
), mikä on usein sopivampi debug-viesteille.
Syväluotaus
Historiallisesti C:n debuggaustekniikat ovat olleet manuaalisia ja alkeellisia johtuen kielenclose-to-the-metal-filosofiasta ja iästä. Kun taas modernit kielet saattavat sisältää monimutkaisia, sisäänrakennettuja debuggauskirjastoja tai luottaa vahvasti Integroituun Kehitysympäristöön (IDE) -ominaisuuksiin, C-ohjelmoijat turvautuvat usein manuaalisesti lisäämään tulostuslauseita, kuten yllä on esitetty, jäljittääkseen ohjelmansa suorituksen.
Yksi asia, josta debug-tulosteiden kanssa tulee varoa, on niiden potentiaali sotkea tulostetta ja johtaa suorituskykyongelmiin, erityisesti jos ne jätetään tahattomasti tuotantokoodiin. Näistä syistä ehdollinen käännös (esim., #ifdef DEBUG ... #endif
) saattaa olla parempi lähestymistapa, mahdollistaen debug-lauseiden sisällyttämisen tai poissulkemisen käännösaikaisilla lipuilla.
Lisäksi nyt on saatavilla kehittyneempiä työkaluja ja kirjastoja C:n debuggaamiseen, kuten GDB (GNU Debugger) ja Valgrind muistivuotojen havaitsemiseen. Nämä työkalut tarjoavat integroidumman lähestymistavan debuggaamiseen ilman tarvetta muokata koodia lisäämällä tulostuslauseita.
Kuitenkin printf
:n debuggauksen yksinkertaisuus ja välitön palaute eivät ole vähäpätöisiä, tehden siitä hyödyllisen työkalun ohjelmoijan työkalupakkiin, erityisesti niille, jotka vasta opettelevat C:n monimutkaisuuksia.