崩溃报告器

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

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中查看它的说明

Select Skin
Light
Dark

Welcome to the new Unreal Engine 4 Documentation site!

We're working on lots of new features including a feedback system so you can tell us how we are doing. It's not quite ready for use in the wild yet, so head over to the Documentation Feedback forum to tell us about this page or call out any issues you are encountering in the meantime.

We'll be sure to let you know when the new system is up and running.

Post Feedback