amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > Logging und Debugging in C++ [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

15.06.2006, 15:30 Uhr

Reth
Posts: 1858
Nutzer
Hallo nochmals zusammen,

da ich vom GDB und dessen Einbindung in GoldED Studio AIX NULL Ahnung habe, behelfe ich mich noch mit couts.

Nun eine Frage: Gibt es unter C++ eine Art Library, die einem ähnlich dem Logging-API bei Jakarta ein konfigurierbares Logging erlaubt?

Oder wie behelft ihr euch mit ausgaben, die in der Endfassung eines Programms nicht mehr erscheinen sollen?

Ne globale Konstante definieren, die in einer Ausgabemethode geprüft wird?

Wenn ja, wie sieht die Ausgabemethode denn aus, welche Parameter kann man übergeben (ich würde am liebsten nur nen String reingeben, der aus Zeichenketten und Werten von Programmvariablen/Objektwerten etc. zusammengesetzt ist)?

Danke schon mal
Ciao

[ - Antworten - Zitieren - Direktlink - ]

15.06.2006, 20:53 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Reth:
Oder wie behelft ihr euch mit ausgaben, die in der Endfassung eines Programms nicht mehr erscheinen sollen?


Die meisten C-Programmierer benutzen Preprozessor Makros für diesen Zweck. Die können in der Debug-Phase eine Ausgabe erzeugen und im Endprodukt als leeres Makro ersetzt werden.

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

15.06.2006, 22:10 Uhr

platon42
Posts: 400
[Ex-Mitglied]
Zitat:
Original von Reth:
Oder wie behelft ihr euch mit ausgaben, die in der Endfassung eines Programms nicht mehr erscheinen sollen?


Piru hat ein paar sehr praktische Debugging-Makros gebaut...


code:
debug.h
#ifndef __DEBUG_H__
#define __DEBUG_H__

/* debug.h - cnet.device by Harry "Piru" Sintonen
*/

#define DB_LEVEL 1

//#define DEBUG

#ifdef DEBUG
   #define BreakPoint __emit(0x4afc)
   void dprintf(const char *, ...);
#  ifdef __GNUC__
#    define KPRINTF(l, x) do { if ((l) >= DB_LEVEL) \
     { dprintf("%s:%s/%lu: ", __FILE__, __FUNCTION__, __LINE__); dprintf x;} } while (0)
#  else
#    define KPRINTF(l, x) do { if ((l) >= DB_LEVEL) \
     { dprintf("%s/%lu: ", __FILE__, __LINE__); dprintf x;} } while (0)
#  endif /* __GNUC__ */
#  define DB(x) x
   void dumpmem(void *mem, unsigned long int len);
#else /* !DEBUG */

#define KPRINTF(l, x) ((void) 0)
#define DB(x)
#define BreakPoint

#endif /* DEBUG */

#endif /* __DEBUG_H__ */


code:
debug.c
/* debug.c - cnet.device by Harry "Piru" Sintonen
*/

#include "debug.h"
#ifdef DEBUG

#include <exec/types.h>
#include <proto/exec.h>

#ifndef __MORPHOS__
#include <stdarg.h>
#endif /* __MORPHOS__ */


#ifdef __MORPHOS__

void dprintf(const char *, ...);

#else /* __MORPHOS__ */

void dprintf(const char *format, ...)
{
  struct ExecBase *SysBase;
  static const UWORD dputch[5] = {0xCD4B, 0x4EAE, 0xFDFC, 0xCD4B, 0x4E75};
  va_list args;

  SysBase = *((struct ExecBase **) (4L));
  va_start(args, format);

  RawDoFmt((STRPTR) format, (APTR) args,
           (void (*)()) dputch, (APTR) SysBase);

  va_end(args);
}

#endif /* __MORPHOS__ */

