注意: Steam 错误报告仅支持 Windows 32 位应用程序。
概览
如果实现了 Steam 错误报告,那么在抛出 10 个类似异常后,Steam 将自动上传任何异常的小型转储文件。
您可以在 Steamworks 合作伙伴后端的
错误报告页面上查看每次崩溃的详细信息。
小型转储始终会先存储在本地计算机上,随后再上传至 Steam。 如果您需要直接查看其中某个转储文件,一般可以在游戏的安装目录中找到。
如何实现
如果您已经在使用
结构化异常处理,Steam 错误报告使用起来会很方便。
您必须对 Win32
_set_se_translator 函数进行挂钩,此函数会调用您所创建的用于处理小型转储的函数。 在该函数中您可以使用
SteamAPI_SetMiniDumpComment 与
SteamAPI_WriteMiniDump 通知 Steam 即将发生的崩溃。
示例
#ifdef _WIN32
#include <Windows.h>
void MiniDumpFunction( unsigned int nExceptionCode, EXCEPTION_POINTERS *pException )
{
// 您可在此创建并设置任意评论,嵌入到小型转储中,
// 您可以写下用户正在玩的关卡、服务器上有多少玩家、
// 还有多少内存可用,等等……
SteamAPI_SetMiniDumpComment( "Minidump comment: SteamworksExample.exe/n" );
// 此处的 0 是生成版本 ID,我们不对其进行设置。
SteamAPI_WriteMiniDump( nExceptionCode, pException, 0 );
}
int RealMain( HINSTANCE hInstance, LPSTR lpCmdLine, int nCmdShow )
{
__debugbreak();
return 0;
}
int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
// 我们在这里所做的就是在设置好结构化异常转换器(se translator)后调用真正的主函数,
// 这允许我们拦截到异常并将错误报告给 Steam。
//
// 请注意,您必须正确设置编译器标志以启用结构化异常处理,
// 才能使这种特定的设置方法生效。
if ( IsDebuggerPresent() )
{
// 在调试时,我们要避免屏蔽异常(或向 Steam 报告异常!)。
// 如果您希望逐步调试异常处理程序,请在调试器外部运行游戏后
// 附加调试器。
return RealMain( lpCmdLine, hInstance, nCmdShow );
}
_set_se_translator( MiniDumpFunction );
try // 此 try 块让结构化异常转换器得以运作。
{
return RealMain( hInstance, lpCmdLine, nCmdShow );
}
catch( ... )
{
return -1;
}
}
#endif
要求
错误报告 API 目前仅支持 Windows 上的 32 位应用程序。