扩展跟踪:Win32 的跟踪宏






4.95/5 (9投票s)
2001年4月24日
2分钟阅读

166770

1676
提供带有源代码链接、运行时调用堆栈信息以及参数值的函数原型信息的跟踪宏
概述
扩展跟踪是为 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).
尽情享用!
许可证
本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。
作者可能使用的许可证列表可以在此处找到。