65.9K
CodeProject 正在变化。 阅读更多。
Home

扩展跟踪:Win32 的跟踪宏

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.95/5 (9投票s)

2001年4月24日

2分钟阅读

viewsIcon

166770

downloadIcon

1676

提供带有源代码链接、运行时调用堆栈信息以及参数值的函数原型信息的跟踪宏

Sample Image - ExtendedTrace.gif

概述

扩展跟踪是为 Win32 提供的大量有用跟踪的集合,例如

  • TRACE(...) 在 Win32 中的实现。
  • 带有源代码链接的消息。只需在“输出”窗口中双击消息,即可跳转到源代码。
  • 函数参数。想知道您的函数使用什么参数调用吗?只需调用一个简单的宏,它会将您的函数原型和实际参数值跟踪到“输出”窗口。
  • 调用堆栈信息。您可以跟踪调用堆栈,其中包含函数原型和参数值。就像 Visual Studio 调用堆栈窗口一样,但这是在运行时。

用法

ExtendedTrace.cpp 添加到您的项目中,并将 ExtendedTrace.h 包含到您的源文件中。

EXTENDEDTRACEINITIALIZE( IniSymbolPath )

初始化符号信息。IniSymbolPath 是符号文件的搜索路径。内置路径为“.;%_NT_SYMBOL_PATH%;%_NT_ALTERNATE_SYMBOL_PATH%;%SYSTEMROOT%;%SYSTEMROOT%\System32;”。IniSymbolPath 将添加到内置路径中。IniSymbolPath 可以为 NULL

EXTENDEDTRACEUNINITIALIZE()

释放符号信息。

SRCLINKTRACECUSTOM( Msg, File, Line)

将消息(Msg) 写入带有指向文件(Line) 的链接的“输出”窗口。

SRCLINKTRACE( Msg )

将消息(Msg) 写入带有指向其源代码的链接的“输出”窗口。

FNPARAMTRACE()

将带有参数的函数原型写入“输出”窗口。您可以在任何时候在函数中调用此函数。

STACKTRACEMSG( Msg ), STACKTRACE(), THREADSTACKTRACEMSG( hThread, Msg ), THREADSTACKTRACE( hThread )

将带有函数原型和参数值的调用堆栈转储到“输出”窗口。转储的调用堆栈元素带有源代码链接,因此您可以直接跳转到它们。

TRACEF(...)

与 MFC 的 TRACE(...) 相同

注意:如果您只使用 TRACEF(...) SRCLINKTRACExxx(...) 宏,则不需要 EXTENDEDTRACEINITIALIZE(...)/EXTENDEDTRACEUNINITIALIZE

示例

#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;
}

“输出”窗口中的输出

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

尽情享用!

许可证

本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。

作者可能使用的许可证列表可以在此处找到。

© . All rights reserved.