如何在VisualStudio C++项目中接入使用Sentry C++服务?
Visual Studio 下C项目接入Sentry C错误监控实操方案
以下是经过生产环境验证的落地步骤,全程不需要额外魔改SDK,适配VS2019及以上版本:
前置准备
- 提前完成Sentry账号注册,在后台创建C++技术栈的项目,保存好项目生成的DSN密钥,这是后续上报错误的唯一身份凭证
- 确认VS已安装「使用C的桌面开发」工作负载,额外勾选CMake组件,项目C标准设置为C++17及以上,避免编译阶段出现语法兼容问题
- 提前规划好项目的版本号规则、符号文件存储路径,方便后续错误定位
SDK获取
推荐两种适配VS的SDK获取方式,优先选第一种:
- vcpkg安装(零配置首选)
打开VS对应版本的开发者命令提示符,执行安装命令:vcpkg install sentry-native:x64-windows
如果需要调试版本的SDK包,将后缀改为x64-windows-dbg即可。如果已经给VS开启了vcpkg全局集成,安装完成后不需要手动配置头文件、库路径,VS会自动识别关联。 - 源码手动编译
下载Sentry Native SDK源码到本地,通过CMake-GUI配置编译选项,勾选SENTRY_BUILD_SHARED_LIBS生成动态库版本(Windows环境下优先选动态库,避免和项目其他依赖的静态运行时冲突),选择对应VS版本的生成器完成编译,最终拿到三类核心文件:include头文件目录、sentry.lib/sentry.dll、crashpad_handler.exe。
VS项目配置
如果用vcpkg集成,只需要做运行时依赖和符号配置即可;手动编译的SDK需要先完成基础路径配置:
- 打开项目属性页,在「C/C++ -> 常规 -> 附加包含目录」中添加SDK头文件所在路径
- 在「链接器 -> 常规 -> 附加库目录」中添加sentry.lib所在的文件夹路径
- 在「链接器 -> 输入 -> 附加依赖项」中新增
sentry.lib条目 - 将sentry.dll、crashpad_handler.exe两个文件拷贝到项目输出exe的同级目录,避免运行时找不到依赖
- 打开「链接器 -> 调试 -> 生成调试信息」,选择
/DEBUG:FULL选项,后续发布版本时将生成的pdb符号文件上传到Sentry后台,才能看到对应代码行的错误堆栈。
代码接入
在程序入口函数(main/WinMain)的最开头添加初始化逻辑,要放在所有业务逻辑、窗口创建之前,避免漏抓启动阶段的崩溃。参考代码:
#include <sentry.h> int main() { sentry_options_t* s_options = sentry_options_new(); // 替换为自己项目的DSN sentry_options_set_dsn(s_options, "你的项目DSN"); // 指定崩溃捕获程序路径,和exe放同级就直接填文件名 sentry_options_set_handler_path(s_options, "crashpad_handler.exe"); // 开启自动上报上次运行缓存的崩溃记录 sentry_options_set_auto_session_tracking(s_options, 1); // 指定崩溃缓存路径,不要选需要管理员权限的系统目录 sentry_options_set_database_path(s_options, "./sentry_cache/"); // 绑定当前程序版本号,方便按版本筛选错误 sentry_options_set_release(s_options, "v1.0.0"); int init_res = sentry_init(s_options); if (init_res != 0) { // 这里加自己的初始化失败日志逻辑,比如写本地日志 } // -------------------------- // 这里写原本的业务逻辑代码 // 测试上报:主动发一条测试消息 sentry_capture_event(sentry_value_new_message_event( SENTRY_LEVEL_INFO, "init_check", "Sentry接入成功测试消息" )); // 测试崩溃:可以临时加这行验证崩溃捕获,正式发布删掉 // *(int*)0 = 0; // -------------------------- // 程序退出前关闭Sentry,确保缓存的事件全部上报完成 sentry_shutdown(); return 0; }
注意:如果是Windows GUI项目,不要把初始化逻辑放到窗口类注册、控件创建之后,否则启动阶段的空指针、资源加载失败类崩溃抓不到。
常用操作
- 自定义异常上报:在业务代码的try-catch块、异常处理逻辑中,调用
sentry_capture_event接口上报错误,支持附加用户ID、操作路径、自定义业务字段,方便快速复现问题 - 符号上传:每次发布正式版本时,把对应编译生成的pdb文件上传到Sentry后台对应版本下,否则后台看到的堆栈只有内存地址,无法定位到具体代码行
- 性能监控:如果需要监控页面加载、接口请求耗时,可以在初始化时开启性能采集开关,设置采样率即可,不需要额外埋点。
常见踩坑
- 崩溃捕获失效:90%的情况是crashpad_handler.exe路径配置错误,或者没有放到exe同级目录,可以在初始化后打印返回值排查
- 缓存写入失败:不要把崩溃缓存路径设到C盘根目录、Program Files目录,普通权限下写不进去,会导致崩溃记录丢失
- 堆栈乱码:确认pdb文件和发布的exe是同一次编译生成的,不要用旧版本的pdb上传,否则堆栈和代码对不上。
内容的提问来源于stack exchange,提问作者Kailash Suresh
相关产品推荐
相关产品推荐

