# 崩溃报告

> 工作站意外关闭时留下什么、发送什么、什么时候问你，以及开发版本带着的那两条调试命令。

崩溃报告是设置页面上**诊断**分组里唯一的一行。崩溃从不在应用倒下的过程中发送：它先被抓到一个文件里，下一次启动要么把它发出去，要么先给你看再问你一句。这一节管的就是决定走哪一条路的那个开关。这个页面需要**更改设置**权限。

## 自动发送崩溃报告 {#send-crash-reports-automatically}

| 字段 | 它是什么 | 取值 / 默认 | 效果 |
| --- | --- | --- | --- |
| 自动发送崩溃报告 | “应用崩溃时，在下次启动时不经询问直接发送报告。关闭时：先把报告显示给你，并征求你的同意。” | 开或关。默认关闭。 | 开：下一次启动悄悄把抓到的报告发出去，服务器接收之后就把它清掉。关：下一次可见的启动打开那个征求同意的窗口。 |

运行时停止期间这个页面根本不画出来（见[设置](settings)）。同样这一项在那个征求同意的窗口里也给了一次，就是“始终自动发送崩溃报告”那个复选框，在那里勾上它，这个开关就打开了。开关下面卡片写着：“要报告缺陷、提出改进建议或申请新驱动，请使用账户页面。”那个表单是[反馈](account-feedback)，因为它是用 Ganter 账户发出去的。

## 一份报告里有什么 {#what-a-report-contains}

一个没有被接住的错误把应用带倒时，全局处理器写下一个文件，也就是工作站数据根目录下的 `crash\pending-crash.json`，并且只保留最近的那一次崩溃。它里面有：

- 应用版本和 Windows 版本；
- 这个错误是在哪里被接住的（Dispatcher、AppDomain、TaskScheduler，或者一次没能走完的启动写作 Startup）；
- 异常的类型、它的消息和完整的堆栈文本，包括内层异常；
- 最新那个日志文件的最后 60 行，作为通往这次故障的上下文；
- 它发生的那一刻。

写下来之前，Windows 用户名和配置文件路径出现在哪里，就在哪里被换成 `<user>` 和 `<userprofile>`。这次清洗是一道保险，不是一份保证：自由格式的日志行里可能带着别的名字，正因如此，在任何东西离开之前，那个窗口会把整份内容显示出来。

## 下次启动时那个征求同意的窗口 {#the-consent-dialog-at-the-next-start}

开关关着的时候，崩溃之后第一次可见的启动会在外壳上打开**要发送崩溃报告吗？**：“Ganter Lab 上一次意外关闭了。发送这份报告有助于我们修复它。报告包含这个错误和最近日志的一小段。发送之前请在下面查看。”**崩溃详情**那个框显示的正是会被发出去的东西，配一个**复制**按钮，把同样这段文字放到剪贴板上（片刻之内写着“已复制”），这样你可以搜它，也可以把它交给技术支持。如果剪贴板拒绝，按钮就改写“复制未成功”，这样没发生的复制不会被当成发生了；那段文字仍留在屏幕上，可以自己选中。

| 命令 | 作用 | 什么时候变灰（情形） | 什么时候不画出来（角色） |
| --- | --- | --- | --- |
| 始终自动发送崩溃报告（复选框） | 窗口关掉时把上面那个开关打开，不管你这一次发不发这份报告。 | 运行时停止期间（提示文字写“运行时已停止”）。这个窗口属于外壳，所以这个页面不画的时候它仍然画着。 | 从不。 |
| 不发送 | 丢掉这份报告并清掉文件；不会再为它问你第二次。 | 从不。 | 从不。 |
| 发送报告 | 把它发出去。成功时给出一条“崩溃报告已发送”的通知；服务器够不着时给出“崩溃报告未发送”并带上原因，那时文件留着，你可以现在发，也可以等下次启动再被问一次。 | 从不。 | 从不。 |

藏在通知区域里的启动（随 Windows 一起启动，或者用 `--tray` 拉起）不显示这个窗口；报告等着下一次可见的启动。开关打开着的时候，发送在后台完成，没有窗口，而一台当时离线的工作站会留着文件，下次启动再试。

报告发到 Ganter 服务器的反馈 endpoint。[账户](account)页面上有 Ganter 账户登录着的时候，它就归到那个账户名下；没有账户时也照样接收。工作站不会再有别的东西离开：这里没有使用情况遥测。

## 那两条调试命令 {#the-debug-commands}

应用的开发版本在开关下面带着两个按钮；装出来的正式版本一个都没有。

| 命令 | 作用 | 什么时候变灰（情形） | 什么时候不画出来（角色） |
| --- | --- | --- | --- |
| 模拟一次崩溃（调试） | 在界面线程上抛出一个没有被接住的错误，好让抓取那条路真的写出一个崩溃文件，下一次启动就把征求同意的流程走一遍。 | 从不。 | 正式版本里没有。 |
| 抓取屏幕截图（调试） | 在进程内运行代理界面工具所用的那套截图抓取，并把结果打印在按钮下面：“已保存：`<path>`”或者“抓取失败：`<reason>`”。在没有窗口的宿主上，结果写的是抓取不可用。 | 从不。 | 正式版本里没有。 |

## 这一节不做什么 {#what-this-section-does-not-do}

这里没有日志查看器：诊断日志在[事件](events)上，在它的控制台标签页里，和详细捕获、技术支持包在一起。缺陷报告和各种申请在[反馈](account-feedback)上。崩溃文件不能从应用里编辑，而且不管是那个开关还是窗口上的发送，应用绝不会在两者都没有的情况下发出任何东西。
