211 lines
4 KiB
C
211 lines
4 KiB
C
/*++
|
|
|
|
Copyright (c) 1990-1995 Microsoft Corporation
|
|
All rights reserved
|
|
|
|
Module Name:
|
|
|
|
debug.c
|
|
|
|
Abstract:
|
|
|
|
Simple debug routines to log job references. This will capture
|
|
a backtrace of all pIniJob->cRef changes into a memory log.
|
|
|
|
To enable, do the following:
|
|
|
|
1. Define DEBUG_JOB_CREF in sources.
|
|
2. Add this file to sources.
|
|
3. Run with debug version of spoolss.dll (this uses the debug
|
|
log routines from spllib that are in spoolss.dll).
|
|
|
|
When you have a job that won't be deleted, dump it out and
|
|
look at the last field (usually it's right before the
|
|
0xdeadbeef trailer in pIniJob). Then use the spllib debug
|
|
extensions to dump it (splx.dll, built from spooler\exts).
|
|
|
|
!splx.ddt -x {pvRef Address}
|
|
|
|
The -b option is handy to look at backtraces (available on x86
|
|
only). Note that ddt list most recent entries first (see
|
|
!splx.help for more info.
|
|
|
|
This code should only be used when debugging specific pIniJob->cRef
|
|
problems.
|
|
|
|
Author:
|
|
|
|
Environment:
|
|
|
|
User Mode -Win32
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "precomp.h"
|
|
#pragma hdrstop
|
|
|
|
#ifdef DEBUG_JOB_CREF
|
|
|
|
VOID
|
|
DbgJobInit(
|
|
PINIJOB pIniJob
|
|
)
|
|
{
|
|
if( gpDbgPointers ){
|
|
pIniJob->pvRef = gpDbgPointers->pfnAllocBackTrace();
|
|
}
|
|
}
|
|
|
|
VOID
|
|
DbgJobFree(
|
|
PINIJOB pIniJob
|
|
)
|
|
{
|
|
if( pIniJob->pvRef ){
|
|
gpDbgPointers->pfnFreeBackTrace( (HANDLE)pIniJob->pvRef );
|
|
}
|
|
}
|
|
|
|
VOID
|
|
DbgJobDecRef(
|
|
PINIJOB pIniJob
|
|
)
|
|
{
|
|
HANDLE hBackTrace = (HANDLE)pIniJob->pvRef;
|
|
|
|
SPLASSERT(pIniJob->cRef);
|
|
pIniJob->cRef--;
|
|
|
|
if (!hBackTrace) {
|
|
return;
|
|
}
|
|
|
|
gpDbgPointers->pfnCaptureBackTrace( hBackTrace,
|
|
pIniJob->cRef+1,
|
|
pIniJob->cRef,
|
|
0 );
|
|
}
|
|
|
|
|
|
VOID
|
|
DbgJobIncRef(
|
|
PINIJOB pIniJob
|
|
)
|
|
{
|
|
HANDLE hBackTrace = (HANDLE)pIniJob->pvRef;
|
|
|
|
pIniJob->cRef++;
|
|
|
|
if (!hBackTrace) {
|
|
return;
|
|
}
|
|
|
|
gpDbgPointers->pfnCaptureBackTrace( hBackTrace,
|
|
pIniJob->cRef-1,
|
|
pIniJob->cRef,
|
|
0 );
|
|
}
|
|
|
|
#endif // def DEBUG_JOB_CREF
|
|
|
|
|
|
|
|
#ifdef DEBUG_PRINTER_CREF
|
|
|
|
#undef DbgPrinterInit
|
|
#undef DbgPrinterFree
|
|
#undef DbgPrinterDecRef
|
|
#undef DbgPrinterIncRef
|
|
|
|
VOID
|
|
DbgPrinterInit(
|
|
PINIPRINTER pIniPrinter
|
|
)
|
|
{
|
|
if( gpDbgPointers ){
|
|
pIniPrinter->pvRef = gpDbgPointers->pfnAllocBackTrace();
|
|
}
|
|
}
|
|
|
|
VOID
|
|
DbgPrinterFree(
|
|
PINIPRINTER pIniPrinter
|
|
)
|
|
{
|
|
if( pIniPrinter->pvRef ){
|
|
gpDbgPointers->pfnFreeBackTrace( (HANDLE)pIniPrinter->pvRef );
|
|
}
|
|
}
|
|
|
|
VOID
|
|
DbgPrinterDecRef(
|
|
PINIPRINTER pIniPrinter
|
|
)
|
|
{
|
|
HANDLE hBackTrace = (HANDLE)pIniPrinter->pvRef;
|
|
|
|
SPLASSERT(pIniPrinter->cRef+1);
|
|
|
|
if (!hBackTrace) {
|
|
return;
|
|
}
|
|
|
|
gpDbgPointers->pfnCaptureBackTrace( hBackTrace,
|
|
pIniPrinter->cRef+1,
|
|
pIniPrinter->cRef,
|
|
0 );
|
|
}
|
|
|
|
|
|
VOID
|
|
DbgPrinterIncRef(
|
|
PINIPRINTER pIniPrinter
|
|
)
|
|
{
|
|
HANDLE hBackTrace = (HANDLE)pIniPrinter->pvRef;
|
|
|
|
if (!hBackTrace) {
|
|
return;
|
|
}
|
|
|
|
gpDbgPointers->pfnCaptureBackTrace( hBackTrace,
|
|
pIniPrinter->cRef-1,
|
|
pIniPrinter->cRef,
|
|
0 );
|
|
}
|
|
|
|
#endif // def DEBUG_PRINTER_CREF
|
|
|
|
|
|
#ifdef DEBUG_STARTENDDOC
|
|
|
|
HANDLE ghbtStartEndDoc;
|
|
|
|
VOID
|
|
DbgStartEndDoc(
|
|
HANDLE hPort,
|
|
PINIJOB pIniJob,
|
|
DWORD dwFlags
|
|
)
|
|
{
|
|
if( !ghbtStartEndDoc ){
|
|
|
|
ghbtStartEndDoc = gpDbgPointers->pfnAllocBackTraceFile();
|
|
|
|
if( !ghbtStartEndDoc ){
|
|
|
|
SPLASSERT( FALSE );
|
|
return;
|
|
}
|
|
}
|
|
|
|
gpDbgPointers->pfnCaptureBackTrace( ghbtStartEndDoc,
|
|
(DWORD)hPort,
|
|
(DWORD)pIniJob,
|
|
dwFlags );
|
|
}
|
|
|
|
#endif
|