崩溃报告器

虚幻引擎中收集崩溃信息的应用程序。

Windows
MacOS
Linux

"崩溃报告器(Crash Reporter)"程序套件用于捕捉和分析公司内部和外部最终用户的应用程序崩溃。

要求

  • 安装了MVC3的Visual Studio 2012

  • 具有.NET40支持的IIS服务器

  • 满足网站需要的SQL数据库

概览

  • 发生崩溃后,该应用程序会生成Windows错误报告风格的报告,将它们加入待上传的队列,然后启动CrashReportUploader。

  • 然后,CrashReportUploader将劫持这些报告并将它们上传至所需的服务器,而不是将它们留在系统上以便系统将它们转发至Windows错误报告。它也可以选择性地启动CrashReportInput,以允许用户输入描述。

  • CrashReportReceiver驻留在DMZ中,它接受这些报告并将它们写入安全的位置。

  • CrashReportProcessor将监视此安全位置,并在有新报告写入时处理这些崩溃报告。

  • 然后,CrashReportWebsite将显示处理后的报告,以便QA可以进行分析并采取行动。

详细的API文档存储在Perforce中:/Engine/Source/Programs/CrashReporter/CrashReportHelp/bin/Development/CrashReportHelp.chm

生成崩溃报告

  • NewReportCrash()创建报告并启动CrashReportUploader

报告中包含Windows错误报告元数据、崩溃的小型转储、当前日志以及最新使用情况视频文件(可选)。如果希望,可在AddMiscFiles()中添加任意文件,并且除在服务器上的处理程序中以外, 无需进行其他更改。此新样式的Windows错误报告添加在Windows Vista中,因此,如果需要XP支持,则应注意。

上传崩溃报告

  • /Engine/Binaries/DotNET/CrashReportUploader.exe.config中包含配置属性。

    • "CrashReportUploadURL" - 要将崩溃发送至的CrashReportReceiver的URL。

    • "UploadHistory" - 向后搜索崩溃的天数。

    • "LocalDomain" - 协助本地符号查找启发法的域。

此应用程序搜索过去"UploadHistory"天的所有相关崩溃,然后将它们上传至"CrashReportUploadURL"。由于此应用程序不需要来自引擎的任何直接输入,所以它是无状态的;它可以作为独立应用程序运行, 它所发现的和所上传的完全一样。如果由于URL不可用等任何原因导致上传失败,将重新尝试再次启动上传程序。无需任何参数,但是不能更改 -unattended-logfolder=<文件夹名称> 命令行选项。

发现崩溃报告的方法是搜索与 SpecialFolder.LocalApplicationData\Microsoft\Windows\WER\ReportQueue\AppCrash_UE4-* 模式匹配的任何文件夹。这些文件夹具有Guid,可用于确定报告是否已上传。

为处理本地编译的二进制文件,上传程序检查它是否具有pdb以及是否在本地域上运行。如果满足这两个条件,将运行MinidumpDiagnostics.exe以生成报告,报告中将包括调用堆栈。然后,它将作为 报告的一部分上传。

然后,上传程序选择性地启动CrashReportInput.exe,以允许用户输入对于崩溃发生时所执行的操作的描述。

接收崩溃报告

  • /Engine/Binaries/DotNET/CrashReportReceiver.exe.config中包含配置属性。

    • "CrashReportRepository" - 安全文件夹,用于存储传入的崩溃报告。

该Web服务驻留在DMZ中的服务器上,可通过"CrashReportUploadURL"从任意位置访问。与所有可外部访问的服务器一样,它被强力锁定,仅允许最低限度的访问。它执行基本拒收检查,然后 将文件接收至安全位置中的临时文件夹。接收完所有文件之后,将重命名该文件夹,以使处理程序能够检测到它。此安全位置当前为NFS驱动器,也可以在内部网络上访问它。

报告文件夹具有嵌入式Guid(例如,"AppCrash_UE4-FortniteGame_a50cecbc1f087cac2543eb9f04823bbb548b119_cab_17bf8494"),可用于防止重复上传报告。

为进行更详细的剔除,将解析Windows错误报告元数据。当前,它拒收来自调试构建版本以及MinidumpDiagnostics(由于它无法同步自身)的崩溃。

