Sida 1 av 1

Debugga funktioner enkelt (tips)

Postat: 8 april 2018, 10:51:19
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.

Re: Debugga funktioner enkelt (tips)

Postat: 8 april 2018, 12:05:54
av Micke_s
C99 har
__func__
__file__
__line__
som kan vara trevliga.

Re: Debugga funktioner enkelt (tips)

Postat: 8 april 2018, 14:18:39
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å...

Re: Debugga funktioner enkelt (tips)

Postat: 8 april 2018, 17:14:06
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.

Re: Debugga funktioner enkelt (tips)

Postat: 8 april 2018, 21:12:04
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... (?).

Re: Debugga funktioner enkelt (tips)

Postat: 8 april 2018, 22:00:34
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.

Re: Debugga funktioner enkelt (tips)

Postat: 9 april 2018, 00:21:32
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__);

Re: Debugga funktioner enkelt (tips)

Postat: 9 april 2018, 04:05:13
av baron3d
Med GCC använder jag:

Kod: Markera allt

#define DEBUGLINE(s) utility_debug_Print(__FILE__, __LINE__, s);

Re: Debugga funktioner enkelt (tips)

Postat: 19 maj 2018, 18:07:16
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