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

使用 BugTrap 捕获所有错误!

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.34/5 (84投票s)

2006 年 6 月 29 日

MIT

5分钟阅读

viewsIcon

2003479

downloadIcon

9119

一个能够捕获未处理的错误和异常,并将错误报告发送到远程支持服务器的工具

此版本有什么新内容?

  • 64 位支持 - BugTrap 现在原生支持 Win64
  • 多显示器支持 - BugTrap 可以捕获多个显示器的截图
  • 其他增强功能 - 自上次更新以来,添加了大量功能/选项。详情请参阅应用历史记录

引言

不久前,我正在开发一个具有相当复杂逻辑的多层应用程序。该应用程序处理医疗信息,并且在所有情况下都能正确同步数据非常重要。我添加了额外的代码,使应用程序尽可能稳定,并添加了自动备份和自我恢复功能。您认为这解决了所有问题吗?

不,我仍在寻找一个工具来远程处理客户遇到的问题。如果我住在地球的另一边,我该如何帮助他们并调试问题?最终,我发现了 Jim Crafton 关于一个能够拦截未处理错误的工具的出色 文章。这才是解决方案!

不幸的是,原始的 black-box 不可定制,不支持 mini-dump 文件或 Unicode 字符串,也没有任何服务器。尽管存在这些限制,它还是一个很好的起点,因为我确切地知道我想要什么样的工具。我开始着手开发自己的工具,希望使其变得灵活、可定制,并成为一个强大的解决方案。

概述

通常,收到客户关于您的程序无法正常工作的消息会非常令人沮丧。大多数用户可能不会告诉您应用程序中有什么错误以及哪部分代码出了问题。Windows 有一个内置的未处理错误处理程序,但是,当错误发生在客户端时,这个默认处理程序可能无用,因为您通常不希望将错误报告发送给 Microsoft。

Default Win32/64 error handler

BugTrap 通过覆盖默认错误处理程序来解决此问题。BugTrap 收集错误详细信息,如地址、调用堆栈和计算机环境。还可以使用内置或外部日志记录函数,将任意数量的自定义日志文件添加到默认错误报告中,以获取更多信息。

BugTrap 可以将错误报告保存在磁盘上,或通过电子邮件、HTTP 或快速的低级 TCP 网络协议自动将错误报告发送到开发者的计算机。BugTrap 服务器自动管理错误报告存储库,并通知开发者任何新错误。

Network diagram

BugTrap 将错误描述存储在日志和 mini-dump 文件中。Mini-dump 文件可以在 Microsoft Visual Studio .NET 和 WinDbg 中打开。BugTrap 包还包含一个 CrashExplorer 工具,可以从 MAP 和 PDB 文件中提取符号信息。有一个专门针对 .NET 应用程序的 BugTrap 版本(目前正在开发中)

Simplified dialog

Dialog with error details

Preview dialog

所有详细信息均可在 BugTrap 文档 中找到。文档也包含在 安装程序 中。如果您想了解 BugTrap 的工作原理,可以阅读这些文章:

为 Win32/64 应用程序添加 BugTrap 支持

BugTrap 作为动态链接库 (DLL) 进行重新分发。BugTrap DLL 提供两个版本:ANSI 版本和 Unicode 版本。

DLL 名称 字符编码
BugTrap.dll ANSI 多字节字符字符串
BugTrapU.dll Unicode 字符串

下面的代码为 Win32/64 应用程序添加 BugTrap 支持

#include "BugTrap.h"

#pragma comment(lib, "BugTrap.lib")      // Link to ANSI DLL
// #pragma comment(lib, "BugTrapU.lib")  // Link to Unicode DLL

static void SetupExceptionHandler()
{
    BT_SetAppName(_T("Your application name"));
    BT_SetSupportEMail(_T("your@email.com"));
    BT_SetFlags(BTF_DETAILEDMODE | BTF_EDIETMAIL);
    BT_SetSupportServer(_T("localhost"), 9999);
    BT_SetSupportURL(_T("http://www.your-web-site.com"));
}

SetupExceptionHandler() 函数可以根据您的应用程序类型从 InitInstance()main() 调用。

当您的应用程序遇到问题时,BugTrap 会提示用户将错误报告提交给 BugTrap 服务器。错误报告包含用户环境的许多详细信息。报告还包含导致问题的调用的完整堆栈跟踪。

使用 BugTrap,您可以通过两种不同的方法来调试问题。

1. 您可以在 Visual Studio 中打开事后 mini-dump 文件

Minidump file in Visual Studio

2. 您可以使用内置的 CrashExplorer 工具

在构建堆栈跟踪时,BugTrap 会搜索 PDB 文件——一个包含调试信息的文件。如果该文件可用,BugTrap 就可以在每个地址旁边显示函数名称和行号。显然,PDB 文件使堆栈跟踪更加美观,但大多数开发者不愿将 PDB 文件分发给最终用户,因为 PDB 文件可能会简化程序的逆向工程。

因此,BugTrap 不需要用户计算机上有 PDB 文件。相反,它将原始函数地址保存在日志中。

Dialog with no source information

所以,最终用户对这些十六进制数字背后的含义一无所知。

CrashExplorer 会根据 PDB/MAP 文件和日志中的地址,恢复所有函数名称和行号。

CrashExplorer restores function names and lines numbers from MAP or PDB file

为 .NET 应用程序添加 BugTrap 支持

.NET 版本的 BugTrap 作为托管库:BugTrapN.dll 进行重新分发。该 DLL 由托管代码和非托管代码组成。这样的设计使 BugTrap 能够支持纯托管的 .NET 程序集以及可能抛出托管 .NET 异常和本机 Win32/64 异常的混合 C++ 程序集。

BugTrap for .NET 同时公开了托管和非托管(本机)接口。C# 或 VB.NET 代码可以访问托管接口。

ExceptionHandler.AppName = "Your application name";
ExceptionHandler.Flags = FlagsType.DetailedMode | FlagsType.EditMail;
ExceptionHandler.DumpType = MinidumpType.NoDump;
ExceptionHandler.SupportEMail = "your@email.com";
ExceptionHandler.SupportURL = "http://www.your-web-site.com";
ExceptionHandler.SupportHost = "localhost";
ExceptionHandler.SupportPort = 9999;

本机 Win32/64 代码可以访问非托管接口,这在前面已经讨论过。可以在同一个应用程序中使用任何接口,甚至可以同时使用两个接口。

更新

我会定期修复错误并添加新功能。这些更新的频率取决于您的反馈。您可以在 https://github.com/bchavez/BugTrap 查看最新更新。所有主要更新都已提交给 The Code Project

构建说明

大多数开发者可以继续下载 安装程序 - 它会安装所有必要的文件和组件。但是,有些专业人士喜欢从头开始构建所有组件。这些开发者可以从 这里 下载 BugTrap 源代码。

我一直在努力使 BugTrap DLL 尽可能小巧。因此 BugTrap DLL 不使用 MFC/ATL/WTL。我使用的是纯 C 和 C++。特别是,您会发现我自己的库中的一些类:集合类、IO 流、内置 XML 解析器等。BugTrap DLL 依赖于 zlib。为了简化构建,我已经将其包含在存档中。

CrashExplorer 依赖于 STL、BoostWTL。这两个库都必须预先安装在您的计算机上。

谢谢!

我非常感谢你们的支持、帮助、贡献,甚至是我从你们那里收到的简单反馈。没有这些,BugTrap 就无法满足现代软件的需求。

就是这样!祝您愉快地捕获 Bug ;-)

© . All rights reserved.