» »

[ General ] printf() debugging...

[ General ] printf() debugging...

BigWhale ::

Banzai!

Nekdo bi lahko en sticky prispevek o printf() debuggingu napisal. Vidim, da vecina ljudi, ki sem vprasanja posilja se ne ve tocno kako to zgleda in kaj to je, se manj pa, da se posluzuje tega...

Kaj je pa vas favourite debugging method?

Vesoljc ::

debugging metoda?
odvisno kaj delaš ;)

včasih zna biti tekst premalo :)

formatiranje teksta kot to zna *printf pa mi je osebno bolj pri srcu kot pa recimo objektni pristop (cout). največja prednost imho je hitrost ter preprostost s katero lahko tekst na "lep" način prikažemo na zaslon. ima pa eno slabost, ki jo v praksi kar pogosto doživim. ni varen. c namreč ne preverja podanih parametrov (razen števila,?). tako lahko v zaporedje paremetrov, ki smo ga definirali v stringu ala
printf("ime = %s; priimek = %s; starost = %3d; iq = %2.8f", ime, priimek, starost, iq);

, vrinemo praktično karkoli:
printf("ime = %s; priimek = %s; starost = %3d; iq = %2.8f", ime, iq, starost, priimek);


v najboljšem primeru bomo dobili pri ispisu "junk". v slabših pa recimo kak access violation. no, take buge se sicer zna precej hitro odpraviti, samo pogruntat moraš, da zadeva izpisuje napačne vrednosti 8-)

o samem debuggingu pa tko:
- uporaba preprecesora
- več nivojev
- če je potrebno tudi runtime opcije

recimo:
#if (DEBUG && (DEBUG_LEVEL > NORMAL)) || DEBUG_THIS
#endif


pri izpisu pa čim več informacij:
- timestamp
- this
- ...

imeti hard kopijo callstack-a zna priti prav.
Abnormal behavior of abnormal brain makes me normal...

Zgodovina sprememb…

  • spremenil: Vesoljc ()

CCfly ::

Je že kdo preizkušal loggerje, kot je na primer log4cpp (ekvivalent log4j v Javi) ?
Overhead naj bi bil menda zanemarljiv.
"My goodness, we forgot generics!" -- Danny Kalev

Zvedavec ::

Moja najljubša metoda za (splošen) lov na hrošče je assert. Enostavno lahko namečeš v kodo na tisoče testov, ki jih potem v release verziji ni. In recimo namečeš še kakšne assert(0) v dele kode, kjer naj načeloma program ne bi zašel in so le zasilni izhodi. Če se ti pa ob tem požene še razhroščevalnik, je to sploh idila.
Je pa printf (oziroma še bolje fprintf) zelo praktičen za lov na hrošče, kadar ne moreš blizu z razhroščevalnikom.
Moraš biti pa seveda pozoren pri parametrih, to je pač C. Tile moderni prevajalniki so čisto razvadili ljudi z opozarjanjem na tipe parametrov pri večini funkcij. Precej bolj nevaren je izpis nizov, kjer lahko manjka zaključitev. Načeloma bi moral pred vsakim izpisom preveriti, da niz ni predolg (in to ne s strlen!).


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Število decimalk???

Oddelek: Programiranje
71583 (1087) donkihod
»

[C] Branje iz datoteke

Oddelek: Programiranje
101720 (1551) BigWhale
»

[C++] Preverjanje ce je program dos ali win32

Oddelek: Programiranje
211412 (1068) BigWhale
»

[NALOGA][C] - Sortiranje učencev

Oddelek: Programiranje
71322 (1175) m4r3
»

strcpy reče segmatation fault

Oddelek: Programiranje
101498 (1449) MasterMind

Več podobnih tem