Debugga funktioner enkelt (tips)

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Icecap
Inlägg: 26106
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Debugga funktioner enkelt (tips)

Inlägg av Icecap »

Jag vill gärna kunde debugga funktioner jag skriver men ibland ska man kolla något annat innan.

Oftast har jag tillgång till en seriell port där jag kan dumpa text osv. men i grunden är det likgiltigt för detta tips.

Man brukar ju ha många/en del väldefinierade och avgränsade funktioner, just för att få överskådlighet. Ibland vill jag ha utskrifter från interna uträkningar, ofta typ vilken rutin, ingångsvärde, mellanräkningsvärde och utgångsvärde. Med en seriell port är detta ju ganska enkelt.

Men det händer att jag är ganska nöjd med en rutin för tillfället och letar fel ett annat ställe och då stänger av debug-utskriften i en rutin.

Så jag brukar göra såhär:

Kod: Markera allt

#define DEBUG_THIS true
void Function_Something(int Value)
  {
  ...
#if DEBUG_THIS
  ... // Printout debug data
#endif // DEBUG_THIS
  ...
  }
#undef DEBUG_THIS

#define DEBUG_THIS false
void Function_Something_Else(int Value)
  {
  ...
#if DEBUG_THIS
  ... // Printout debug data
#endif // DEBUG_THIS
  ...
  }
#undef DEBUG_THIS
Vid att undef'a DEBUG_THIS efter varje rutin kan jag slå på och av varje rutins debug-funktion för sig utan att få en generell debug-utskrift på alla rutiner. Självklart kan man kombinera med en generell funktion också om man vill - eller bara ha en generell utskriftrutin om man vill.
Användarvisningsbild
Micke_s
EF Sponsor
Inlägg: 6741
Blev medlem: 15 december 2005, 21:31:34
Ort: Malmö

Re: Debugga funktioner enkelt (tips)

Inlägg av Micke_s »

C99 har
__func__
__file__
__line__
som kan vara trevliga.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43149
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Debugga funktioner enkelt (tips)

Inlägg av sodjan »

Det enkla svaret är ju "kör en debugger", men det framgår inte vad
det är för miljö som det gäller, så det går inte att utveckla mer än så...
Användarvisningsbild
Icecap
Inlägg: 26106
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Debugga funktioner enkelt (tips)

Inlägg av Icecap »

sodjan: helt rätt. Men jag behöver ingen hårdvara-debugger som sådan, jag behöver nästan alltid bara att säkerställa att värden är inom gränserna och att uträkningar går rätt.

Oftast är det t.o.m. en fråga om huruvida en given rutin faktisk aktiveras eller inte - men detta brukar jag kolla med en LED på en pinne, det brukar vara effektivt.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43149
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Debugga funktioner enkelt (tips)

Inlägg av sodjan »

> sodjan: helt rätt.

Om det nu är helt rätt, vad är det då för miljö?
Jag kan ge tips kring Cobol och OpenVMS, men
det handlar det väl knappast om... (?).
Användarvisningsbild
Icecap
Inlägg: 26106
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Debugga funktioner enkelt (tips)

Inlägg av Icecap »

Jag använder det till PIC, Renesas RX210, EFM32 och vad jag annars sysslar med. När väl hårdvaran rullar på är det - enl. min erfarenhet - mycket sällan att jag behöver hardware debug.

Till PIC har jag PICkit2 & 3 om jag behöver hardware debug, något jag någon enstaka gång har använd i vissa fall. Jag använder dom nästan uteslutande till ICSP.
Användarvisningsbild
arvidb
Inlägg: 4537
Blev medlem: 8 maj 2004, 12:56:24
Ort: Stockholm

Re: Debugga funktioner enkelt (tips)

Inlägg av arvidb »

Icecap skrev:

Kod: Markera allt

#define DEBUG_THIS true
void Function_Something(int Value)
  {
  ...
#if DEBUG_THIS
  ... // Printout debug data
#endif // DEBUG_THIS
  ...
  }
#undef DEBUG_THIS
Bra tips, tackar!
Micke_s skrev:__func__
__file__
__line__
Jo dom där är riktigt användbara i debugutskrifter! Om jag inte minns fel skrivs dock linjemakrot __LINE__.

Alltså:

Kod: Markera allt

    printf("%s:%d, in %s(): <felmeddelande>\n", __file__, __LINE__, __func__);
Användarvisningsbild
baron3d
EF Sponsor
Inlägg: 1339
Blev medlem: 1 oktober 2005, 23:58:43
Ort: Torestorp

Re: Debugga funktioner enkelt (tips)

Inlägg av baron3d »

Med GCC använder jag:

Kod: Markera allt

#define DEBUGLINE(s) utility_debug_Print(__FILE__, __LINE__, s);
extradrajven
Inlägg: 18
Blev medlem: 1 juni 2013, 18:07:48

Re: Debugga funktioner enkelt (tips)

Inlägg av extradrajven »

Om man ersätter

Kod: Markera allt

#if DEBUG_THIS
  ... // Printout debug data
#endif // DEBUG_THIS
med

Kod: Markera allt

if (DEBUG_THIS) {
  ... // Printout debug data
}
så får man kompilatorns syntax-koll på köpet. Den dagen parametern Value döps om kan det vara lätt att missa att uppdatera dess användning i debugutskrifterna.

En annan variant är att separera log-villkoren (brus) från programmets logik:

Kod: Markera allt

  ret = do_a(aval);
  DEBUG(LOG_ASUBSYS, "a said %d\n", ret);
  ret = do_b(bval);
  INFO(LOG_BSUBSYS, "b said %d (4343 was expected)\n", ret);
DEBUG och LOG_... kan definieras någon annanstans och återanvändas.
Här finns ett bra exempel på enkelt log-ramverk:
https://github.com/bitbckt/libabc/tree/master/src
Skriv svar