[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: premature aborts?



Hi,

	Hmmm, logging. I have always been a fan of multilevel logging
 (one determines the severity level of messages on a more or less
 ad-hoc fashion [I use it for debugging also: initially, the debug
 levels are low, and as the code matures, the debug levels climb; s
 one may only see the latest debug messages while retaining old ones
 in the code to be turned on at a switch])

	So, everything that apkt-get prints with E: should be
 logged. All the nice informational messages (get blah from where) may
 be optional.

	Like, continuosly updated messages are -10; get file blah are
 level 0; errors are level 100; default logging is level 50. Gives us
 plenty of leeway.

	manoj
 for C aficianados, this is an excerpt from one of my debug header
 files that shows what I mean
-- 
 The absent are always in the wrong.
Manoj Srivastava  <srivasta@acm.org> <http://www.datasync.com/%7Esrivasta/>
Key C7261095 fingerprint = CB D9 F4 12 68 07 E4 05  CC 2D 27 12 1D F5 E8 6E

#ifdef BEGIN_BLOCK
#undef BEGIN_BLOCK
#endif /*  BEGIN_BLOCK */
#ifdef END_BLOCK
#undef END_BLOCK
#endif /* END_BLOCK */

#define BEGIN_BLOCK do {
#define END_BLOCK  } while (0)

/* ------------------------------------------------------------------------- */

/* Debugging */

/*
 * DEBUGMASK provides explicit control over which debug  levels are to be
 * turned on, ie, DEBUGMASK = 0xFFFFFFFFL gives 32 DEBUG levels (all on);
 * DEBUGMASK =  0x00000001L  turns  on  level  1, DEBUGMASK = 0x00000009L
 * turns on level 1 and 4, and so on.
 */

#ifndef DEBUGMASK
#       define DEBUGMASK 0xFFFFFFFFL    /* 32 DEBUG levels (all on) */
#else
#       ifndef DEBUG
#               define DEBUG 1  /* default level, in case the user did */
                                /* not turn it on*/
#       endif
#endif

/* DEBUG takes integral values >= 0 */
#ifdef DEBUG
#define MAX_DEBUGLEVEL 32

 /* Macro to print debug messages. example pargs is
  * (stderr, "%s", "abcd"). Level takes values 1 to 32
  * All messages at or below level DEBUG are suppressed. Assigning
  * a high value for DEBUG ( = 32 ) can suppress all the messages.
  */
#define DEBUGMSG(level, pargs) \
  BEGIN_BLOCK \
  if (level && (level >= DEBUG) && (DEBUGMASK & \
      (unsigned long int)(level <MAX_DEBUGLEVEL ? 1 << (level - 1): \
           1 << (level % MAX_DEBUGLEVEL)))) \
    fprintf pargs; \
  END_BLOCK

#define DEBUGN(level,pargs) \
BEGIN_BLOCK\
  if(level && (level >= DEBUG && (DEBUGMASK &  \
      (unsigned long int)(level <MAX_DEBUGLEVEL ? 1 << (level - 1): \
           1 << (level % MAX_DEBUGLEVEL))))) \
       {\
          /* that is, this is a a valid debug statement */ \
      fprintf(stderr,(char *)"------------------------------------------\n");\
          fprintf(stderr,(char *)"D %s(%d):[%d]\n\t", __FILE__,__LINE__,level);\
          fprintf pargs;\
          fprintf(stderr,(char *)"\n");\
        }\
END_BLOCK


#define DEBUG0(level,str) DEBUGN(level, (stderr,str))
#define DEBUG1(level,str,a1) DEBUGN(level, (stderr,str,a1))
#define DEBUG2(level,str,a1,a2) DEBUGN(level, (stderr,str,a1,a2))
#define DEBUG3(level,str,a1,a2,a3) DEBUGN(level, (stderr,str,a1,a2,a3))
#define DEBUG4(level,str,a1,a2,a3,a4) DEBUGN(level, (stderr,str,a1,a2,a3,a4))
#define DEBUG5(level,str,a1,a2,a3,a4,a5) \
     DEBUGN(level, (stderr,str,a1,a2,a3,a4,a5))
#else /* DEBUG not defined */
#define DEBUGMSG(level, pargs)
#ifdef DEBUGMASK
#       undef  DEBUGMASK
#       define DEBUGMASK        /* remove the definition */
#endif /* DEBUGMASK */
#define ASSERT(expr)
#define DEBUG0(level,s)
#define DEBUG1(level,s,a1)
#define DEBUG2(level,s,a1,a2)
#define DEBUG3(level,s,a1,a2,a3)
#define DEBUG4(level,s,a1,a2,a3,a4)
#define DEBUG5(level,s,a1,a2,a3,a4,a5)
#define DEBUGN(level,pargs)
#endif /* DEBUG */


--
To UNSUBSCRIBE, email to deity-request@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmaster@lists.debian.org


Reply to: