崩溃无堆栈需先确认信号捕获是否生效:windows需setunhandledexceptionfilter,linux/macos需启用crashpad后端,unity il2cpp须保留符号并匹配release字段,传参避免c++对象生命周期问题,线上需检查证书与dns。

崩溃时没堆栈?先确认信号捕获是否生效
游戏在 Windows 或 Linux 上闪退却拿不到调用栈,大概率是未正确拦截底层信号(如 SIGSEGV、EXCEPTION_ACCESS_VIOLATION)。Sentry C++ SDK 和 BugSplat 都依赖信号/异常钩子,但默认不自动开启所有捕获点。
实操建议:
- Windows 下必须调用
sentry_init后立即执行SetUnhandledExceptionFilter(Sentry 会帮你做,但若你手动接管了异常处理,就得自己补) - Linux/macOS 要显式启用
SENTRY_BACKEND=crashpad或inproc,仅靠sentry_init不够——crashpad后端才能捕获 fork 后的子进程崩溃(比如 Unity IL2CPP 子进程) - 检查是否链接了
-lsentry(Linux)或sentry.lib(MSVC),静态链接时漏掉符号会导致sentry_capture_event空转无上报
Unity + IL2CPP 项目上报堆栈全为 ?? ?得过 symbol 三关
IL2CPP 导出的二进制里函数名被 strip,Sentry 默认解析不出符号,BugSplat 也一样。不是 SDK 不行,是符号链断了。
实操建议:
- Unity 构建时勾选
Development Build+Script Debugging,并确保Strip Engine Code关闭——否则libil2cpp.so里关键符号直接消失 - 生成
.sym文件:用dump_syms(Sentry 提供)或bsc(BugSplat CLI)从.so/.dll/.dylib提取符号,上传到对应平台(Sentry 的sentry-cli upload-dif/ BugSplat 的bsc -upload) - 上报时必须带
release字段且与符号文件的id匹配,例如sentry_init("https://xxx@sentry.io/123?release=mygame@1.2.0+build456");BugSplat 则要求appName+appVersion严格一致
崩溃现场变量值怎么传?别直接塞 std::string 进 sentry_value_t
想把 player_hp、current_level 一起发上去,但直接 sentry_value_set_by_key(event, "hp", sentry_value_new_string(player_hp_str)) 容易 crash——因为 Sentry C API 是纯 C,不认 C++ 对象生命周期。
实操建议:
- 所有传入
sentry_value_new_string的字符串,必须是const char*且内存稳定(不能是局部std::string的c_str(),函数返回就失效) - 安全做法:用
strdup拷贝后传入,或用全局缓存区(如static char hp_buf[32]),避免析构竞争 - 不要在信号处理函数里分配堆内存(
new/malloc)——Linuxsignal上下文不保证线程安全,推荐用预分配的 ring buffer 记录关键状态,崩溃时只读不写
本地测试上报成功,线上全丢?检查 DNS 和证书验证
开发机 curl 能通 Sentry/BugSplat 地址,但打包后游戏崩溃零上报,常见于发行版裁剪了 CA 证书或禁用了 DNS 解析。
实操建议:
- Windows 打包时确认是否嵌入了
ca-bundle.crt(Sentry SDK 需要),否则 HTTPS 请求静默失败;BugSplat 的BSConfig.h里可设BS_DISABLE_SSL_VERIFICATION临时绕过(仅调试) - Linux 上检查
/etc/ssl/certs是否存在,或用sentry_options_set_ca_certs_path指向自包含证书路径 - 用 Wireshark 抓包看是否卡在 DNS 查询(
getaddrinfo超时)——某些 Steam 游戏沙箱会拦截gethostbyname,需改用sentry_options_set_http_proxy走代理或硬编码 IP
符号匹配和网络握手这两步,最容易在打包后突然失效,而且没错误日志——Sentry 默认静默失败,BugSplat 的 BS_LOG_LEVEL 环境变量要设成 3 才能看到底层 HTTP 状态码。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











