当在软件发布后收到大量错误报告时,在数百个报告中,可能只有几个不同的问题,而其他报告只是重复了有关这些问题的信息。在 Visual Studio 或 WinDbg 中手动打开这么多报表并分析它们的内容可能会浪费很多时间。

自动处理错误报告的最简单方法是安装 CrashFix web 应用程序。CrashFix 服务器允许轻松地接收、存储、组织和分析由您的 C++ 应用程序发送的崩溃报告。

CrashFix 服务器是一个基于 web 的崩溃报告分析软件,你可以从 http://crashfix.sourceforge.net/ 这里下载它。

1.配置 CrashRpt 向 CrashFix 服务器发送错误报告

下面讲述如何配置 CrashRpt 向 CrashFix 服务器发送崩溃报告:

  • 用要存储崩溃报告的项目的名称设置 pszAppName 字段(你应该在 CrashFix web 应用程序中创建一个新项目)。例如,如果您已经创建了一个名叫 “MyApp” 项目,那么将 pszAppName 字段设置为值 “MyApp”。
  • 用应用程序的版本设置 pszAppVersion 字段。例如,如果 “MyApp” 项目的当前版本是 “v.1.0.0”,则将 pszAppVersion 字段的值设为“1.0.0”。
  • 使用以下 URL 地址设置 pszUrl 字段:http://example.com/crashfix/index.php/crashReport/uploadExternal。在上面的示例中,将 example.com 服务器名替换为你自己的 CrashFix 服务器地址。
  • 设置 uPriorities 字段:

    info.uPriorities[CR_HTTP] = 1;                      // Use HTTP.
    info.uPriorities[CR_SMTP] = CR_NEGATIVE_PRIORITY;   // Not use SMTP.
    info.uPriorities[CR_SMAPI] = CR_NEGATIVE_PRIORITY;  // Not use Simple MAPI.  
  • 对于 dwFlags 字段,添加标志: CR_INST_HTTP_BINARY_ENCODING
  • 该结构的其他字段可以根据你的选择配置。

下面是代码示例:

CR_INSTALL_INFO info;

memset(&info, 0, sizeof(CR_INSTALL_INFO));
info.cb = sizeof(CR_INSTALL_INFO);  
info.pszAppName = _T("MyApp");     // Define application name.
info.pszAppVersion = _T("1.0.0");  // Define application version.
// URL for sending reports over HTTP.                   
info.pszUrl = _T("http://example.com/crashfix/index.php/crashReport/uploadExternal");         
// Define delivery transport priorities. 
info.uPriorities[CR_HTTP] = 1;                     // Use HTTP.
info.uPriorities[CR_SMTP] = CR_NEGATIVE_PRIORITY;  // Not use SMTP.
info.uPriorities[CR_SMAPI] = CR_NEGATIVE_PRIORITY; // Not use Simple MAPI.  
// Define flags.
info.dwFlags = 0;                    
// Install all available exception handlers.
info.dwFlags |= CR_INST_ALL_POSSIBLE_HANDLERS; 
// Use binary encoding for HTTP uploads (recommended).    
info.dwFlags |= CR_INST_HTTP_BINARY_ENCODING;  

2.在 Windows 中安装 CrashFix

2.1.系统需求

安装和使用 CrashFix,需要满足以下系统要求:

  • Windows操作系统(Windows Vista或更高版本)。
  • Apache HTTP服务器(版本2.2或更高)。
  • PHP(版本5.3或更高版本)。
  • 数据库(MySQL)。
  • 2 GB 的可用磁盘空间(用于存储崩溃报告和符号)。
  • 网络连接(LAN或Internet)。

2.2.安装 Apache + PHP + 数据库

这个非常简单,直接下载 XAMPP 获取 宝塔 就可以,我习惯用的是 XAMPP。

2.3.配置 MySQL

现在我们需要创建一个新的数据库 schema 来存储 CrashFix 表。在 MySQL 客户端窗口中键入以下内容:

CREATE SCHEMA crashfix; -- 在MySQL中 CREATE SCHEMA 和 CREATE DTATBASE 一样的

接下来,创建一个名为 crashfix 的数据库用户,CrashFix web 应用程序将使用该用户连接到数据库。要创建用户,输入以下命令(在下面的命令中,将<your_password>占位符替换为你的密码):

GRANT ALL PRIVILEGES ON crashfix.* TO 'crashfix'@'localhost' IDENTIFIED BY '<your_password>';

上面的命令创建名为“crashfix”的用户,并授予该用户在“crashfix”数据库模式上的所有特权。

安装 CrashFix

CrashFix web 应用程序是一个用 PHP 编写的 web 程序。用户可以访问 CrashFix 并执行管理和日常使用任务。

在安装完 Apache HTTP server + PHP + database (MySQL) 后,从下载页面(点我)下载 CrashFix web 应用程序压缩文件。然后解压到 web 服务器的文档根(root)目录。