void dumpmem(void *mem, unsigned long int len)
{
  unsigned char *p;

  if (!mem || !len) { return; }

  p = (unsigned char *) mem;

  dprintf("\n");

  do
  {
    unsigned char b, c, str[17];

    for (b = 0; b < 16; b++)
    {
      c = *p++;
      str[b] = ((c >= ' ') && (c <= 'z')) ? c : '.';
      str[b + 1] = 0;
      dprintf("%02lx ", c);
      if (--len == 0) break;
    }

    while (++b < 16)
    {
      dprintf("   ");
    }

    dprintf("  %s\n", str);
  } while (len);

  dprintf("\n\n");
}

#endif /* DEBUG */


Funktionieren unter MorphOS und 68k (außer Breakpoint, das geht nur so unter 68k).

Verwendung ist verblüffend einfach :)

code:
KPRINTF(<level>, ("<string>", <format args> ...));

z.B.:

KPRINTF(1, ("Ooops!?! No Endpoints defined?\n"));

oder
KPRINTF(5, ("Report %ld: InBits=%ld, OutBits=%ld, FeatBits=%ld\n",
            nhr->nhr_ReportID, nhr->nhr_ReportInSize,
            nhr->nhr_ReportOutSize, nhr->nhr_ReportFeatSize));


wenn man DB_LEVEL höher einstellt, als in der KPRINTF-Zeile eingegeben,
taucht die Meldung nicht mehr auf. Durch Deaktivierung von DEBUG werden gar
keine Anweisungen mehr generiert. Wenn man viel Multithreaded arbeitet,
kann man das Makro auch noch um den Tasknamen erweitern, z.B. so:

code:
{ dprintf("%s/%lu: %s-", __FILE__, __LINE__, SysBase->ThisTask->tc_Node.ln_Name); dprintf x;} } while (0)


Speicherdumps mit:

code:
DB(dumpmem(<startaddresse>, <länge>);)



--
--
Best Regards

Chris Hodges

[ - Antworten - Zitieren - Direktlink - ]

04.11.2017, 17:08 Uhr

Reth
Posts: 1858
Nutzer
@platon42:
Danke Dir! Sehen echt gut aus die Sachen!

Aber kollidiert das Makro nicht mit KPrintF von der debug.lib - oder ist es als Ersatz gedacht?
Und welche Definition und Implementierung von dprintf() würde denn hier im Falle von MorphOS genutzt?

[ - Antworten - Zitieren - Direktlink - ]

04.11.2017, 20:21 Uhr

RedBaron
Posts: 99
Nutzer
@Reth:

Hast du auf Datum des Thread geachtet? :D

[ - Antworten - Zitieren - Direktlink - ]

06.11.2017, 09:42 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von RedBaron:
@Reth:

Hast du auf Datum des Thread geachtet? :D


Ich glaube, er weiß selbst am besten, wann er den Thread eröffnet hatte. Offensichtlich hat er eine Pause eingelegt.

Allerdings bringt es ihm in der Tat höchstwahrscheinlich nichts, Fragen an jemanden zu stellen, unter dessen Name „Ex-Mitglied“ steht…

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

07.11.2017, 20:14 Uhr

Reth
Posts: 1858
Nutzer
Ja, meine Pausen sind leider immer wieder recht lang...

Allerdings habe ich nicht auf das Alter des Threads geachtet, da ich aktuell (wieder) vor dem Problem stehe.

Das mit dem Ex-Mitglied hatte ich beim Antworten aber nicht berücksichtigt - Dank gebührt ihm trotzdem! :D
Der weitere Teil meiner Antwort bezog sich aber auf alle: Bin immer noch an euren Ideen/Lösungen interessiert - v.a. was C++ anbelangt (obwohl es da auf dem Amiga wohl eher wenige Coder gibt)!

Hab wohl auch durch den "Doppelpost" hier nicht mehr so aufgepasst. Hab nach längerer Suche noch in nem C++ Forum gepostet. Dort bin ich zurecht an GitHub verwiesen worden.
Allerdings hab ich dort eine Weile suchen müssen, um was zu finden, das den älteren Standards noch entspricht. Grund: Der GCC für AOS4 ist leider so alt, dass er kein C++11 Standard hat und auch viele andere Dinge nicht!

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > Logging und Debugging in C++ [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.