780 lines
31 KiB
C
780 lines
31 KiB
C
/*++
|
||
|
||
Copyright (c) 1997-1999 Microsoft Corporation
|
||
|
||
Module Name:
|
||
debug.c
|
||
|
||
Abstract:
|
||
This header file defines data structures and macros related to internal
|
||
FRS monitoring and activity logging. The activity log is always present
|
||
but the amount of information placed in the log can be controlled by a
|
||
severity level parameter. See below.
|
||
|
||
In addition, FRS contains constraint checks throughout the code using the
|
||
FRS_ASSERT() macro. FRS follows a "Fail Fast" model for failure recovery.
|
||
If the constraint is not satisfied FRS places an entry in the event log
|
||
and abruptly shuts down. The objective is to minimize the likelyhood that
|
||
continued execution will propagate invalid state into the FRS database.
|
||
The WIN2K Service Controller is set to automatically restart FRS after a
|
||
short delay.
|
||
|
||
Author:
|
||
David A. Orbits 20-Mar-1997
|
||
|
||
|
||
--*/
|
||
|
||
|
||
|
||
// Guidelines for Severity Level Use in DPRINT():
|
||
//
|
||
// 0 - Most severe, eg. fatal inconsistency, mem alloc fail. Least noisey.
|
||
// 1 - Important info, eg. Key config parameters, unexpected conditions
|
||
// 2 -
|
||
// 3 - Change Order Process trace records.
|
||
// 4 - Status results, e.g. table lookup failures, new entry inserted
|
||
// 5 - Information level messages to show flow. Noisest level. Maybe in a loop
|
||
//
|
||
|
||
/* Debug output macros
|
||
|
||
This is a simple debugging package for generating conditional
|
||
printf output.
|
||
|
||
AT RUN-TIME
|
||
|
||
There are 2 run-time options:
|
||
|
||
1 - A list of subsystems to be debugged. Either a list of subsystem
|
||
names delimited by a ":" or an "*" which means debug all
|
||
(e.g. sub1:sub2: Sub3:). (Names are case sensitive and spaces
|
||
between names are ignored.)
|
||
|
||
2 - A severity level (1-5) that indicates the level of detailed
|
||
information to be produced. (The higher the level, the more
|
||
data produced.
|
||
|
||
|
||
AT COMPILE-TIME
|
||
|
||
Compile with the /DDBG=1 option to define the preprocessor variable
|
||
DBG to 1. This will generate debug source code. For customer shipment,
|
||
set /DDBG=0 and all debug code will be removed. (Actually a
|
||
";" will be generated.)
|
||
|
||
|
||
AT CODE-TIME
|
||
|
||
1 - Include the DEBUG.H header at the top of your source listing.
|
||
|
||
2 - #DEFINE DEBSUB to contain the name (a string delimited by a ":") of
|
||
the software subsystem contained in this source (e.g. #define DEBSUB
|
||
"MySub:") (You could optionally redefine DEBSUB for each function in
|
||
your source to give you function-level debugging.)
|
||
|
||
3 - Invoke the DEBUGINIT macro that calls the Debug function before any
|
||
source debug statements are executed. This funciton prompts STDIN for
|
||
the user specified run-time options. (Alternatively you could
|
||
hardcode your own assignment of the DebugInfo data structure which
|
||
holds the run-time options.)
|
||
|
||
4 - Everywhere you want to a printf for debugging, put a DPRINT statement
|
||
instead and specify a severity level with the statement. The
|
||
statement will be printed if the severity is this level or higher
|
||
(assuming that the subsystem is to be debugged). The severity level
|
||
allows for different amounts of output to be generated if problem
|
||
is very bad.
|
||
|
||
For example, a severity of 1 DPRINT statement might just indicate that
|
||
a certain function was entered while a severity of 5 might print
|
||
information that is inside a tight loop.
|
||
|
||
(Actually there are 6 DPRINT statements provided depending on the
|
||
number of printf arguments.)
|
||
|
||
|
||
NOTE
|
||
|
||
All printf's are surrounded by semaphores. Be careful not to invoke
|
||
routines as parms to printf because you can have a deadlock situation.
|
||
|
||
|
||
EXAMPLE PROGRAM
|
||
|
||
** include "debug.h"
|
||
** include "string.h"
|
||
**
|
||
** #define DEBSUB "sub1:"
|
||
**
|
||
** main()
|
||
** {
|
||
** DEBUGINIT;
|
||
**
|
||
** DPRINT(4,"this is a sub1 debug of 4\n");
|
||
** DPRINT(1,"this is a sub1 debug of 1\n");
|
||
** }
|
||
|
||
*/
|
||
|
||
|
||
#ifndef _debug_h_
|
||
#define _debug_h_
|
||
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
|
||
|
||
// <DebugInfo>, of type DEBUGARG, contains the debug run-time settings.
|
||
//
|
||
// DebSubSystems contains a list of subsystem names to be debugged
|
||
// delimited by ":". An "*" found in this array indicates that all
|
||
// subsystems are to be debugged.
|
||
//
|
||
// The severity indicates the amount of debug information to be produced.
|
||
// The higher the severity the more data that will be dumped.
|
||
//
|
||
// A specific thread can be traced by entering its ID. An id of 0 means all.
|
||
//
|
||
|
||
typedef struct _DEBUGARG {
|
||
ULONG Severity; // 1 - 5 on stdout
|
||
PCHAR Systems; // subsystem to debug
|
||
ULONG ThreadId; // thread id to debug (0 = All)
|
||
BOOL Disabled; // debugging has been disabled
|
||
BOOL Suppress; // suppress debug print
|
||
BOOL DisableCompression; // Enable support for compression.
|
||
ULONG LogSeverity; // 1 - 5 on log file
|
||
ULONG MaxLogLines; // max dprint log lines
|
||
ULONG LogLines; // current dprint lines logged
|
||
ULONG TotalLogLines; // total dprint lines logged
|
||
PWCHAR LogFile; // dprint log file
|
||
PWCHAR LogDir; // dprint log directory.
|
||
FILE *LogFILE; // open log file stream
|
||
ULONG Interval; // scheduling interval
|
||
BOOL TestFid; // enable the rename-fid tests
|
||
PCHAR Recipients; // email recipients
|
||
PCHAR Profile; // email profile
|
||
PCHAR BuildLab; // Build lab ID string from registry.
|
||
PWCHAR AssertShare; // share to copy assert files
|
||
BOOL CopyLogs; // copy logs into assert share
|
||
ULONG AssertFiles; // number of assert files
|
||
ULONG LogFiles; // number of log files
|
||
BOOL PrintStats; // Print stats at DebUnLock()
|
||
BOOL PrintingStats; // Currently printing stats
|
||
ULONG RestartSeconds; // Must run this long for restart
|
||
BOOL Restart; // restart on assertion failure
|
||
ULONGLONG StartSeconds; // start time in seconds
|
||
PWCHAR CommandLine; // Original command line
|
||
BOOL Break; // Break into the debugger on assert
|
||
ULONG AssertSeconds; // assert after this many seconds
|
||
BOOL VvJoinTests; // enable VvJoin Tests
|
||
ULONG Tests; // Enable random tests
|
||
ULONG UnjoinTrigger; // unjoin trigger
|
||
LONG FetchRetryTrigger; // fetch retry trigger
|
||
LONG FetchRetryReset; // fetch retry trigger reset
|
||
LONG FetchRetryInc; // fetch retry trigger reset inc
|
||
BOOL ForceVvJoin; // force vvjoin at every true join
|
||
BOOL Mem; // Check memory allocations/frees
|
||
BOOL MemCompact; // Compact mem at every free
|
||
BOOL Queues; // Check queues
|
||
DWORD DbsOutOfSpace; // Create REAL out of space errors on DB
|
||
DWORD DbsOutOfSpaceTrigger; // dummy out-of-space error
|
||
LONG LogFlushInterval; // Flush the log every n lines.
|
||
CRITICAL_SECTION DbsOutOfSpaceLock; // lock for out-of-space tests
|
||
CRITICAL_SECTION Lock; // single thread semaphore
|
||
} DEBUGARG, *PDEBUGARG;
|
||
|
||
#define DBG_DBS_OUT_OF_SPACE_OP_NONE (0) // no out of space errors
|
||
#define DBG_DBS_OUT_OF_SPACE_OP_CREATE (1) // out of space error during create
|
||
#define DBG_DBS_OUT_OF_SPACE_OP_DELETE (2) // out of space error during delete
|
||
#define DBG_DBS_OUT_OF_SPACE_OP_WRITE (3) // out of space error during write
|
||
#define DBG_DBS_OUT_OF_SPACE_OP_REMOVE (4) // out of space error during remove
|
||
#define DBG_DBS_OUT_OF_SPACE_OP_MULTI (5) // out of space error during multi
|
||
#define DBG_DBS_OUT_OF_SPACE_OP_MAX (5) // Max value for param
|
||
|
||
extern DEBUGARG DebugInfo;
|
||
|
||
|
||
//
|
||
// forward declare actual functions used by DPRINT's
|
||
//
|
||
VOID
|
||
DebLock(
|
||
VOID
|
||
);
|
||
|
||
VOID
|
||
DebUnLock(
|
||
VOID
|
||
);
|
||
|
||
VOID
|
||
DebPrintNoLock(
|
||
IN ULONG,
|
||
IN BOOL,
|
||
IN PUCHAR,
|
||
IN PCHAR,
|
||
IN UINT,
|
||
...
|
||
);
|
||
|
||
VOID
|
||
DebPrintTrackingNoLock(
|
||
IN ULONG Sev,
|
||
IN PUCHAR Str,
|
||
IN ... );
|
||
|
||
VOID
|
||
DebPrint(
|
||
IN ULONG,
|
||
IN PUCHAR,
|
||
IN PCHAR,
|
||
IN UINT,
|
||
...
|
||
);
|
||
|
||
BOOL
|
||
DoDebug(
|
||
IN ULONG,
|
||
IN PUCHAR
|
||
);
|
||
|
||
//
|
||
// These are used instead of printf statements. Semaphores surround the
|
||
// printf and all output is provided by the subsystem.
|
||
//
|
||
#define DPRINT(_sev_,str) \
|
||
DebPrint((_sev_), (PUCHAR)str, DEBSUB, __LINE__)
|
||
|
||
#define DPRINT1(_sev_, str,p1) \
|
||
DebPrint((_sev_), (PUCHAR)str, DEBSUB, __LINE__, p1 )
|
||
|
||
#define DPRINT2(_sev_, str,p1,p2) \
|
||
DebPrint((_sev_), (PUCHAR)str, DEBSUB, __LINE__, p1, p2 )
|
||
|
||
#define DPRINT3(_sev_, str,p1,p2,p3) \
|
||
DebPrint((_sev_), (PUCHAR)str, DEBSUB, __LINE__, p1, p2, p3 )
|
||
|
||
#define DPRINT4(_sev_, str,p1,p2,p3,p4) \
|
||
DebPrint((_sev_), (PUCHAR)str, DEBSUB, __LINE__, p1, p2, p3, p4 )
|
||
|
||
#define DPRINT5(_sev_, str,p1,p2,p3,p4,p5) \
|
||
DebPrint((_sev_), (PUCHAR)str, DEBSUB, __LINE__, p1, p2, p3, p4, p5 )
|
||
|
||
#define DPRINT6(_sev_, str,p1,p2,p3,p4,p5,p6) \
|
||
DebPrint((_sev_), (PUCHAR)str, DEBSUB, __LINE__, p1, p2, p3, p4, p5, p6 )
|
||
|
||
#define DPRINT7(_sev_, str,p1,p2,p3,p4,p5,p6,p7) \
|
||
DebPrint((_sev_), (PUCHAR)str, DEBSUB, __LINE__, p1,p2,p3,p4,p5,p6,p7)
|
||
|
||
#define DPRINT8(_sev_, str,p1,p2,p3,p4,p5,p6,p7,p8) \
|
||
DebPrint((_sev_), (PUCHAR)str, DEBSUB, __LINE__, p1,p2,p3,p4,p5,p6,p7,p8 )
|
||
|
||
|
||
|
||
#define DPRINT_NOLOCK(_sev_, str) \
|
||
DebPrintNoLock((_sev_), TRUE, (PUCHAR)str, DEBSUB, __LINE__)
|
||
|
||
#define DPRINT_NOLOCK1(_sev_, str,p1) \
|
||
DebPrintNoLock((_sev_), TRUE, (PUCHAR)str, DEBSUB, __LINE__, p1 )
|
||
|
||
#define DPRINT_NOLOCK2(_sev_, str,p1,p2) \
|
||
DebPrintNoLock((_sev_), TRUE, (PUCHAR)str, DEBSUB, __LINE__, p1, p2 )
|
||
|
||
#define DPRINT_NOLOCK3(_sev_, str,p1,p2,p3) \
|
||
DebPrintNoLock((_sev_), TRUE, (PUCHAR)str, DEBSUB, __LINE__, p1, p2, p3 )
|
||
|
||
#define DPRINT_NOLOCK4(_sev_, str,p1,p2,p3,p4) \
|
||
DebPrintNoLock((_sev_), TRUE, (PUCHAR)str, DEBSUB, __LINE__, p1, p2, p3, p4 )
|
||
|
||
#define DPRINT_NOLOCK5(_sev_, str,p1,p2,p3,p4,p5) \
|
||
DebPrintNoLock((_sev_), TRUE, (PUCHAR)str, DEBSUB, __LINE__, p1, p2, p3, p4, p5 )
|
||
|
||
#define DPRINT_NOLOCK6(_sev_, str,p1,p2,p3,p4,p5,p6) \
|
||
DebPrintNoLock((_sev_), TRUE, (PUCHAR)str, DEBSUB, __LINE__, p1, p2, p3, p4, p5, p6 )
|
||
|
||
|
||
//
|
||
// DPRINT_FS(sev, "display text", FStatus)
|
||
//
|
||
#define DPRINT_FS(_sev_, _str, _fstatus) \
|
||
if (!FRS_SUCCESS(_fstatus)) { \
|
||
DebPrint((_sev_), \
|
||
(PUCHAR)(_str " FStatus: %s\n"), \
|
||
DEBSUB, __LINE__, ErrLabelFrs(_fstatus) ); \
|
||
}
|
||
|
||
#define DPRINT1_FS(_sev_, _str, _p1, _fstatus) \
|
||
if (!FRS_SUCCESS(_fstatus)) { \
|
||
DebPrint((_sev_), \
|
||
(PUCHAR)(_str " FStatus: %s\n"), \
|
||
DEBSUB, __LINE__, _p1, ErrLabelFrs(_fstatus) ); \
|
||
}
|
||
|
||
#define DPRINT2_FS(_sev_, _str, _p1, _p2, _fstatus) \
|
||
if (!FRS_SUCCESS(_fstatus)) { \
|
||
DebPrint((_sev_), \
|
||
(PUCHAR)(_str " FStatus: %s\n"), \
|
||
DEBSUB, __LINE__, _p1, _p2, ErrLabelFrs(_fstatus) ); \
|
||
}
|
||
|
||
#define DPRINT3_FS(_sev_, _str, _p1, _p2, _p3, _fstatus) \
|
||
if (!FRS_SUCCESS(_fstatus)) { \
|
||
DebPrint((_sev_), \
|
||
(PUCHAR)(_str " FStatus: %s\n"), \
|
||
DEBSUB, __LINE__, _p1, _p2, _p3, ErrLabelFrs(_fstatus) ); \
|
||
}
|
||
|
||
#define DPRINT4_FS(_sev_, _str, _p1, _p2, _p3, _p4, _fstatus) \
|
||
if (!FRS_SUCCESS(_fstatus)) { \
|
||
DebPrint((_sev_), \
|
||
(PUCHAR)(_str " FStatus: %s\n"), \
|
||
DEBSUB, __LINE__, _p1, _p2, _p3, _p4, ErrLabelFrs(_fstatus)); \
|
||
}
|
||
|
||
//
|
||
// CLEANUP_FS(sev, "display text", FStatus, branch_target)
|
||
// Like DPRINT but takes a branch target as last arg if success test fails.
|
||
//
|
||
#define CLEANUP_FS(_sev_, _str, _fstatus, _branch) \
|
||
if (!FRS_SUCCESS(_fstatus)) { \
|
||
DebPrint((_sev_), \
|
||
(PUCHAR)(_str " FStatus: %s\n"), \
|
||
DEBSUB, __LINE__, ErrLabelFrs(_fstatus) ); \
|
||
goto _branch; \
|
||
}
|
||
|
||
#define CLEANUP1_FS(_sev_, _str, _p1, _fstatus, _branch) \
|
||
if (!FRS_SUCCESS(_fstatus)) { \
|
||
DebPrint((_sev_), \
|
||
(PUCHAR)(_str " FStatus: %s\n"), \
|
||
DEBSUB, __LINE__, _p1, ErrLabelFrs(_fstatus) ); \
|
||
goto _branch; \
|
||
}
|
||
|
||
#define CLEANUP2_FS(_sev_, _str, _p1, _p2, _fstatus, _branch) \
|
||
if (!FRS_SUCCESS(_fstatus)) { \
|
||
DebPrint((_sev_), \
|
||
(PUCHAR)(_str " FStatus: %s\n"), \
|
||
DEBSUB, __LINE__, _p1, _p2, ErrLabelFrs(_fstatus) ); \
|
||
goto _branch; \
|
||
}
|
||
|
||
#define CLEANUP3_FS(_sev_, _str, _p1, _p2, _p3, _fstatus, _branch) \
|
||
if (!FRS_SUCCESS(_fstatus)) { \
|
||
DebPrint((_sev_), \
|
||
(PUCHAR)(_str " FStatus: %s\n"), \
|
||
DEBSUB, __LINE__, _p1, _p2, _p3, ErrLabelFrs(_fstatus) ); \
|
||
goto _branch; \
|
||
}
|
||
|
||
#define CLEANUP4_FS(_sev_, _str, _p1, _p2, _p3, _p4, _fstatus, _branch) \
|
||
if (!FRS_SUCCESS(_fstatus)) { \
|
||
DebPrint((_sev_), \
|
||
(PUCHAR)(_str " FStatus: %s\n"), \
|
||
DEBSUB, __LINE__, _p1, _p2, _p3, _p4, ErrLabelFrs(_fstatus) ); \
|
||
goto _branch; \
|
||
}
|
||
|
||
|
||
//
|
||
// DPRINT_WS(sev, "display text", WStatus)
|
||
//
|
||
#define DPRINT_WS(_sev_, _str, _wstatus) \
|
||
if (!WIN_SUCCESS(_wstatus)) { \
|
||
DebPrint((_sev_), \
|
||
(PUCHAR)(_str " WStatus: %s\n"), \
|
||
DEBSUB, __LINE__, ErrLabelW32(_wstatus) ); \
|
||
}
|
||
|
||
#define DPRINT1_WS(_sev_, _str, _p1, _wstatus) \
|
||
if (!WIN_SUCCESS(_wstatus)) { \
|
||
DebPrint((_sev_), \
|
||
(PUCHAR)(_str " WStatus: %s\n"), \
|
||
DEBSUB, __LINE__, _p1, ErrLabelW32(_wstatus) ); \
|
||
}
|
||
|
||
#define DPRINT2_WS(_sev_, _str, _p1, _p2, _wstatus) \
|
||
if (!WIN_SUCCESS(_wstatus)) { \
|
||
DebPrint((_sev_), \
|
||
(PUCHAR)(_str " WStatus: %s\n"), \
|
||
DEBSUB, __LINE__, _p1, _p2, ErrLabelW32(_wstatus) ); \
|
||
}
|
||
|
||
#define DPRINT3_WS(_sev_, _str, _p1, _p2, _p3, _wstatus) \
|
||
if (!WIN_SUCCESS(_wstatus)) { \
|
||
DebPrint((_sev_), \
|
||
(PUCHAR)(_str " WStatus: %s\n"), \
|
||
DEBSUB, __LINE__, _p1, _p2, _p3, ErrLabelW32(_wstatus) ); \
|
||
}
|
||
|
||
#define DPRINT4_WS(_sev_, _str, _p1, _p2, _p3, _p4, _wstatus) \
|
||
if (!WIN_SUCCESS(_wstatus)) { \
|
||
DebPrint((_sev_), \
|
||
(PUCHAR)(_str " WStatus: %s\n"), \
|
||
DEBSUB, __LINE__, _p1, _p2, _p3, _p4, ErrLabelW32(_wstatus) ); \
|
||
}
|
||
|
||
|
||
//
|
||
// CLEANUP_WS(sev, "display text", wstatus, branch_target)
|
||
// Like DPRINT but takes a branch target as last arg if success test fails.
|
||
//
|
||
|
||
#define CLEANUP_WS(_sev_, _str, _wstatus, _branch) \
|
||
if (!WIN_SUCCESS(_wstatus)) { \
|
||
DebPrint((_sev_), \
|
||
(PUCHAR)(_str " WStatus: %s\n"), \
|
||
DEBSUB, __LINE__, ErrLabelW32(_wstatus) ); \
|
||
goto _branch; \
|
||
}
|
||
|
||
#define CLEANUP1_WS(_sev_, _str, _p1, _wstatus, _branch) \
|
||
if (!WIN_SUCCESS(_wstatus)) { \
|
||
DebPrint((_sev_), \
|
||
(PUCHAR)(_str " WStatus: %s\n"), \
|
||
DEBSUB, __LINE__, _p1, ErrLabelW32(_wstatus) ); \
|
||
goto _branch; \
|
||
}
|
||
|
||
#define CLEANUP2_WS(_sev_, _str, _p1, _p2, _wstatus, _branch) \
|
||
if (!WIN_SUCCESS(_wstatus)) { \
|
||
DebPrint((_sev_), \
|
||
(PUCHAR)(_str " WStatus: %s\n"), \
|
||
DEBSUB, __LINE__, _p1, _p2, ErrLabelW32(_wstatus) ); \
|
||
goto _branch; \
|
||
}
|
||
|
||
#define CLEANUP3_WS(_sev_, _str, _p1, _p2, _p3, _wstatus, _branch) \
|
||
if (!WIN_SUCCESS(_wstatus)) { \
|
||
DebPrint((_sev_), \
|
||
(PUCHAR)(_str " WStatus: %s\n"), \
|
||
DEBSUB, __LINE__, _p1, _p2, _p3, ErrLabelW32(_wstatus) ); \
|
||
goto _branch; \
|
||
}
|
||
|
||
|
||
//
|
||
// DPRINT_NT(sev, "display text", Nttatus)
|
||
//
|
||
#define DPRINT_NT(_sev_, _str, _NtStatus) \
|
||
if (!NT_SUCCESS(_NtStatus)) { \
|
||
DebPrint((_sev_), \
|
||
(PUCHAR)(_str " NTStatus: %s\n"), \
|
||
DEBSUB, __LINE__, ErrLabelNT(_NtStatus) ); \
|
||
}
|
||
|
||
#define DPRINT1_NT(_sev_, _str, _p1, _NtStatus) \
|
||
if (!NT_SUCCESS(_NtStatus)) { \
|
||
DebPrint((_sev_), \
|
||
(PUCHAR)(_str " NTStatus: %s\n"), \
|
||
DEBSUB, __LINE__, _p1, ErrLabelNT(_NtStatus) ); \
|
||
}
|
||
|
||
#define DPRINT2_NT(_sev_, _str, _p1, _p2, _NtStatus) \
|
||
if (!NT_SUCCESS(_NtStatus)) { \
|
||
DebPrint((_sev_), \
|
||
(PUCHAR)(_str " NTStatus: %s\n"), \
|
||
DEBSUB, __LINE__, _p1, _p2, ErrLabelNT(_NtStatus) ); \
|
||
}
|
||
|
||
#define DPRINT3_NT(_sev_, _str, _p1, _p2, _p3, _NtStatus) \
|
||
if (!NT_SUCCESS(_NtStatus)) { \
|
||
DebPrint((_sev_), \
|
||
(PUCHAR)(_str " NTStatus: %s\n"), \
|
||
DEBSUB, __LINE__, _p1, _p2, _p3, ErrLabelNT(_NtStatus) ); \
|
||
}
|
||
|
||
#define DPRINT4_NT(_sev_, _str, _p1, _p2, _p3, _p4, _NtStatus) \
|
||
if (!NT_SUCCESS(_NtStatus)) { \
|
||
DebPrint((_sev_), \
|
||
(PUCHAR)(_str " NTStatus: %s\n"), \
|
||
DEBSUB, __LINE__, _p1, _p2, _p3, _p4, ErrLabelNT(_NtStatus) ); \
|
||
}
|
||
|
||
|
||
//
|
||
// CLEANUP_NT(sev, "display text", NtStatus, branch_target)
|
||
// Like DPRINT but takes a branch target as last arg if success test fails.
|
||
//
|
||
|
||
#define CLEANUP_NT(_sev_, _str, _NtStatus, _branch) \
|
||
if (!NT_SUCCESS(_NtStatus)) { \
|
||
DebPrint((_sev_), \
|
||
(PUCHAR)(_str " NTStatus: %s\n"), \
|
||
DEBSUB, __LINE__, ErrLabelNT(_NtStatus) ); \
|
||
goto _branch; \
|
||
}
|
||
|
||
#define CLEANUP1_NT(_sev_, _str, _p1, _NtStatus, _branch) \
|
||
if (!NT_SUCCESS(_NtStatus)) { \
|
||
DebPrint((_sev_), \
|
||
(PUCHAR)(_str " NTStatus: %s\n"), \
|
||
DEBSUB, __LINE__, _p1, ErrLabelNT(_NtStatus) ); \
|
||
goto _branch; \
|
||
}
|
||
|
||
#define CLEANUP2_NT(_sev_, _str, _p1, _p2, _NtStatus, _branch) \
|
||
if (!NT_SUCCESS(_NtStatus)) { \
|
||
DebPrint((_sev_), \
|
||
(PUCHAR)(_str " NTStatus: %s\n"), \
|
||
DEBSUB, __LINE__, _p1, _p2, ErrLabelNT(_NtStatus) ); \
|
||
goto _branch; \
|
||
}
|
||
|
||
#define CLEANUP3_NT(_sev_, _str, _p1, _p2, _p3, _NtStatus, _branch) \
|
||
if (!NT_SUCCESS(_NtStatus)) { \
|
||
DebPrint((_sev_), \
|
||
(PUCHAR)(_str " NTStatus: %s\n"), \
|
||
DEBSUB, __LINE__, _p1, _p2, _p3, ErrLabelNT(_NtStatus) ); \
|
||
goto _branch; \
|
||
}
|
||
|
||
|
||
|
||
|
||
//
|
||
// DPRINT_JS(sev, "display text", jerr)
|
||
//
|
||
|
||
#define DPRINT_JS(_sev_, _str, _jerr) \
|
||
if (!JET_SUCCESS(_jerr)) { \
|
||
DebPrint((_sev_), \
|
||
(PUCHAR)(_str " JStatus: %s\n"), \
|
||
DEBSUB, __LINE__, ErrLabelJet(_jerr) ); \
|
||
}
|
||
|
||
#define DPRINT1_JS(_sev_, _str, _p1, _jerr) \
|
||
if (!JET_SUCCESS(_jerr)) { \
|
||
DebPrint((_sev_), \
|
||
(PUCHAR)(_str " JStatus: %s\n"), \
|
||
DEBSUB, __LINE__, _p1, ErrLabelJet(_jerr) ); \
|
||
}
|
||
|
||
#define DPRINT2_JS(_sev_, _str, _p1, _p2, _jerr) \
|
||
if (!JET_SUCCESS(_jerr)) { \
|
||
DebPrint((_sev_), \
|
||
(PUCHAR)(_str " JStatus: %s\n"), \
|
||
DEBSUB, __LINE__, _p1, _p2, ErrLabelJet(_jerr) ); \
|
||
}
|
||
|
||
|
||
|
||
//
|
||
// CLEANUP_JS(sev, "display text", jerr, branch_target)
|
||
// Like DPRINT but takes a branch target as last arg if success test fails.
|
||
//
|
||
|
||
#define CLEANUP_JS(_sev_, _str, _jerr, _branch) \
|
||
if (!JET_SUCCESS(_jerr)) { \
|
||
DebPrint((_sev_), \
|
||
(PUCHAR)(_str " JStatus: %s\n"), \
|
||
DEBSUB, __LINE__, ErrLabelJet(_jerr) ); \
|
||
goto _branch; \
|
||
}
|
||
|
||
#define CLEANUP1_JS(_sev_, _str, _p1, _jerr, _branch) \
|
||
if (!JET_SUCCESS(_jerr)) { \
|
||
DebPrint((_sev_), \
|
||
(PUCHAR)(_str " JStatus: %s\n"), \
|
||
DEBSUB, __LINE__, _p1, ErrLabelJet(_jerr) ); \
|
||
goto _branch; \
|
||
}
|
||
|
||
#define CLEANUP2_JS(_sev_, _str, _p1, _p2, _jerr, _branch) \
|
||
if (!JET_SUCCESS(_jerr)) { \
|
||
DebPrint((_sev_), \
|
||
(PUCHAR)(_str " JStatus: %s\n"), \
|
||
DEBSUB, __LINE__, _p1, _p2, ErrLabelJet(_jerr) ); \
|
||
goto _branch; \
|
||
}
|
||
|
||
|
||
|
||
//
|
||
// DPRINT_LS(sev, "display text", LDAP_Status)
|
||
//
|
||
#define DPRINT_LS(_sev_, _str, _LStatus) \
|
||
if (!LDP_SUCCESS(_LStatus)) { \
|
||
DebPrint((_sev_), \
|
||
(PUCHAR)(_str " Ldap Status: %ws\n"), \
|
||
DEBSUB, __LINE__, ldap_err2string(_LStatus) ); \
|
||
}
|
||
|
||
#define DPRINT1_LS(_sev_, _str, _p1, _LStatus) \
|
||
if (!LDP_SUCCESS(_LStatus)) { \
|
||
DebPrint((_sev_), \
|
||
(PUCHAR)(_str " Ldap Status: %ws\n"), \
|
||
DEBSUB, __LINE__, _p1, ldap_err2string(_LStatus) ); \
|
||
}
|
||
|
||
#define DPRINT2_LS(_sev_, _str, _p1, _p2, _LStatus) \
|
||
if (!LDP_SUCCESS(_LStatus)) { \
|
||
DebPrint((_sev_), \
|
||
(PUCHAR)(_str " Ldap Status: %ws\n"), \
|
||
DEBSUB, __LINE__, _p1, _p2, ldap_err2string(_LStatus) ); \
|
||
}
|
||
|
||
#define DPRINT3_LS(_sev_, _str, _p1, _p2, _p3, _LStatus) \
|
||
if (!LDP_SUCCESS(_LStatus)) { \
|
||
DebPrint((_sev_), \
|
||
(PUCHAR)(_str " Ldap Status: %ws\n"), \
|
||
DEBSUB, __LINE__, _p1, _p2, _p3, ldap_err2string(_LStatus) ); \
|
||
}
|
||
|
||
//
|
||
// CLEANUP_LS(sev, "display text", LDAP_Status, branch_target)
|
||
// Like DPRINT but takes a branch target as last arg if success test fails.
|
||
//
|
||
#define CLEANUP_LS(_sev_, _str, _LStatus, _branch) \
|
||
if (!LDP_SUCCESS(_LStatus)) { \
|
||
DebPrint((_sev_), \
|
||
(PUCHAR)(_str " Ldap Status: %ws\n"), \
|
||
DEBSUB, __LINE__, ldap_err2string(_LStatus) ); \
|
||
goto _branch; \
|
||
}
|
||
|
||
#define CLEANUP1_LS(_sev_, _str, _p1, _LStatus, _branch) \
|
||
if (!LDP_SUCCESS(_LStatus)) { \
|
||
DebPrint((_sev_), \
|
||
(PUCHAR)(_str " Ldap Status: %ws\n"), \
|
||
DEBSUB, __LINE__, _p1, ldap_err2string(_LStatus) ); \
|
||
goto _branch; \
|
||
}
|
||
|
||
#define CLEANUP2_LS(_sev_, _str, _p1, _p2, _LStatus, _branch) \
|
||
if (!LDP_SUCCESS(_LStatus)) { \
|
||
DebPrint((_sev_), \
|
||
(PUCHAR)(_str " Ldap Status: %ws\n"), \
|
||
DEBSUB, __LINE__, _p1, _p2, ldap_err2string(_LStatus) ); \
|
||
goto _branch; \
|
||
}
|
||
|
||
#define CLEANUP3_LS(_sev_, _str, _p1, _p2, _p3, _LStatus, _branch) \
|
||
if (!LDP_SUCCESS(_LStatus)) { \
|
||
DebPrint((_sev_), \
|
||
(PUCHAR)(_str " Ldap Status: %ws\n"), \
|
||
DEBSUB, __LINE__, _p1, _p2, _p3, ldap_err2string(_LStatus) ); \
|
||
goto _branch; \
|
||
}
|
||
|
||
|
||
//
|
||
// Send Mail
|
||
//
|
||
#if 0
|
||
VOID
|
||
DbgSendMail(
|
||
IN PCHAR Subject,
|
||
IN PCHAR Content
|
||
);
|
||
|
||
#define SENDMAIL(_Subject_, _Content_) DbgSendMail(_Subject_, _Content_)
|
||
#endif 0
|
||
|
||
|
||
//
|
||
// Define the debug initialization routine
|
||
//
|
||
VOID
|
||
DbgInitLogTraceFile(
|
||
IN LONG argc,
|
||
IN PWCHAR *argv
|
||
);
|
||
|
||
VOID
|
||
DbgMustInit(
|
||
IN LONG argc,
|
||
IN PWCHAR *argv
|
||
);
|
||
|
||
VOID
|
||
DbgCaptureThreadInfo(
|
||
PWCHAR ArgName,
|
||
PTHREAD_START_ROUTINE EntryPoint
|
||
);
|
||
|
||
VOID
|
||
DbgCaptureThreadInfo2(
|
||
PWCHAR ArgName,
|
||
PTHREAD_START_ROUTINE EntryPoint,
|
||
ULONG ThreadId
|
||
);
|
||
|
||
VOID
|
||
DbgMinimumInit(
|
||
VOID
|
||
);
|
||
|
||
VOID
|
||
DbgFlush(
|
||
VOID
|
||
);
|
||
|
||
#define DEBUG_FLUSH() DbgFlush()
|
||
|
||
VOID
|
||
DbgDoAssert(
|
||
IN PCHAR,
|
||
IN UINT,
|
||
IN PCHAR
|
||
);
|
||
|
||
#define FRS_ASSERT(_exp) { if (!(_exp)) DbgDoAssert(#_exp, __LINE__, DEBSUB); }
|
||
|
||
#define FRS_FORCE_ACCVIO \
|
||
DPRINT(0, "FRS_FORCE_ACCVIO\n"); \
|
||
*((PULONG) (0)) = 0;
|
||
|
||
|
||
#define XRAISEGENEXCEPTION(_x) {RaiseException((_x) ,EXCEPTION_NONCONTINUABLE,0,0);}
|
||
|
||
//
|
||
// Used for stack trace and tests
|
||
//
|
||
#define STACK_TRACE(_Stack_, _Depth_) \
|
||
DbgStackTrace(_Stack_, _Depth_)
|
||
|
||
#define STACK_PRINT(_Severity_, _Stack_, _Depth_) \
|
||
DbgStackPrint(_Severity_, DEBSUB, __LINE__, _Stack_, _Depth_)
|
||
|
||
#define STACK_TRACE_AND_PRINT(_Severity_) \
|
||
DbgPrintStackTrace(_Severity_, DEBSUB, __LINE__)
|
||
|
||
VOID
|
||
DbgStackTrace(
|
||
PULONG_PTR Stack,
|
||
ULONG Depth
|
||
);
|
||
|
||
VOID
|
||
DbgStackPrint(
|
||
ULONG Severity,
|
||
PCHAR Debsub,
|
||
UINT LineNo,
|
||
PULONG_PTR Stack,
|
||
ULONG Depth
|
||
);
|
||
|
||
VOID
|
||
DbgPrintStackTrace(
|
||
ULONG Severity,
|
||
PCHAR Debsub,
|
||
UINT LineNo
|
||
);
|
||
|
||
|
||
//
|
||
// check for improper cleanup at shutdown
|
||
//
|
||
extern VOID JrnlDumpVmeFilterTable(VOID);
|
||
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
|
||
#endif /* _debug_h_ */
|