/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ /* * (C) 2005 by Argonne National Laboratory. * See COPYRIGHT in top-level directory. */ #ifndef MPIDBG_H_INCLUDED #define MPIDBG_H_INCLUDED #include #include #include "mpl.h" /* * Multilevel debugging and tracing macros. * The design is discussed at * http://wiki.mpich.org/mpich/index.php/Debug_Event_Logging * * Basically, this provide a way to place debugging messages into * groups (called *classes*), with levels of detail, and arbitrary * messages. The messages can be turned on and off using environment * variables and/or command-line options. */ #ifdef USE_DBG_LOGGING #define MPIU_DBG_SELECTED(_class,_level) \ ((MPIU_DBG_##_class & MPIU_DBG_ActiveClasses) && \ MPIU_DBG_##_level <= MPIU_DBG_MaxLevel) #define MPIU_DBG_MSG(_class,_level,_string) \ {if ( (MPIU_DBG_##_class & MPIU_DBG_ActiveClasses) && \ MPIU_DBG_##_level <= MPIU_DBG_MaxLevel ) {\ MPIU_DBG_Outevent( __FILE__, __LINE__, MPIU_DBG_##_class, 0, "%s", _string ); }} #define MPIU_DBG_MSG_S(_class,_level,_fmat,_string) \ {if ( (MPIU_DBG_##_class & MPIU_DBG_ActiveClasses) && \ MPIU_DBG_##_level <= MPIU_DBG_MaxLevel ) {\ MPIU_DBG_Outevent( __FILE__, __LINE__, MPIU_DBG_##_class, 1, _fmat, _string ); }} #define MPIU_DBG_MSG_D(_class,_level,_fmat,_int) \ {if ( (MPIU_DBG_##_class & MPIU_DBG_ActiveClasses) && \ MPIU_DBG_##_level <= MPIU_DBG_MaxLevel ) {\ MPIU_DBG_Outevent( __FILE__, __LINE__, MPIU_DBG_##_class, 2, _fmat, _int ); }} #define MPIU_DBG_MSG_P(_class,_level,_fmat,_pointer) \ {if ( (MPIU_DBG_##_class & MPIU_DBG_ActiveClasses) && \ MPIU_DBG_##_level <= MPIU_DBG_MaxLevel ) {\ MPIU_DBG_Outevent( __FILE__, __LINE__, MPIU_DBG_##_class, 3, _fmat, _pointer ); }} #define MPIU_DBG_MAXLINE 256 #define MPIU_DBG_FDEST _s,(size_t)MPIU_DBG_MAXLINE /*M MPIU_DBG_MSG_FMT - General debugging output macro Notes: To use this macro, the third argument should be an "sprintf" - style argument, using MPIU_DBG_FDEST as the buffer argument. For example, .vb MPIU_DBG_MSG_FMT(CMM,VERBOSE,(MPIU_DBG_FDEST,"fmat",args...)); .ve M*/ #define MPIU_DBG_MSG_FMT(_class,_level,_fmatargs) \ {if ( (MPIU_DBG_##_class & MPIU_DBG_ActiveClasses) && \ MPIU_DBG_##_level <= MPIU_DBG_MaxLevel ) {\ char _s[MPIU_DBG_MAXLINE]; \ MPL_snprintf _fmatargs ; \ MPIU_DBG_Outevent( __FILE__, __LINE__, MPIU_DBG_##_class, 0, "%s", _s ); }} #define MPIU_DBG_STMT(_class,_level,_stmt) \ {if ( (MPIU_DBG_##_class & MPIU_DBG_ActiveClasses) && \ MPIU_DBG_##_level <= MPIU_DBG_MaxLevel ) { _stmt; }} #define MPIU_DBG_OUT(_class,_msg) \ MPIU_DBG_Outevent( __FILE__, __LINE__, MPIU_DBG_##_class, 0, "%s", _msg ) #define MPIU_DBG_OUT_FMT(_class,_fmatargs) \ { char _s[MPIU_DBG_MAXLINE]; \ MPL_snprintf _fmatargs ; \ MPIU_DBG_Outevent( __FILE__, __LINE__, MPIU_DBG_##_class, 0, "%s", _s );} #else #define MPIU_DBG_SELECTED(_class,_level) 0 #define MPIU_DBG_MSG(_class,_level,_string) #define MPIU_DBG_MSG_S(_class,_level,_fmat,_string) #define MPIU_DBG_MSG_D(_class,_level,_fmat,_int) #define MPIU_DBG_MSG_P(_class,_level,_fmat,_int) #define MPIU_DBG_MSG_FMT(_class,_level,_fmatargs) #define MPIU_DBG_STMT(_class,_level,_stmt) #define MPIU_DBG_OUT(_class,_msg) #define MPIU_DBG_OUT_FMT(_class,_fmtargs) #endif /* Special constants */ enum MPIU_DBG_LEVEL { MPIU_DBG_TERSE = 0, MPIU_DBG_TYPICAL = 50, MPIU_DBG_VERBOSE = 99 }; /* Any change in MPIU_DBG_CLASS must be matched by changes in MPIU_Classnames in src/util/dbg/dbg_printf.c */ enum MPIU_DBG_CLASS { MPIU_DBG_PT2PT = 0x1, MPIU_DBG_RMA = 0x2, MPIU_DBG_THREAD = 0x4, MPIU_DBG_PM = 0x8, MPIU_DBG_ROUTINE_ENTER = 0x10, MPIU_DBG_ROUTINE_EXIT = 0x20, MPIU_DBG_SYSCALL = 0x40, MPIU_DBG_DATATYPE = 0x80, MPIU_DBG_HANDLE = 0x100, MPIU_DBG_COMM = 0x200, MPIU_DBG_BSEND = 0x400, MPIU_DBG_OTHER = 0x800, MPIU_DBG_CH3_CONNECT = 0x1000, MPIU_DBG_CH3_DISCONNECT= 0x2000, MPIU_DBG_CH3_PROGRESS = 0x4000, MPIU_DBG_CH3_CHANNEL = 0x8000, MPIU_DBG_CH3_OTHER = 0x10000, MPIU_DBG_CH3_MSG = 0x20000, MPIU_DBG_CH3 = 0x3f000, /* alias for all Ch3*/ MPIU_DBG_NEM_SOCK_FUNC = 0x40000, MPIU_DBG_NEM_SOCK_DET = 0x80000, MPIU_DBG_VC = 0x100000, MPIU_DBG_REFCOUNT = 0x200000, MPIU_DBG_ROMIO = 0x400000, MPIU_DBG_ERRHAND = 0x800000, MPIU_DBG_ALL = (~0) }; /* alias for all */ extern int MPIU_DBG_ActiveClasses; extern int MPIU_DBG_MaxLevel; typedef enum MPIU_dbg_state_t { MPIU_DBG_STATE_NONE = 0, MPIU_DBG_STATE_UNINIT = 1, MPIU_DBG_STATE_STDOUT = 2, MPIU_DBG_STATE_MEMLOG = 4, MPIU_DBG_STATE_FILE = 8 } MPIU_dbg_state_t; int MPIU_dbg_init(int rank); int MPIU_dbg_printf(const char *str, ...) ATTRIBUTE((format(printf,1,2))); int MPIU_dbglog_printf(const char *str, ...) ATTRIBUTE((format(printf,1,2))); int MPIU_dbglog_vprintf(const char *str, va_list ap); void MPIU_dump_dbg_memlog_to_stdout(void); void MPIU_dump_dbg_memlog_to_file(const char *filename); void MPIU_dump_dbg_memlog(FILE * fp); extern MPIU_dbg_state_t MPIU_dbg_state; extern FILE * MPIU_dbg_fp; #define MPIU_dbglog_flush() \ { \ if (MPIU_dbg_state & MPIU_DBG_STATE_STDOUT) \ { \ fflush(stdout); \ } \ } int MPIU_DBG_Outevent(const char *, int, int, int, const char *, ...) ATTRIBUTE((format(printf,5,6))); int MPIU_DBG_Init( int *, char ***, int, int, int ); int MPIU_DBG_PreInit( int *, char ***, int ); #endif