Kontrollera debug-utskrifter?

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 6889
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Kontrollera debug-utskrifter?

Inlägg av Marta »

För att följa vad som sker stoppar jag ofta in rader med printf(någonting, som givetvis inte skall vara där när programmet kompileras som färdig version. När bugs senare krälar fram vill jag ha tillbaka utskrifterna snabbt och lätt.

Har löst detta med att placera // på dessa rader, men skulle önska samtliga kunde styras från ett ställe på ett enkelt sätt. T.ex. skriva DEBUG printf(någonting där DEBUG översätts till antingen // eller ingenting alls.

Antar detta är omöjligt då det väl är preprocessorn som även hanterar // . #ifdef #endif är alldeles för tungjobbat och kräker ner koden med en massa krafs. Skriva till fil som sedan dumpas i /dev/null slukar resurser. Hur är det med ovanstående macro och #define DEBUG if (0)
Kommer optimeringen att avlägsna alltihop? Kan övrig optimering försämras?

Har Ni något bättre förslag? Det gäller standard gcc utan ++ eller andra märkvärdigheter. Macro som gör utskriften funkar inte, vanligtvis skall diverse olika variabler skrivas ut.
agehall
Inlägg: 418
Blev medlem: 12 augusti 2020, 19:27:54

Re: Kontrollera debug-utskrifter?

Inlägg av agehall »

Det är jätteenkelt. Ungefär såhär gör du i enklaste fallet, vilket kan byggas ut i oändlighet till mer komplicerade konstruktioner om så behövs. Stoppa detta i debug.h och inkludera den i dina c-filer. (Notera att #define DEBUG måste stå före include om det ska funka)
#ifndef dprintf 
#if defined(DEBUG)
#define dprintf(X ….) printf(X)
#else
#define dprintf(X …)
#endif
#endif


Användningen blir typ såhär:
#define DEBUG
#include ”debug.h”

void foo() {
  dprintf(”Bar %d\n”, 4711);
}
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 6889
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Re: Kontrollera debug-utskrifter?

Inlägg av Marta »

Tackar så mycket. Allt är enkelt för den som kan det.

Läste en del om vaiadic macros och functions. Rörde till det och fick för mig antalet argument skulle anges även i macros och det hade omöjliggjort en enkel sök/byt.

Din version fungerar fint, tror jag. Är den extra punkten i dprintf(X … .) ett misstag? Jag tog bort den.
Läste om en av texterna. Där är variabellistan utbytt mot __VA_ARGS__ som tycks vara något fördefinierat, men som tydligen inte behövs. Vet Du om Din version är portabel till ARM för RPi?

Tillägg: Läste en gång till och hela texten. Du namnger variabellistan till X och den extra punkten är en typo.
Funkar fint med gcc 10, men är det egentligen standard C eller ett C++ tillägg?

Tillägg2: Finns redan dprintf definierad? Missade includen i en fil och fick felmeddelande too few parameters.
Mr Andersson
Inlägg: 1394
Blev medlem: 29 januari 2011, 21:06:30
Ort: Lapplandet

Re: Kontrollera debug-utskrifter?

Inlägg av Mr Andersson »

#define dprintf(X...) printf(X) är en GNU extension.
#define dprintf(...) printf(__VA_ARGS__) är standard C99.

Det här brukar jag använda

Kod: Markera allt

// behövs egentligen inga includes för makrot,
// det är för exemplet i main
#include <stdio.h>
#include <stdlib.h>

// sätts normalt från kommandoraden eller makefile
// t.ex. -DDEBUG=1 för GCC
#define DEBUG 1

// ------- start debug_macros.h -------
#undef DBGEXEC
#undef DBGPRINT
#if defined(DEBUG) && DEBUG == 1
#  define DBGEXEC(...) __VA_ARGS__
#  define DBGPRINT(...) printf(__VA_ARGS__)
#else
#  define DBGEXEC(...)
#  define DBGPRINT(...)
#endif
// ------- end debug_macros.h -------

int main() {
    int a = 1;
    DBGEXEC(a = rand()); // körs bara när DEBUG är definierad
    DBGPRINT("Bar %d %d %d\n", a, 2, 3); // printas bara när DEBUG är definierad
    return a;
}
dprintf är en POSIX-funktion.
Skriv svar