Extended Trace Macros for Win32

.


Click here for larger image

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(...)
Note: If you're using only TRACEF(...) or SRCLINKTRACExxx(...) macros, you don't need EXTENDEDTRACEINITIALIZE(...)/EXTENDEDTRACEUNINITIALIZE.

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).

Downloads

Download source code and demo - 7 Kb


Comments

  • Try this tool, It's not need modify source.

    Posted by pengch on 03/31/2004 02:26am

    Try 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

    Reply
  • Excellent Utility!

    Posted by Legacy on 11/04/2002 12:00am

    Originally posted by: Henri Manson

    Immediately usable in the Pingus game project

    Reply
  • I want the stack trace in Release version of the exe

    Posted by Legacy on 09/20/2001 12:00am

    Originally 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,

    Reply
  • Nice code, but SymInitialize fails..

    Posted by Legacy on 03/16/2001 12:00am

    Originally 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
Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • Hurricane Sandy was one of the most destructive natural disasters that the United States has ever experienced. Read this success story to learn how Datto protected its partners and their customers with proactive business continuity planning, heroic employee efforts, and the right mix of technology and support. With storm surges over 12 feet, winds that exceeded 90 mph, and a diameter spanning more than 900 miles, Sandy resulted in power outages to approximately 7.5 million people, and caused an estimated $50 …

  • With JRebel, developers get to see their code changes immediately, fine-tune their code with incremental changes, debug, explore and deploy their code with ease (both locally and remotely), and ultimately spend more time coding instead of waiting for the dreaded application redeploy to finish. Every time a developer tests a code change it takes minutes to build and deploy the application. JRebel keeps the app server running at all times, so testing is instantaneous and interactive.

Most Popular Programming Stories

More for Developers

Latest Developer Headlines

RSS Feeds