又一个 Win32 运行时跟踪






2.23/5 (7投票s)
2006年11月8日
3分钟阅读

26763

158
一篇关于运行时跟踪工具的文章,
引言
开发复杂的应用程序需要花费大量时间来修复错误。即使在您认为一切正常并进入最终发布后,该软件也可能会抛出一些在调试时不可见的意外错误。因此,开发人员应该再次使用所有可用的工具和仪器来找出问题所在。
运行时项目跟踪是简单而有用的东西之一,它允许我们查看实际发生的事情 - 死锁、竞争和其他智能错误。 :-)
我在这里展示了一个易于使用的运行时跟踪工具,它可以编译到您自己的 C++ 项目中。只要您愿意,它允许您使用 Release 二进制文件并仍然获得运行时跟踪。然后只需重新构建您的项目即可清除所有运行时跟踪。这样,您将减少代码大小并提高应用程序的执行速度。
从现在起,您将能够忘记注释数十行运行时跟踪运算符!
背景
- 我如何使用 '
fprintf
' 风格的格式化调试日志? - 当错误返回时,我将如何从源代码中删除(注释掉)这些行,然后再将它们添加回去?
- 我应该使用什么日志文件名约定来为另一个项目获取不同的日志,而无需编辑代码?
这些问题和其他问题现在都有积极的答案。让我们看一下代码!
Using the Code
要使用代码,您应该执行以下步骤
- 将这些文件添加到您的 C++ 项目中:DbgLogger.cpp, DbgLogger.h, DbgLoggerCfg.h
- 在调试包含语句下添加到 .cpp 文件中:
#include "DbgLogger.h"
- 使用 '
fprintf
' 风格的运算符DBG_PRN(.);
进行跟踪(当然,使用格式说明符和参数,而不是点)
DbgLoggerCfg.h 已准备好用于运行时跟踪。当您决定清除跟踪语句时,您只需注释掉 #define DBG_INFO
行,然后重新构建您的项目即可。可以使用 Unicode 字符跟踪。查找 #define DBG_INFO_WCHAR
行。
描述的最后一件事,但也是最重要的一件事 - 您应该在哪里查找最近创建的日志文件?
日志文件位于常见的 Windows 应用程序路径下:C:\Documents and Settings\<您的登录名>\Local Settings\Application Data\<您的应用程序名称>\Log\<您的应用程序名称>.log。
下一个示例显示了典型的运行时跟踪用法
#include "stdafx.h"
#include "DbgLogger.h"
int _tmain(int argc, _TCHAR* argv[])
{
void* aPtr = (void*)argv[0];
DBG_PRN(
" String = '%s'\n"
" Integer = '%d'\n"
" HexItegerString = '0x%04X'\n"
" Pointer = '%p'\n\n",
"This is the String",
(int)321,
(int)321,
aPtr
);
return 0;
}
幕后
源代码已包含。让我们看一下它。
代码的主要部分是模板类,它允许使用 char
或 wchar_t
作为基本字符串项,并导出 void Out( const CharType* pFmt, ... )
函数。
template< class CharType >
class DbgLogger
{
//
// some lines were skipped here for clarity
//
public:
void Out( const CharType* pFmt, ... )
{
//
// some lines were skipped here again for clarity
//
}
};
#define DBG_PRN g_db.Out
行允许我们像使用普通函数一样使用全局类成员函数。
从二进制文件中清除允许使用 #define DBG_PRN( A ) ;
和 #pragma warning (disable:4002)
。最后一个只是关闭烦人的编译器警告消息。
关注点
本文描述了一些预处理器技巧,这些技巧使我们可以使项目调试更加容易。
许可证
本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。
作者可能使用的许可证列表可以在此处找到。