处理崩溃报告

  • /Engine/Binaries/DotNET/CrashReportProcess.exe.config

    • "ReportLandingZone" - 新报告到达的安全文件夹。

    • "ProcessedReports" - 处理后的崩溃数据流向的位置,可供网站访问。

    • "DaysToSunsetReport" - 保留空文件夹以抑制重复报告上传的天数。

    • "DepotRoot" - 我们使用Perforce作为符号服务器,并调用存储在常规仓库(例如,MinidumpDiagnostics)中的实用程序。包含相关的二进制文件和符号的clientspec的根位于此处。

    • "CrashReportWebSite" - 用于调用Web服务的崩溃报告网站的URL。

    • "ProcessedVideos" - 处理后的视频的位置。由于这些视频可能较大,它们与处理后的报告中的一般文件分开存储。

崩溃报告处理程序是一个服务,它监视安全位置(ReportLandingZone)以发现新报告。由于NFS不支持目录监视,因此该服务的速度比较慢。该服务查找相关文件, 必要时针对小型转储调用MinidumpDiagnostics,然后调用Web服务来将崩溃添加到数据库中。返回的ID将用于命名数据文件,以便网站能够轻松访问它们。将删除剩下的文件, 仅保留文件夹名称。由于架构的性质,x64调用堆栈遍历需要二进制映像,因此要支持源头为系统dll的崩溃的x64小型转储调用堆栈遍历,需要同步到Microsoft符号服务器。

MinidumpDiagnostics从小型转储的模块列表中提取版本号,然后用它来从Perforce同步正确的二进制文件、符号和源。然后会使用与WinDbg相同的技术对调用堆栈进行求值,并将信息尽可能全部 写入Diagnostics.txt。

clientspec并非需要所有内容才能进行符号查找,但它确实需要二进制文件、符号和源。对于UE4分支,我们使用此模板:

"//depot/UE4/Engine/...//CLIENT/UE4/Engine/..."
"//depot/UE4/*/Binaries/...//CLIENT/UE4/*/Binaries/..."
"//depot/UE4/*/Source/...//CLIENT/UE4/*/Source/..."

在网站中显示崩溃报告

此网站会显示崩溃及崩溃组,可在其中对它们进行排序、搜索和过滤。

基本显示形式是按用户组(例如,"EngineQA"、"GameQA"和"Coder"等)分类的崩溃列表。可以选择崩溃ID来查看崩溃细节、日志、小型转储以及视频(如有)。 单击"CrashGroups"可以以按调用堆栈模式分类的方法查看崩溃。可以选择崩溃组ID来查看细节以及与崩溃组关联的所有崩溃的列表。崩溃组的更新方式是 每十分钟在SQL服务器上运行一次"UpdateCrashesByPattern"存储过程。

设置数据库

运行创建脚本/Engine/Source/Programs/CrashReporter/DatabaseDefinition/CreateCrashReporterDatabase.sql,并在SQL服务器上设置一个作业,以每十分钟运行一次"UpdateCrashesByPattern"存储过程。方法是设置一个SQL 服务器代理作业来运行执行上述存储过程的"运行更新脚本"。

设置网站

网站在IIS7.0下运行,使用MVC3和.NET40。添加两个虚拟目录:一个用于处理后的文件,另一个用于处理后的视频。应将它们命名为"CrashReporterFiles"和"CrashReporterVideos", 并将它们映射到报告处理程序设置中"ProcessedReports"和"ProcessedVideos"的物理位置。应用程序池需要作为具有从虚拟目录读取文件的权限的用户运行。

映射"内部"用户和计算机

RegisterPII应用程序将来自Windows错误报告的匿名计算机Guid映射到已知的用户和计算机名。只能针对需要更轻松地追踪崩溃的开发者运行它,因为为最终用户收集此类数据是不合法的。 PII代表个人身份信息(Personally Identifiable Information),可在http://en.wikipedia.org/wiki/Personally_identifiable_information中查看它的说明

欢迎帮助改进虚幻引擎文档!请告诉我们该如何更好地为您服务。
填写问卷调查
取消