这篇文章主要讨论解决 C++ 程序 Crash 崩溃收集和分析的解决方案,解决方案分为前端采集和后端分析模块,前端收集库采用 CrashRpt、后端分析库采用CrashFix。

CrashRpt 是一个轻量级的开源错误报告库,用于在 Microsoft Visual Studio IDE 中创建并在 Windows 中 运行的 C++ 应用程序。

CrashRpt 的目的是自动收集崩溃数据,并通过 Internet 将其发送给软件供应商。崩溃报告包括堆栈跟踪、崩溃类型和软件版本等数据。这些信息可以帮助软件开发人员诊断和修复导致崩溃的潜在问题。

CrashRpt 的任务是提供一套工具:

  • 处理客户端软件中的异常(关键错误);
  • 自动收集必要的错误信息并生成错误报告;
  • 通过互联网发送错误报告;
  • 简化错误报告的后处理。

1.架构概述

CrashRpt 由两种功能组成,错误报告功能和错误报告分析功能。错误报告功能与客户端软件一起分发,负责处理客户端软件中的异常,并向开发人员交付错误报告。

错误报告分析功能旨在帮助开发人员提取包含在错误报告中的数据,并简化错误报告分析。它通常位于开发人员端,而不是与客户端软件一起分发。

CrashRpt Architecture

1.1.错误报告功能

错误报告功能由两个核心模块组成:CrashRpt.dllCrashSender.exe

  • CrashRpt.dll 包含在客户端软件中处理异常的功能。
  • CrashSender.exe 包含向软件支持团队发送错误报告的功能。

这两个模块当应用程序崩溃的时候能够关闭应用程序,并在后台通过 CrashSender.exe 继续发送错误报告。

通常进程(可执行程序)在进程启动时将 CrashRpt.dll 加载到它的地址空间中。这个 CrashRpt 的单一实例在加载到进程地址空间的所有 DLL 模块之间共享。

客户端应用程序使用 CrashRpt Functions 在进程中设置一次异常处理,通常在其 main()(或WinMain())函数中设置。在多线程程序中,客户端在每个工作线程的线程过程的开始额外设置异常处理程序。有关更多信息,请参见 Using CrashRpt API

1.2.错误报告分析功能

错误报告分析的功能包括两个模块:

  • CrashRptProbe.dll 实现了API,可以用来访问错误报告数据。
  • crprober.exe是一个控制台工具,它帮助提取错误报告数据,并以人类可读的形式编写摘要。

当你从你的软件用户那里收到许多错误报告时,你将不得不花费大量的时间来打开每个报告、分析其内容并编写一些关于该报告的摘要。可能会有很多报告与同一问题相关,所以打开这样的报告不会告诉我们任何新的东西。错误报告分析功能是设计来解决这些问题。有关更多信息,请参见 Analyzing Error Reports

2.编译 CrashRpt

下载项目源码后推荐使用 CMake 生成解决方案,CMake GUI 非常简单。操作流程如下:

  • 下载 CMake(2.8或更高版本)并安装。
  • 运行 CMake (cmake-gui) 应用程序;
  • 在 “Where is the source code:” 字段中,输入CrashRp t发行版的顶级目录的路径。顶级目录及其子目录包含 CMakeLists.txt 文件,这些文件是 CMake 配置文件。
  • 在 “Where to build the binaries: ”字段中,输入要在其中生成项目文件的目录的路径。建议您也在这里输入CrashRpt 发行版的顶级目录的路径。
  • Configure 按钮。出现提示时,从列表中选择您的 Visual Studio 版本。如果一切正常,您应该会看到 “Configuring done” 的消息。
  • 在选项列表中,按您的意愿修改构建选项(注意:这些选项应该根据你项目的实际情况而修改)。

    • CRASHRPT_BUILD_SHARED_LIBS 选项控制将 CrashRpt 构建为 DLL 还是静态库 LIB。建议默认勾选此项,取消选中该选项将迫使 CrashRpt 构建静态库而不是DLLs (这相当于 Release LIB 的构建配置)。
    • CRASHRPT_LINK_CRT_AS_DLL 选项控制 CrashRpt 应该如何链接到 C run-time (CRT) 库。取消选中此选项将迫使 CrashRpt 将 CRT 链接为一个多线程静态库(这相当于 Release LIB 的构建配置)。建议您勾选此选项,这将导致将 CRT 链接为多线程 DLL。
  • 修改选项后,第二次按 Configure 按钮强制更改生效。如果一切正常,您应该会看到 “Configuring done” 的消息。
  • Generate 按钮。这将生成到您指定的目录的项目文件。如果一切正常,您应该会看到消息 “Generating done”。
  • 最后,转到在 “Where to build the binaries:” 字段中指定的目录。您应该会看到生成的 CrashRpt.sln 文件(在 Visual Studio 中打开)。

在 CrashRpt 解决方案中有以下几个项目:

  • ConsoleDemo 是一个控制台应用程序,帮助测试CrashRpt如何与控制台应用程序一起工作。
  • CrashRpt 项目包含 API 实现并提供拦截异常的功能。
  • CrashRptProbe 项目包含处理错误报告的功能。
  • CrashSender 项目包含显示GUI的功能,发送错误报告和显示错误报告发送进展。
  • crprober 是一个用于错误报告处理的控制台工具。
  • jpeg 项目包含JPEG文件管理功能。
  • libogg 项目包含OGG视频容器管理功能(与libtheora一起使用)。
  • libpng 项目包含PNG文件管理功能。
  • libtheora 项目包含OGG Theora视频编解码器功能。
  • MFCDemo 是一个 GUI 应用程序,它帮助测试 CrashRpt API 函数在基于 mvc 的应用程序中是否按预期工作。
  • minizip 项目包含ZIP文件管理功能。
  • Tests 项目包含自动化测试。
  • tinyxml 项目包含XML文件管理功能。
  • WTLDemo 是一个 GUI 应用程序,它帮助测试 CrashRpt API 函数在基于 wtl 的应用程序中是否按预期工作。
  • zlib 项目包含文件压缩功能。

要构建解决方案,选择发布构建配置并按 F7 开始构建过程。当构建完成时,可以在 bin 目录中找到 CrashRpt 可执行文件,可以在 lib 目录中找到库文件。以下文件是最重要的:

  • binCrashRptXXXX.dll - 这是CrashRpt崩溃处理模块;
  • binCrashSenderXXXX.exe - 这是崩溃报告发送器模块;
  • libCrashRptXXXX.lib - 这是 CrashRpt 导入库。

上面的 XXXX 占位符应该是 CrashRpt 的版本号。

在下篇文章中将讲述如何使用 CrashRpt API

标签: CrashRpt, CrashFix, 崩溃收集, 崩溃分析

添加新评论