Overview
Extended Trace is a collection of a lot of useful traces for Win32, such as:
TRACE(...)
implementation for Win32. - Messages with source code links. Just double click on the message in the Output Window, and jump to the source code.
- Function parameters. Are you wondering what parameters your function was called with? Just call a simple macro, and it will trace your function prototype with the actual parameter values to the Output Window.
- Call stack information. You can trace the call stack with function prototypes and parameters' values. Just like the Visual Studio Call Stack window, but this is in run-time.
Usage
Add the ExtendedTrace.cpp to your project, and include ExtendedTrace.h to your source file.
Macros
EXTENDEDTRACEINITIALIZE( IniSymbolPath )
Initialize the symbol information. IniSymbolPath
is the search path for the symbol files. The built-in path is ".;%_NT_SYMBOL_PATH%;%_NT_ALTERNATE_SYMBOL_PATH%;%SYSTEMROOT%;%SYSTEMROOT%\System32;
". IniSymbolPath
will be added to the built-in path. IniSymbolPath
can be NULL
.
EXTENDEDTRACEUNINITIALIZE()
Frees up the symbol information.
SRCLINKTRACECUSTOM( Msg, File, Line)
Write a message(Msg
) to the Output Window with a link to File(Line
).
SRCLINKTRACE( Msg )
Write a message(Msg
) to the Output Window with a link to its source code.
FNPARAMTRACE()
Write the function prototype with parameters to the Output Window. You can call this function anytime in a function.
STACKTRACEMSG( Msg ), STACKTRACE(), THREADSTACKTRACEMSG( hThread, Msg ), THREADSTACKTRACE( hThread )
Dumps the call stack with function prototypes and the parameters' values to the Output Window. The call stack elements dumped with source code links, so you can jump directly to them.
TRACEF(...)
Same as the MFC TRACE(...)
Note: If you're using only TRACEF(...)
or SRCLINKTRACExxx(...)
macros, you don't need EXTENDEDTRACEINITIALIZE(...)
/EXTENDEDTRACEUNINITIALIZE
.
Example
#include "ExtendedTrace.h"
void g ( LPTSTR )
{
STACKTRACE();
}
void f( int, int, int )
{
FNPARAMTRACE();
g( NULL );
}
int main( int, char** )
{
TRACEF( _T("Application started at %d\n"), clock() );
EXTENDEDTRACEINITIALIZE( NULL );
SRCLINKTRACE( _T("I'm calling f(...)\n") );
f( 1, 2, 3);
EXTENDEDTRACEUNINITIALIZE();
TRACEF( _T("Application ended at %d\n"), clock() );
return 0;
}
The output in the Output Window:
Application started at 578
Loaded 'D:\WINNT\system32\dbghelp.dll', no matching symbolic information found.
c:\temp\magictrace\main.cpp(28) : I'm calling f(...)
Function info(thread=0x36C) : void f(int=0x00000001,int=0x00000002,int=0x00000003)
Call stack info(thread=0x36C) :
c:\temp\magictrace\main.cpp(12) : void g(char *=0x00000000)
c:\temp\magictrace\main.cpp(19) : void f(int=0x00000001,int=0x00000002,int=0x00000003)
c:\temp\magictrace\main.cpp(30) : main(int=0x00000001,TCHAR * *=0x00522C88)
crtexe.c(338) : mainCRTStartup()
KERNEL32!0x77E87903 : SetUnhandledExceptionFilter
Application ended at 1171
The thread 0x36C has exited with code 0 (0x0).
Enjoy!
License
This article has no explicit license attached to it, but may contain usage terms in the article text or the download files themselves. If in doubt, please contact the author via the discussion board below.
A list of licenses authors might use can be found here.