30 October 2008 ~ 0 Comments

Debugging con el ‘cerdo’ y con std::cerr

Es muy útil hacer debugging con std::cerr, y si usas:

#include <iostream>
using namespace std;
main(blabla...){
  cerr << "This is a debug message" << endl;
}

Todo funciona maravillosamente, hasta que tus 20 threads comienzan a vomitar cientos y cientos de mensajes que hacen imposible leer el debug. Para ello lo ideal sería definir “debug levels”. Hay dos formas la forma simple y tonta:

#ifdef DEBUG_N
  cerr << "This is a debug message" << endl;
#endif

Pero esa forma es muy fastidiosa, así que mejor definimos un ‘cerdo‘ (cerdo = cerr debug output). O incluso mejor un cerdo con niveles: cerdo, cerdo2, cerdo3,… , cerdoN. He aqui uno para 3 niveles (donde hacemos que cerdo=cerdo1):

// ----- cerdo.h -----
#ifndef DEBUG
  #define cerdo if(0) cerr
  #define cerdo1 if(0) cerr
  #define cerdo2 if(0) cerr
  #define cerdo3 if(0) cerr
endif
#if (DEBUG==1)
#define cerdo cerr
  #define cerdo1 cerr
  #define cerdo2 if(0) cerr
  #define cerdo3 if(0) cerr
#endif
#if (DEBUG==2)
#define cerdo  cerr
#define cerdo1 cerr
  #define cerdo2 cerr
  #define cerdo3 if(0) cerr
#endif
#if (DEBUG==3)
  #define cerdo  cerr
  #define cerdo1 cerr
  #define cerdo2 cerr
  #define cerdo3 cerr
#endif
// ---- end cerdo.h ----

Ahora solo queda usar los cerdos.

#define DEBUG 2
#include "cerdo.h"
using namespace std;
main(blabla...){
  cerdo << "This is a debuglevel 1 message" << endl;
  cerdo1 << "This is a debuglevel 1 message" << endl;
  cerdo2 << "This is a debuglevel 2 message" << endl;
  cerdo3 << "This is a debuglevel 3 message" << endl;
}

Bye.

Leave a Reply