官方文档: https://docs.sentry.io/platforms/native/guides/qt/

一篇笔记, 也是备忘

crashpad编码的坑

crashpad的源代码全是UTF-8 without BOM

编译的时候一串的 C4819 该文件包含不能在当前代码页中表示的字符 满屏飘红

咱这里有cygwin的zsh环境所以简单粗暴批量加BOM

1
2
3
4
5
6
7
8
# for zsh
setopt no_nomatch
setopt nullglob
# for bash
shopt -s nullglob

# the real job
for f in *.{h,cc,c,cpp}; do sed -i '1s/^\(\xef\xbb\xbf\)\?/\xef\xbb\xbf/' $f; done

Qt目录识别

设置SENTRY_INTEGRATION_QT=YES后手动在CMAKE_PREFIX_PATH添加qt的目录

官方文档说的是安装目录

但实际上需要设置为where/qt/installed/at/lib/cmake/Qt5才能正确识别

拖着个crashpad程序

编译出来发现还需要带着crashpad_handler一起发布才能抓minidump

虽然也可以在程序里初始化sentry之前把crashpad释放到临时目录之类的

但是实在太不优雅了 (摔

使用 SENTRY_BACKEND=breakpad , 优雅又干净

注: 进程内异常捕获有健壮性问题, 但….又不是不能用.jpg

crashpad转码白整了 (悲

内嵌sentry到程序内

设置 SENTRY_BUILD_SHARED_LIBS=NO 编译静态库而不是dll

使用时需要在导入header之前做额外工作

1
2
#define SENTRY_BUILD_STATIC 1
#include <sentry.h>

太不优雅, 修改sentry.h把这个define放到文件头去

最终命令行

1
2
3
4
5
6
7
8
9
10
11
set CMAKE_PREFIX_PATH=E:/Applications/Qt/static-5.12/lib/cmake/Qt5

cmake -B build ^
-D SENTRY_BACKEND=breakpad ^
-D SENTRY_BUILD_EXAMPLES=NO ^
-D SENTRY_BUILD_SHARED_LIBS=NO ^
-D SENTRY_BUILD_TESTS=NO ^
-D SENTRY_INTEGRATION_QT=YES ^
-S .

cmake --build build --config Release --parallel