[so] [Tech Q] Print debugging

Pandia Gheorghe gheorghe.pandia at gmail.com
Mon Mar 7 01:06:06 EET 2011


Eu de obicei folosesc:

#define DEBUG 1
#define log         if( DEBUG == 1 )

și pentru a afișa informație de debug:

log printf( "orice sintaxă suportată de printf, cu sau fără __LINE__ sau
alte 'magical constants' " );

sau pentru afișări complexe (exemplu o matrice):

log {
 for i ...
  for j ..
   printf ...
printf ...
...
...
...
}

Are 2 probleme:

1. Într-adevăr adaugă un jump la fiecare if.
2. Trebuie avut grijă la folosirea sintaxei:
      if( test == 1 )
           log printf( "Testul e 1");
      else
           log printf( "Testul nu e 1" );
   "else"-ul de aici va acționa pentru "if( DEBUG == 1 )" în loc de "if(
test == 1)" - bine se rezolvă ușor asta dar se poate întâmpla din neatenție.

Pentru punctul 1 se rezolvă repede în varianta release. Ștergi #define log
și apoi toate blocurile cu log în față. În caz că îți scapă vreunu va da
compilatorul eroare deci implicit vor fi toate scoase.

Mi se pare foarte interesante și metodele voastre. Le voi încerca.

Numai bine,
  - Geo

2011/3/6 Razvan Deaconescu <razvan.deaconescu at cs.pub.ro>

> On 03/06/2011 10:55 PM, Adrian Scoica wrote:
> >>
> >> 1) Când faci debugging, vrei să nu afișezi doar un mesaj ci, de dorit,
> >> fișierul și linia care a generat mesajul.
> >
> > Pentru linia curenta din fisier, se poate folosi macro-ul __LINE__
> > (cate 2 caractere '_'). __LINE__ functioneaza fie in mod absolut
> > (numarand de la inceputul fisierului), fie in mod relativ (numara
> > incremental de la ultima directiva #line din fisier). De exemplu:
> >
> > /* asta e linia 4 */
> > printf("%d",__LINE__); /* se afiseaza 5 */
> > #line 100
> > printf("%d",__LINE__); /* se afiseaza 100 */
>
> și __FILE___ pentru fișier. Astfel, o formă bună de print debugging devine:
>
> ---
> #ifdef DEBUG_
> #define LOG(a)               \
>         fprintf(stderr, "%s [%d]: %s\n", __FILE__, __LINE__, a)   \
> #else
> #define LOG(a)               \
>        do { } while (0)     \
> #endif
> ---
>
> Din păcate, presupune că a este șir ceea ce poate nu este cazul, poate
> îmi doresc să afișez un mesaj mai complex, ca mai jos.
>
> >> 2) Nu vrei să afișezi doar un string ci poate o afișare de forma printf.
> >> Adică LOG("x = %d, y = %d\n", x, y);
> >
> > In C++, poti afisa o variabila intr-un macro doar stiindu-i numele. De
> > exemplu, daca ai:
> >
> > #define LOG(a) (std::cerr<< a << "\n")
> >
> > atunci poti afisa astfel:
> >
> > LOG("valoare(x): " << x << ", valoare(y) " << y);
>
> Nu mă pricep la C++ așa că te voi crede pe cuvânt că se poate :-)
>
> > Exista si in C o metoda mai generica? :-?
>
> Da, există. Folosind Variadic Macros[1][2]. Cine vine cu o propunere
> care să includă Variadic Macros?
>
> Răzvan
>
> [1] http://en.wikipedia.org/wiki/Variadic_macro
> [2] http://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html
> _______________________________________________
> http://elf.cs.pub.ro/so/wiki/resurse/lista-discutii
>



-- 
Pandia Gheorghe
Emails: gheorghe.pandia at gmail.com, gheorghe.pandia at yahoo.com
Tel: +40762684476
Yahoo!-Messenger-ID: gheorghe.pandia
Website: softproblem_dot_com
Blog: polidrop.host56_dot_com
LinkedIn: ro.linkedin_dot_com/in/gheorghepandia
Twitter: twitter_dot_com/gheorghepandia
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://cursuri.cs.pub.ro/pipermail/so/attachments/20110307/1ab2849e/attachment-0001.htm>


More information about the so mailing list