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加载方式即可.
-
在初始化之前设置应用版本
typedef void(*CS_SetAppVersion)(const char *app_version);
- 配置上报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写入日志,在错误上报,崩溃上报时会将此日志一并上报。日志内容为30KB的循环队列。
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内容上限为128KB,相同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相关区域)对所有的异常进行了捕获,也就不存在‘未处理的异常’。因此,在通过修改引擎代码关闭此捕获前,请打开此选项,否则会导致大量异常无法上报。
5.7 开启额外异常捕获
// 导入函数
typedef void (*CS_SetExtraHandler)(bool extra_handle_enable);
CS_SetExtraHandler theSetExtraHandler = (CS_SetExtraHandler)GetProcAddress(dllDemo, "CS_SetExtraHandler");
// 调用函数
theSetExtraHandler(true);
设置额外的异常处理机制,默认为关闭。 开启后,可以捕获上报strcpy_s一类的安全函数抛出的非法参数崩溃,以及,虚函数调用purecall错误导致的崩溃。
5.8 自定义文件数据
崩溃/错误会携带指定目录的文件内容,一般文件内容为日志,因此该功能又称为自定义文件日志。与接口日志不同,文件日志读取指定文件,并没有限定写入文件的内容以及方法。该功能无需主动开启,只要在对应上报触发是,指定目录有文件均会进行上报。
具体的:
崩溃时,会上报CS_SetCustomLogDir接口指定的文件。
错误时,会上报CS_ReportException接口指定的文件。
5.9 主动上报崩溃
在某些情况下期望主动上报dump可以调用此函数。主要用于上报UE的Fatal错误。 (通常无需调用)
// 导入函数
typedef void (*CS_ReportCrash)();
CS_ReportCrash theReportCrash = (CS_ReportCrash)GetProcAddress(dllDemo, "CS_ReportCrash");
// 调用函数
theReportCrash();
5.10 指定日志路径
指定日志路径,需传入日志文件的绝对路径,该文件会在崩溃时上传。
// 导入函数
typedef void (*CS_SetCustomLogDir)(const char* log_path);
CS_SetCustomLogDir theSetCustomLogDir = (CS_SetCustomLogDir)GetProcAddress(dllDemo, "CS_SetCustomLogDir");
// 调用函数
theSetCustomLogDir("/path/to/your/attach/file");
// 导入函数
typedef void (*CS_SetCustomLogDirW)(const wchar_t* log_path);
CS_SetCustomLogDirW theSetCustomLogDirW = (CS_SetCustomLogDirW)GetProcAddress(dllDemo, "CS_SetCustomLogDirW");
// 调用函数
theSetCustomLogDirW(L"/path/to/your/attach/file");
| 参数 | 说明 |
|---|---|
| log_path | 日志文件路径 |
需要上传多个日志时,请使用“|”分隔路径,一次最多传入3个文件的绝对路径,不支持传入目录。单个文件最大支持20MB,大小超过20MB的文件会截取最后20MB;压缩后最大支持10MB,压缩时会依次放入文件,如果某个文件放入后压缩包大小超过10MB,则会跳过这个文件。
需要传入带中文的路径时,请使用宽字符版本(CS_SetCustomLogDirW)
5.11 增加错误码
将指定RaiseException的错误码认为是崩溃,进行上报(一般不建议修改,修改前请进行具体的咨询)
// 导入函数
typedef void (*CS_AddValidExpCode)(unsigned long exp_code);
CS_AddValidExpCode theAddValidExpCode = (CS_AddValidExpCode)GetProcAddress(dllDemo, "CS_AddValidExpCode");
// 调用函数
theAddValidExpCode(0xC0000005L);
| 参数 | 说明 |
|---|---|
| exp_code | 错误码 |
5.12 主动上报dump
在某些情况下期望主动上报dump可以调用此函数。
// 导入函数
typedef void (*CS_ReportDump)(const char* dump_path, bool is_async);
CS_ReportDump theReportDump = (CS_ReportDump)GetProcAddress(dllDemo, "CS_ReportDump");
// 调用函数
theReportDump("/path/to/your/dump/file", true);
| 参数 | 说明 |
|---|---|
| dump_path | dump文件的绝对路径 |
| is_async | 是否异步 |
5.13 设置用户Id
初始化之后,可以使用此接口修改用户ID
// 导入函数
typedef void (*CS_SetUserId)(const char* user_id);
CS_SetUserId theSetUserId = (CS_SetUserId)GetProcAddress(dllDemo, "CS_SetUserId");
// 调用函数
theSetUserId("userid");
| 参数 | 说明 |
|---|---|
| user_id | 用户ID |
5.14 设置device ID
CrashSight Windows端默认使用mac地址作为device ID。此接口可以修改device ID,一般情况下不需要调用。
// 导入函数
typedef void (*CS_SetDeviceId)(const char* device_id);
CS_SetDeviceId theSetDeviceId = (CS_SetDeviceId)GetProcAddress(dllDemo, "CS_SetDeviceId");
// 调用函数
theSetDeviceId("deviceId");
| 参数 | 说明 |
|---|---|
| device_id | 设备ID |
5.15 设置dump模式
此接口可以更改崩溃时dump的模式,一般情况下不需要更改。dump_type的定义可参考MINIDUMP_TYPE
// 导入函数
typedef void (*CS_SetDumpType)(int dump_type);
CS_SetDumpType theSetDumpType = (CS_SetDumpType)GetProcAddress(dllDemo, "CS_SetDumpType");
// 调用函数
theSetDumpType(1);
| 参数 | 说明 |
|---|---|
| dump_type | dump模式 |
5.16 设置子场景
此接口设置的子场景可以在“异常概览”页中进行筛选。
// 导入函数
typedef void (*CS_SetEnvironmentName)(const char *name);
CS_SetEnvironmentName theSetEnvironmentName = (CS_SetEnvironmentName)GetProcAddress(dllDemo, "CS_SetEnvironmentName");
// 调用函数
theSetEnvironmentName("envName");
| 参数 | 说明 |
|---|---|
| name | 子场景名 |
5.17 根据GUID上报崩溃
上报指定GUID的错误。
// 导入函数
typedef void (*CS_UploadCrashWithGuid)(const char *guid);
CS_UploadCrashWithGuid theUploadCrashWithGuid = (CS_UploadCrashWithGuid)GetProcAddress(dllDemo, "CS_UploadCrashWithGuid");
// 调用函数
theSetEnvironmentheUploadCrashWithGuidtName("GUID");
| 参数 | 说明 |
|---|---|
| guid | 问题的唯一ID |
此接口需要在下次启动后调用才生效,使用方法为:先关闭崩溃自动上报,然后从回调函数中获取GUID,手动判断是否需要上报,需要的话调用本接口上报。
5.18 获取会话ID
// 导入函数
typedef void (*CS_GetSessionId)(char *session_id);
CS_GetSessionId theGetSessionId = (CS_GetSessionId)GetProcAddress(dllDemo, "CS_GetSessionId");
// 调用函数
char* sessionId = new char[64];
theGetSessionId("GUID");
| 参数 | 说明 |
|---|---|
| session_id | 会话ID |
5.19 崩溃自动上报开关
可以关闭崩溃自动上报,但是不会关闭崩溃的捕获和处理,还是会生成dump。配合根据GUID上报崩溃接口使用。
// 导入函数
typedef void (*CS_SetCrashUploadEnable)(bool enable);
CS_SetCrashUploadEnable theSetCrashUploadEnable = (CS_SetCrashUploadEnable)GetProcAddress(dllDemo, "CS_SetCrashUploadEnable");
// 调用函数
theSetCrashUploadEnable(false);
5.20 设置工作区
默认工作区为dll所在的目录,此接口可以更改工作区,会影响dump文件、记录文件、数据库和日志的生成位置。传入带中文字符的目录时需要使用宽字符版本(CS_SetWorkSpaceW)
// 导入函数
typedef void (*CS_SetWorkSpace)(const char *workspace);
CS_SetWorkSpace theSetWorkSpace = (CS_SetWorkSpace)GetProcAddress(dllDemo, "CS_SetWorkSpace");
// 调用函数
theSetWorkSpace("/path/to/your/workspace");
typedef void (*CS_SetWorkSpaceW)(const wchar_t *workspace);
CS_SetWorkSpaceW theSetWorkSpaceW = (CS_SetWorkSpaceW)GetProcAddress(dllDemo, "CS_SetWorkSpaceW");
// 调用函数
theSetWorkSpaceW(L"/path/to/your/workspace");
| 参数 | 说明 |
|---|---|
| workspace | 工作路径,须填写绝对路径 |
5.21 设置日志等级
设置日志等级,高于指定等级的日志不会被记录。此处的日志是指自定义接口日志
// 导入函数
typedef void (*CS_ConfigCrashReporter)(int log_level);
CS_ConfigCrashReporter theConfigCrashReporter = (CS_ConfigCrashReporter)GetProcAddress(dllDemo, "CS_ConfigCrashReporter");
// 调用函数
theConfigCrashReporter(1);
| 参数 | 说明 |
|---|---|
| log_level | 日志等级 |
5.22 测试崩溃
调用后产生一个崩溃
// 导入函数
typedef void (*CS_TestNativeCrash)();
CS_TestNativeCrash theTestNativeCrash = (CS_TestNativeCrash)GetProcAddress(dllDemo, "CS_TestNativeCrash");
// 调用函数
theTestNativeCrash();
5.23 设置只上报首个崩溃
有时会出现多个线程同时崩溃的情况,导致一次启动会上报多个崩溃。如果你不希望一次启动上报多个崩溃的情况发生,请设置为true。
// 导入函数
typedef void (*CS_OnlyUploadFirstCrash)(bool enable);
CS_OnlyUploadFirstCrash theOnlyUploadFirstCrash = (CS_OnlyUploadFirstCrash)GetProcAddress(dllDemo, "CS_OnlyUploadFirstCrash");
// 调用 函数
theOnlyUploadFirstCrash(true);
5.24 设置额外信息回调
使用前需实现OnCrashExtraMessageNotify,它会在每次崩溃和错误上报前被调用,它返回的字符串随崩溃或错误一起上报,可见于崩溃/错误详情->附件下载->extraMessage.txt(Windows端上无需实现OnCrashExtraDataNotify)
// 导入函数
class UQMInnerCrashRet {
public:
char* data{};
int maxDataLen{};
int* dataLen{};
UQMInnerCrashRet() = default;
};
class UQMCrashObserver {
public:
virtual ~UQMCrashObserver(){};
virtual long OnCrashExtraDataNotify(const UQMInnerCrashRet& crashRet) { return 0; };
virtual const char* OnCrashExtraMessageNotify(int crashType) { return nullptr; };
};
typedef void (*CS_SetCrashObserver)(UQMCrashObserver *crashObserver);
CS_SetCrashObserver theSetCrashObserver = (CS_SetCrashObserver)GetProcAddress(dllDemo, "CS_SetCrashObserver");
// 调用函数
class MyCrashObserver : public UQMCrashObserver {
const char* OnCrashExtraMessageNotify(int crashType) {
return "Your extra message!";
};
}
theSetCrashObserver(new MyCrashObserver());
| 参数 | 说明 |
|---|---|
| crashObserver | 额外信息回调 |
5.25 指定附件路径
指定附件路径,需传入附件的绝对路径,该文件会在崩溃时上传。
// 导入函数
typedef void (*CS_SetCustomAttachDir)(const char* attach_path);
CS_SetCustomAttachDir theSetCustomAttachDir = (CS_SetCustomAttachDir)GetProcAddress(dllDemo, "CS_SetCustomAttachDir");
// 调用函数
theSetCustomAttachDir("/path/to/your/attach/file");
typedef void (*CS_SetCustomAttachDirW)(const wchar_t* attach_path);
CS_SetCustomAttachDirW theSetCustomAttachDirW = (CS_SetCustomAttachDirW)GetProcAddress(dllDemo, "CS_SetCustomAttachDirW");
// 调用函数
theSetCustomAttachDirW(L"/path/to/your/attach/file");
| 参数 | 说明 |
|---|---|
| attach_path | 附件路径 |
需要传入带中文的路径时,请使用宽字符版本(CS_SetCustomAttachDirW)
需要上传多个附件时,请使用“|”分隔路径,一次最多传入3个文件的绝对路径,不支持传入目录。单个文件最大支持20MB,大小超过20MB的文件会自动忽略;压缩后最大支持10MB,压缩时会依次放入文件,如果某个文件放入后压缩包大小超过10MB,则会跳过这个文件。
5.26 设置应用版本
设置应用版本号,需要在InitWithAppId接口之前调用。
// 导入函数
typedef void (*CS_SetAppVersion)(const char *app_version);
CS_SetAppVersion theSetAppVersion = (CS_SetAppVersion)GetProcAddress(dllDemo, "CS_SetAppVersion");
// 调用函数
theSetAppVersion("app_version");
5.27 debug使能开关
是否开启debug模式,默认为关。开启后会打印一定量的日志,但是可以方便测试期间的问题定位。 需要在InitWithAppId接口之前调用。
// 导入函数
typedef void (*CS_ConfigDebugMode)(bool enable);
CS_ConfigDebugMode theConfigDebugMode = (CS_ConfigDebugMode)GetProcAddress(dllDemo, "CS_ConfigDebugMode");
// 调用函数
theConfigDebugMode(true);
6 参考代码
C++参考代码如下:
typedef void(*CS_ConfigCrashServerUrl)(const char* crash_server_url);
typedef void(*CS_InitWithAppId)(const char* app_id);
typedef void(*CS_SetAppVersion)(const char *app_version);
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);
int main()
{
// 加载dll
HINSTANCE dllDemo = LoadLibraryA("CrashSight64.dll");
// 设置应用版本
if (dllDemo)
{
CS_SetAppVersion theSetAppVersion = NULL;
theSetAppVersion = (CS_SetAppVersion)GetProcAddress(dllDemo, "CS_SetAppVersion");
if(theSetAppVersion!= NULL)
{
theSetAppVersion("app_version");
}
}
// 设置上报URL
if (dllDemo)
{
CS_ConfigCrashServerUrl theConfigCrashServerUrl = NULL;
theConfigCrashServerUrl = (CS_ConfigCrashServerUrl)GetProcAddress(dllDemo, "CS_ConfigCrashServerUrl");
if (theConfigCrashServerUrl != NULL)
{
theConfigCrashServerUrl("pc.crashsight.qq.com");
}
}
// 执行初始化
if (dllDemo)
{
CS_InitWithAppId theInitWithAppId = NULL;
theInitWithAppId = (CS_InitWithAppId)GetProcAddress(dllDemo, "CS_InitWithAppId");
if (theInitWithAppId != NULL)
{
theInitWithAppId("your appid");
}
}
// 上报一个自定义错误
if (dllDemo)
{
CS_ReportException theReportException = NULL;
theReportException = (CS_ReportException)GetProcAddress(dllDemo, "CS_ReportException");
if (theReportException != NULL)
{
int type = 1;
theReportException(type, "exp name", "exp message", "stack", "extras", true, "");
}
}
return 1;
}
C# 参考代码如下:
函数声明:
[DllImport("CrashSight64.dll")]
static extern void CS_ConfigCrashServerUrl([MarshalAs(UnmanagedType.LPUTF8Str)]string crashServerUrl);
[DllImport("CrashSight64.dll")]
static extern void CS_InitWithAppId([MarshalAs(UnmanagedType.LPUTF8Str)]string appid);
[DllImport("CrashSight64.dll")]
static extern void CS_ReportException (int type, [MarshalAs(UnmanagedType.LPUTF8Str)]string name, [MarshalAs(UnmanagedType.LPUTF8Str)]string message, [MarshalAs(UnmanagedType.LPUTF8Str)]string stackTrace, [MarshalAs(UnmanagedType.LPUTF8Str)]string extras, bool is_async, [MarshalAs(UnmanagedType.LPUTF8Str)]string error_attach_path);
函数调用:
CS_ConfigCrashServerUrl("pc.crashsight.qq.com");
CS_InitWithAppId("your appid");
CS_ReportException(1, "name", "message","stackTrace", "extras", true, "");
7 功能测试验证
接入完成后,请务必验证接入的结果是否符合预期。包括以下几点:
1. 初始化CrashSight后,联网上报是否正常,具体验证方法如下:
1. 初始化CrashSight;
2. 5分钟后,在管理端页面的 异常概览 --> 崩溃趋势 --> 联网设备数 中可以看到统计数值大于等于1.
2. 游戏发生崩溃,是否能正确上报,具体验证方法如下:
1. 初始化CrashSight;
2. 在游戏内由代码 int *a = NULL; a[0] = 1; 触发崩溃。(其他类似的坏内存访问也可以)
3. 查看CrashSight64/dump目录(旧版本为TQM64/dump)下是否有dmp文件生成。如果没有,说明无法成功捕获崩溃,请联系CrashSight开发。
4. 查看管理端页面 崩溃分析 中,是否有对应时间点的上报。如果3有,4没有,说明没有成功上报。请检查APP ID配置是否对应且与应用设置中一样。如果配置正确,还无法上报,请联系CrashSight开发。
3. 游戏发生错误,是否能正确上 报(可选),具体验证方法如下:
1. 初始化CrashSight;
2. 在游戏内触发CS_ReportException()
3. 查看管理端页面 错误分析 中,是否有对应时间点的上报。如果没有,说明没有成功上报。请检查APP ID配置(两个配置文件均要正确),以及APP KEY配置,是否对应且与应用设置中一样。如果配置正确,还无法上报,请联系CrashSight开发。
4. 游戏发生错误,是否能正确上报自定义日志;(可选)
5. 崩溃上报的版本号,用户名是否与设置一致;
6. 错误上报的版本号,用户名是否与设置一致;
8 CrashSight测试及影响
成功接入后,正常启动游戏后会加载dll。CrashSight启动后会立即上传联网信息,web端可以直接查看上报的联网数据,说明CrashSight联网数据上报功能。通过某种方式使游戏进程崩溃,在CrashSight网站该项目下的异常列表中能查看到该项目的dump信息,说明CrashSight异常捕获功能正常。
对接入CrashSight前后的客户端性能进行测试,CrashSight对游戏的性能影响不超过1%。
加载dll时需要判断dll是否成功加载。接入后直接移除CrashSight64.dll,不会对游戏产生额外影响。
9 上传符号表
以上内容介绍了SDK的接入,崩溃上报和验证,但要在页面上看到可读的还原堆栈,还需要上传对应的符号表。Windows端符号表,需要使用pdb和对应的exe或dll文件来制作上传,可以在页面左下角“接入指南”板块中找到符号表工具的下载和使用指引。上传符号表时至少需要包含dump里面崩溃堆栈涉及的所有模块。
10 查看dll版本号
在一些情况下,开发者可能需要查看CrashSight64.dll的版本号。dll版本号可见于属性->详细信息中,如下图所示:
