crash keys


发布于 2020-11-19


chromium里面有个crash keys的设施,可以在程序崩溃时,在dump里面附带上更多的上下文信息,来帮助我们分析定位问题。

使用

一个crash key就是一个key-value对的字符串。因为内部实现的原因,crash key使用的是静态存储,所有定义一个crash key,只能是静态变量或者全局变量。如下:

static crash_reporter::CrashKeyString<32> crash_key_one("hello");
crash_key_one.Set("world");

CrashKeyString的模板数字参数是这个CrashKeyString值的最大长度。

ScopedCrashKeyString辅助类是自动清空CrashKeyString的值,这某些临时设置值的场景下比较有用。

实现

crash keys的数据是怎么传递给崩溃处理程序crashpad的呢?

chromium通过在每个pe文件里生成一个CPADinfo的section,crashpad_info.cc,存储着CrashpadInfo的数据,每次定义一个CrashKeyString,都把它的地址和长度记录到这个section里面。

崩溃程序崩溃了,crashpad会遍历所有模块的的CPADinfo section,从中读取到对应的数据。然后在把这些数据写道dump文件的自定义stream中。

参考