Extended Trace Macros for Win32
Posted
by Zoltan Csizmadia
on March 6th, 2001
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 wonder what parameters your function was called with? Just call a simple macro, and will trace yor 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(...)
Example Usage
#include "ExtendedTrace.h"
void g ( LPTSTR )
{
// Dumps the actual call stack
STACKTRACE();
}
void f( int, int, int )
{
// What parameters was this function called with?
FNPARAMTRACE();
g( NULL );
}
int main( int, char** )
{
// Just like the TRACE(...) in MFC
TRACEF( _T("Application started at %d\n"), clock() );
// Initializes the symbol files
EXTENDEDTRACEINITIALIZE( NULL );
// Trace message with a link to this line in the source code
SRCLINKTRACE( _T("I'm calling f(...)\n") );
f( 1, 2, 3);
// Cleaning up
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).

Comments
Try this tool, It's not need modify source.
Posted by pengch on 03/31/2004 02:26amTry this tool, It's not need modify source.
It's also support stack trace in release version of the exe and dll.
Try it now. Auto Debug Tool
ReplyExcellent Utility!
Posted by Legacy on 11/04/2002 12:00amOriginally posted by: Henri Manson
Immediately usable in the Pingus game project
ReplyI want the stack trace in Release version of the exe
Posted by Legacy on 09/20/2001 12:00amOriginally posted by: Mustufa Taj
Hi
I want the stack trace in the Release version of the product.
I removed the # if(defined) DEBUG statements and got a stack trace as follows:
Ordinal6369
Ordinal4436
Ordinal4699
Ordinal4424
Ordinal5163
Ordinal5163
Ordinal5163
Ordinal5163
__imp__GetViewportExtEx@8
__imp__GetViewportExtEx@8
__imp__GetViewportExtEx@8
This is because the symbol file might not be available for Release versions.
Do you have any way by which this can work in release mode.
Thanks,
ReplyNice code, but SymInitialize fails..
Posted by Legacy on 03/16/2001 12:00amOriginally posted by: Lee Wilson
I'm using Windows 98SE and I've upgraded ImageHlp.dll to version 5.00.1678.1. However, when I do EXTENDEDTRACEINITIALIZE with a NULL, my path set, or even passing it "C:\\" as a path(which should theoretically find ALL symbols since the docs say that this is simply a root path to search), SymInitialize fails. Doing a GetLastError only tells me that "The specified module could not be found".
I've tried other stack trace code out there, but it all comes down to SymInitialize failing. Any ideas as to why SymInitialize would fail?
Reply