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

又一个 Win32 运行时跟踪

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.23/5 (7投票s)

2006年11月8日

3分钟阅读

viewsIcon

26763

downloadIcon

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

幕后

源代码已包含。让我们看一下它。

代码的主要部分是模板类,它允许使用 charwchar_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)。最后一个只是关闭烦人的编译器警告消息。

关注点

本文描述了一些预处理器技巧,这些技巧使我们可以使项目调试更加容易。

许可证

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

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

© . All rights reserved.