254 lines
5.5 KiB
C
254 lines
5.5 KiB
C
/*** trace.c - Trace functions
|
|
*
|
|
* This module contains all the debug functions.
|
|
*
|
|
* Copyright (c) 1996,1997 Microsoft Corporation
|
|
* Author: Michael Tsang (MikeTs)
|
|
* Created 09/24/96
|
|
*
|
|
* MODIFICATION HISTORY
|
|
*/
|
|
|
|
#include "pch.h"
|
|
|
|
#ifdef TRACING
|
|
|
|
/*** Local function prototypes
|
|
*/
|
|
|
|
VOID LOCAL TraceIndent(VOID);
|
|
BOOLEAN LOCAL IsTrigPt(char *pszProcName);
|
|
|
|
/*** Local data
|
|
*/
|
|
|
|
int giTraceLevel = 0, giIndent = 0;
|
|
char aszTrigPtBuff[MAX_TRIG_PTS][MAX_TRIGPT_LEN + 1] = {0};
|
|
ULONG dwcTriggers = 0;
|
|
|
|
/***EP IsTraceOn - Determine if tracing is on for the given procedure
|
|
*
|
|
* ENTRY
|
|
* n - trace level
|
|
* pszProcName -> procedure name
|
|
* fEnter - TRUE if EnterProc trace
|
|
*
|
|
* EXIT-SUCCESS
|
|
* returns TRUE
|
|
* EXIT-FAILURE
|
|
* returns FALSE
|
|
*/
|
|
|
|
BOOLEAN EXPORT IsTraceOn(UCHAR n, char *pszProcName, BOOLEAN fEnter)
|
|
{
|
|
BOOLEAN rc = FALSE;
|
|
|
|
if (!(gDebugger.dwfDebugger & (DBGF_IN_DEBUGGER | DBGF_CHECKING_TRACE)))
|
|
{
|
|
gDebugger.dwfDebugger |= DBGF_CHECKING_TRACE;
|
|
|
|
if ((gDebugger.dwfDebugger & DBGF_TRIGGER_MODE) &&
|
|
IsTrigPt(pszProcName))
|
|
{
|
|
if (fEnter)
|
|
dwcTriggers++;
|
|
else
|
|
dwcTriggers--;
|
|
rc = TRUE;
|
|
}
|
|
else if ((n <= giTraceLevel) &&
|
|
(!(gDebugger.dwfDebugger & DBGF_TRIGGER_MODE) ||
|
|
(dwcTriggers > 0)))
|
|
{
|
|
rc = TRUE;
|
|
}
|
|
|
|
if (rc == TRUE)
|
|
TraceIndent();
|
|
|
|
gDebugger.dwfDebugger &= ~DBGF_CHECKING_TRACE;
|
|
}
|
|
|
|
return rc;
|
|
} //IsTraceOn
|
|
|
|
/***LP IsTrigPt - Find the procedure name in the TrigPt buffer
|
|
*
|
|
* ENTRY
|
|
* pszProcName -> procedure name
|
|
*
|
|
* EXIT-SUCCESS
|
|
* returns TRUE - matched whole or partial name in the TrigPt buffer
|
|
* EXIT-FAILURE
|
|
* returns FALSE - no match
|
|
*/
|
|
|
|
BOOLEAN LOCAL IsTrigPt(char *pszProcName)
|
|
{
|
|
BOOLEAN rc = FALSE;
|
|
UCHAR i;
|
|
|
|
for (i = 0; (rc == FALSE) && (i < MAX_TRIG_PTS); ++i)
|
|
{
|
|
if ((aszTrigPtBuff[i][0] != '\0') &&
|
|
(STRSTR(pszProcName, &aszTrigPtBuff[i][0]) != NULL))
|
|
{
|
|
rc = TRUE;
|
|
}
|
|
}
|
|
|
|
return rc;
|
|
} //IsTrigPt
|
|
|
|
/***LP TraceIndent - Indent trace output
|
|
*
|
|
* ENTRY
|
|
* None
|
|
*
|
|
* EXIT
|
|
* None
|
|
*/
|
|
|
|
VOID LOCAL TraceIndent(VOID)
|
|
{
|
|
int i;
|
|
|
|
PRINTF(MODNAME ":");
|
|
for (i = 0; i < giIndent; i++)
|
|
{
|
|
PRINTF("| ");
|
|
}
|
|
} //TraceIndent
|
|
|
|
/***LP SetTrace - set trace modes
|
|
*
|
|
* ENTRY
|
|
* pArg -> argument type entry
|
|
* pszArg -> argument string
|
|
* dwArgNum - argument number
|
|
* dwNonSWArgs - number of non-switch arguments
|
|
*
|
|
* EXIT
|
|
* returns DBGERR_NONE
|
|
*/
|
|
|
|
LONG LOCAL SetTrace(PCMDARG pArg, PSZ pszArg, ULONG dwArgNum, ULONG dwNonSWArgs)
|
|
{
|
|
DEREF(pszArg);
|
|
DEREF(dwNonSWArgs);
|
|
//
|
|
// User typed "set" without any arguments
|
|
//
|
|
if ((pArg == NULL) && (dwArgNum == 0))
|
|
{
|
|
int i;
|
|
|
|
PRINTF("\nTrace Level = %d\n", giTraceLevel);
|
|
PRINTF("Trace Trigger Mode = %s\n\n",
|
|
gDebugger.dwfDebugger & DBGF_TRIGGER_MODE? "ON": "OFF");
|
|
|
|
for (i = 0; i < MAX_TRIG_PTS; ++i)
|
|
{
|
|
PRINTF("%2d: %s\n", i, aszTrigPtBuff[i]);
|
|
}
|
|
}
|
|
|
|
return DBGERR_NONE;
|
|
} //SetTrace
|
|
|
|
/***LP AddTraceTrigPts - Add trace trigger points
|
|
*
|
|
* ENTRY
|
|
* pArg -> argument type entry
|
|
* pszArg -> argument string
|
|
* dwArgNum - argument number
|
|
* dwNonSWArgs - number of non-switch arguments
|
|
*
|
|
* EXIT-SUCCESS
|
|
* returns DBGERR_NONE
|
|
* EXIT-FAILURE
|
|
* returns negative error code
|
|
*/
|
|
|
|
LONG LOCAL AddTraceTrigPts(PCMDARG pArg, PSZ pszArg, ULONG dwArgNum,
|
|
ULONG dwNonSWArgs)
|
|
{
|
|
LONG rc = DBGERR_NONE;
|
|
PSZ psz;
|
|
int i;
|
|
|
|
DEREF(pArg);
|
|
DEREF(dwArgNum);
|
|
DEREF(dwNonSWArgs);
|
|
|
|
STRUPR(pszArg);
|
|
if ((pszArg != NULL) && ((psz = STRTOK(pszArg, ",")) != NULL))
|
|
{
|
|
do
|
|
{
|
|
for (i = 0; i < MAX_TRIG_PTS; ++i)
|
|
{
|
|
if (aszTrigPtBuff[i][0] == '\0')
|
|
{
|
|
STRCPYN(aszTrigPtBuff[i], psz, MAX_TRIGPT_LEN + 1);
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (i == MAX_TRIG_PTS)
|
|
{
|
|
DBG_ERROR(("no free trigger point - %s", psz));
|
|
rc = DBGERR_CMD_FAILED;
|
|
}
|
|
|
|
} while ((rc == DBGERR_NONE) && ((psz = STRTOK(NULL, ",")) != NULL));
|
|
}
|
|
|
|
return rc;
|
|
} //AddTraceTrigPts
|
|
|
|
/***LP ZapTraceTrigPts - Zap trace trigger points
|
|
*
|
|
* ENTRY
|
|
* pArg -> argument type entry
|
|
* pszArg -> argument string
|
|
* dwArgNum - argument number
|
|
* dwNonSWArgs - number of non-switch arguments
|
|
*
|
|
* EXIT-SUCCESS
|
|
* returns DBGERR_NONE
|
|
* EXIT-FAILURE
|
|
* returns negative error code
|
|
*/
|
|
|
|
LONG LOCAL ZapTraceTrigPts(PCMDARG pArg, PSZ pszArg, ULONG dwArgNum,
|
|
ULONG dwNonSWArgs)
|
|
{
|
|
LONG rc = DBGERR_NONE;
|
|
PSZ psz, psz1;
|
|
ULONG dwData;
|
|
|
|
DEREF(pArg);
|
|
DEREF(dwArgNum);
|
|
DEREF(dwNonSWArgs);
|
|
|
|
if ((pszArg != NULL) && ((psz = STRTOK(pszArg, ",")) != NULL))
|
|
{
|
|
do
|
|
{
|
|
dwData = STRTOUL(psz, &psz1, 10);
|
|
if ((psz == psz1) || (dwData >= MAX_TRIG_PTS))
|
|
{
|
|
DBG_ERROR(("invalid trigger point - %d", dwData));
|
|
rc = DBGERR_CMD_FAILED;
|
|
}
|
|
else
|
|
aszTrigPtBuff[dwData][0] = '\0';
|
|
} while ((rc == DBGERR_NONE) && ((psz = STRTOK(NULL, ",")) != NULL));
|
|
}
|
|
|
|
return rc;
|
|
} //ZapTraceTrigPts
|
|
|
|
#endif //ifdef TRACING
|