Windows接入指引
本文是介绍Windows SDK使用的详细文档,包含了基本的接入流程和高级的接口使用介绍。本文档适用于2.2.1及以上版本,如果您正在使用低版本,推荐尽快升级。 查看版本的方法见查看dll版本号。
如果想快速接入,验证平台和SDK功能,建议查看项目菜单中的“接入指南”。引导中已经按项目具体的信息(平台,引擎,国内/海外,AppID)生成了针对此项目的初始化代码,可以直 接复制使用。如下图所示:
项目创建:公司外部项目支持自助创建项目,但有免费试用时长。公司内部项目,企业微信联系“CrashSight小助手”开通。
1 使用说明
异常捕获上报服务CrashSight SDK Windows版,接入时,游戏客户端需要自己加载异常捕获的dll,并传入用户id及游戏版本等参数。 下表中列出了国内服及海外服的web地址及上报地址。用户可以选择qq登录或者企业微信登录:
版本区分 | Web地址 | 上报地址(配置文件中需要) |
---|---|---|
国内服 | https://crashsight.qq.com | pc.crashsight.qq.com |
海外服 | https://crashsight.wetest.net | pc.crashsight.wetest.net |
PS:海外版本及国内版本完全相同,只需要修改不同上报地址就可以上报到指定区域(注意相应的appid及key也需要对应做修改,否则服务器会拒绝)
2 CrashSight组件下载
新版CrashSight主要提供64位版本,32位版本和64位版本相比除文件名称不同外,功能及用法都是一致的。
在平台成功创建项目后,在侧 边栏的“接入指南”中,可以下载到对应的SDK。如下图所示:
3 CrashSight接入
由于本SDK采用客户端直接加载dll的方式,具体接入方式如下:
-
登录web端注册项目,项目类型选择Windows,注册成功后会生成appid(如:0620edc732)
-
将提供的文件按说明放到指定位置,客户端在启动后加载同级目录下的CrashSight64.dll
-
C++中通过HINSTANCE dllDemo = LoadLibraryA("CrashSight64.dll");加载dll,其他语言使用语言对应的dll加载方式即可.
-
配置上报URL(参考代码)调用如下函数,将上报URL传递给CrashSight。 国内环境URL:pc.crashsight.qq.com 海外环境URL:pc.crashsight.wetest.net
typedef void(*CS_ConfigCrashServerUrl)(const char* crash_server_url);
- 初始化CrashSight。调用如下函数,设置CrashSight appid并初始化。
typedef void(*CS_InitWithAppId)(const char* app_id);
- 当客户端配置完成后,正常启动游戏,发现游戏进程中存在CrashSight64.dll,说明CrashSight加载启动成功。
4 CrashSight上报机制及数据字段
游戏客户端加载dll并调用导出函数后:
- 该dll会读取配置文件中的域名上报联网数据。
- 用于当dll捕获到崩溃异常时将dll生成的minidmp上报到服务端。
目前CrashSight上报的数据字段如下:
字段 | 说明 |
---|---|
userId | 用户id |
appId | 项目的注册id |
Mac | Mac地址 |
osName | 操作系统名称 |
displayCard | 显卡名称 |
Cpu | Cpu类型 |
phyMemAll | 机器内存 |
osBit | 机器位数 |
resolution | 分辨率 |
pidName | 进程名 |
bootTime | 启动时间 |
Ip | Ip地址 |
5 功能接口
5.1 错误上报
// 导入函数
typedef void(*CS_ReportException)(int type, const char* name, const char* message, const char* stackTrace, const char * extras, bool is_async, const char *error_attach_path);
CS_ReportException theReportException = (CS_ReportException)GetProcAddress(dllDemo, "CS_ReportException");
// 调用函数
theReportException(1, "name", "message", "stack", "{\"k1\":\"v1111\",\"k2\":\"v2222\",\"k3\":\"v3333\"}", true, "/path/to/your/attach/file");
// 导入函数
typedef void(*CS_ReportExceptionW)(int type, const char* name, const char* message, const char* stackTrace, const char * extras, bool is_async, const wchar_t *error_attach_path);
CS_ReportExceptionW theReportExceptionW = (CS_ReportExceptionW)GetProcAddress(dllDemo, "CS_ReportExceptionW");
// 调用函数
theReportExceptionW(1, "name", "message", "stack", "{\"k1\":\"v1111\",\"k2\":\"v2222\",\"k3\":\"v3333\"}", true, L"/path/to/your/attach/file");
(代码参考6. 参考代码)
参数 | 说明 |
---|---|
type | 默认填1即可 |
expName/expMessage | 错误名,请限制在128字节以内。(特别的,使用UE引擎,通过UTF8转码的,尽可能限制在96字符内) |
expMessage | 问题简要的说明,请限制在128字节以内。(特别的,使用UE引擎,通过UTF8转码的,尽可能限制在96字符内) |
stackTrace | 当前错误的堆栈,仅限制在2M内 |
extras | 额外信息,需以json格式传入键值对,如无额外信息填“”即可 |
is_async | 控制同步/异步上报,一般情况下填true(异步) |
error_attach_path | 附件的绝对路径,可指定一个5M以内的附件 |
需要传入带中文的路径时,请使用宽字符版本(CS_ReportExceptionW)
5.2 设置回调
// 导入函数
typedef void(*CS_SetCrashCallback)(CrashCallbackFuncPtr callback);
CS_SetCrashCallback theSetCrashCallback = (CS_SetCrashCallback)GetProcAddress(dllDemo, "CS_SetCrashCallback");
// 调用函数
theSetCrashCallback(myCallback);
参数 | 说明 |
---|---|
callback | 回调函数 |
回调函数可以是用户自己的任何函数实现方式(见5.3 回调函数),只要参数符合,声明周期一直存在,不会变为空指针即可。此处要注意的是,callback函数不可以为类成员的非静态函数,因为类成员的非静态函数默认第一个参数是‘this’
5.3 回调函数
声明导出函数
typedef void(*CrashCallbackFuncPtr)(int type, const char* guid);
参数 | 说明 |
---|---|
type | 回调的类型,目前仅有crash回调,回调类型都为1 |
guid | 长度64的唯一标识字符串,每次上报均有一个独立的字符串 |
可以通过拼接 https://{网站域名}/crash-reporting/client-report-id/{APP_ID}/{GUID}?pid={平台ID} 得到相关上报的访问URL
5.4 自定义接口日志
// 导入函数
enum LogSeverity { LogSilent, LogError, LogWarning, LogInfo, LogDebug, LogVerbose };
typedef void(*CS_PrintLog)(LogSeverity level, const char* tag, const char *format, ...);
CS_PrintLog thePrintLog = (CS_PrintLog)GetProcAddress(dllDemo, "CS_PrintLog");
// 调用函数
thePrintLog(LogSeverity.LogError, "MyTag", "%s", "myMessage");
参数 | 说明 |
---|---|
level | 日志等级 |
tag | 日志标签 |
format | 日志格式 |
args | 可变参数 |
在程序运行过程当中,可以调用该函数向SDK写入日志,在错误上报,崩溃上报时会将此日志一并上报。日志内容为1M的循环队列。
5.5 自定义KV
// 导入函数
typedef void(*CS_SetUserValue)(const char* key, const char* value);
CS_SetUserValue theSetUserValue = (CS_SetUserValue)GetProcAddress(dllDemo, "CS_SetUserValue");
// 调用函数
theSetUserValue("key", "value");
参数 | 说明 |
---|---|
key | 键 |
value | 值 |
在程序运行过程当中,可以调用该函数向SDK写入自定义KV,用于保存一些关键属性,在错误上报,崩溃上报时会将此KV一并上报。KV内容上限为1M,相同Key,不同Value会做更新。建议KV按照自定义 数据格式文档中的规范进行设置。
5.6 开启VEH异常
// 导入函数
typedef void (*CS_SetVehEnable)(bool enable);
CS_SetVehEnable theSetVehEnable = (CS_SetVehEnable)GetProcAddress(dllDemo, "CS_SetVehEnable");
// 调用函数
theSetVehEnable(true);
设置VEH异常处理状态,默认为关闭。 关闭时,仅上报未处理的异常,这个方案可以优化一些异常的捕获,例如:关闭后,会上报throw导致的崩溃(开启则不会),不会误报已经处理的坏内存访问等。需要注意的是,由于UE在引擎层面通过__try __except (宏PLATFORM_SEH_EXCEPTIONS_DISABLED相关区域)对所有的异常进行了捕获,也就不存在‘未处理的异常’。因此,在通过修改引擎代码关闭此捕获前,请打开此选项,否则会导致大量异常无法上报。