编辑 DOCUMENT_ROOT/crashfix/protected/config/user_params.ini 配置文件,并指定正确的数据库连接字符串、登录名和密码。有关配置文件字段及其含义的其他信息,请参考配置文件中的注释行。

配置完成后你可以尝试在 web 浏览器中打开 CrashFix web 应用程序。在浏览器的导航栏中输入 ”http://localhost/crashfix/indexphp“,然后回车。然后你应该在浏览器中看到以下内容(见下图)。

如果不是像上图那样的页面,你看到 PHP 警告 'date():依赖系统的时区设置是不安全的',那么你需要编辑配置文件 php.ini 中的时区参数 date.timezone,指定你的时区,例如:

date.timezone = UTC

修改完后不要忘记重启 Apache webserver。

2.4.初始化 CrashFix 数据库

最后,在使用 web 应用程序之前,必须创建并初始化 CrashFix 数据库表。这是由数据库迁移机制执行的。初始化数据库表,在终端命令行提示符中运行以下命令:

php DOCUMENT_ROOT/crashfix/protected/yiic.php migrate

CrashFix 的初始登录账号是: root,密码是:rootpwd

2.5.安装 CrashFix 服务

CrashFix 服务是一个长时间运行的应用程序,它持久存在于后台并处理传入的崩溃报告文件。首先,从我们的下载页面(点我)下载 CrashFix service installer (EXE)。点击页面上的 CrashFix v.1.0.4 文件夹即可看到。

下载完成后点击安装,按引导完成安装,安装完成后程序目录的结构如下:

C:\Program Files (x86)\CrashFix\
    bin\crashfixd.exe         | The CrashFix service executable file
    conf\crashfixd.conf       | The CrashFix service configuration file
    logs                      | The directory where CrashFix service places its log files

这里需要配置 confcrashfixd.conf 文件的 WEB_ROOT_DIR 参数,否则打开 http://localhost/crashfix/index.php 的时候可能报 CrashFix Service is Inactive 错误。

2.6.安装 CrashFix 调试信息上传工具

CrashFix 调试信息上传工具是一个 Windows 应用程序,允许用户上传他们的调试信息(符号)文件到 CrashFix 服务器。从下载页面下载 CrashFix 上传工具压缩文件(还是上面的那个链接)。然后将存档解压到您选择的目录,主要包含以下两个文件。

  • uploader_gui.exe - GUI version of the tool
  • uploader.exe - console version of the tool

要获得可用上传器命令的帮助,可以使用命令uploader.exe --help

默认情况下,PHP 不允许上传大文件(大于 2 MB)。为了上传大型符号文件,您可能需要编辑 php.ini 配置文件并修改 post_max_sizeupload_max_filesize 参数。通常情况下,将这些文件设置为 100 MB 就足够了(如果您打算上传大到 1 GB 的 PDB 文件,最好将这些文件设置为 1024 MB)。不要忘记在编辑配置文件后重启Apache webserver。

常见问题

CrashFix Service is Inactive

打开 http://localhost/crashfix/index.php 登录后报 CrashFix Service is Inactive 错误,则可能是没有配置 CrashFix 服务的配置文件 confcrashfixd.confWEB_ROOT_DIR 参数,根据实际情况配置即可。

上传 500 错误

客户端上报崩溃文件的时候报 500 错误,通过查看 DOCUMENT_ROOT/crashfix/protected/runtime/application.log ,发现这里提示 2020/12/11 02:31:35 [error] [php] count(): Parameter must be an array or an object that implements Countable (D:\xampp\htdocs\crashfix\protected\framework\db\ar\CActiveFinder.php:1430)

将这一行改为如下内即可:

if(count($fks)!==count(array($pkTable->primaryKey)))

无法分析 Crash Reports

如果遇到无法分析 Crash Reports,并且 Report 的状态一直是 Waiting,这时候要查看日志文件,

  • DOCUMENT_ROOT/crashfix/protected/runtime/application.log
  • DOCUMENT_ROOT/crashfix/protected/runtime/console.log
  • CrashFixlogserror.log
  • CrashFixlogsmonitor.log

CrashFixlogserror.log 中发现错误Polling thread has encountered an error when executing PHP script 'php "D:\xampp\htdocs\crashfix/protected/yiic.php" poll'; execution time = 0.00 sec; error code = -1.

CrashFixlogsmonitor.log 中发现错误 Error 1. CrashFix web application is not installed or not configured correctly. Please check %CRASHRPT_DIR%/protected/runtime/console.log file for diagnostics information

这时如果确信 WEB_ROOT_DIR 参数是正确的,则可能是因为 php.exe 没有咋环境变量中,将 php 路径添加到环境变量中即可。

无效 PDB 文件

如果在 Debug Info 页面上传 PDB 文件发生 invalid pdb file 错误或 PDB 文件被标记为 invalid,这是因为 CrashFix 对新版本的 Visual Studio 不适配造成的,你需要在 https://github.com/xyzz/CrashFix 这个 Github 仓库下载修复版重新编译部署即可。

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

添加新评论