在我建议 sentry-native 社区添加 contetn: gzip 功能,并提交了一个 PR 帮助他们完成后,终于在 v0.7.2 中添加了该功能
https://github.com/getsentry/sentry-native/releases/tag/0.7.2
不过实际中使用与旧版本存在一些差距,主要在于 zlib 库的引用,所以记录下差异的地方和解决的方法
sentry-native 是使用 CMake-Gui 完成构建的,0.7.2 的版本多了 SENTRY_TRANSPORT_COMPREESION 选项
当我们勾选该选项后就是默认使用 gzipped_with_compression 函数来压缩请求消息,参考下面部分源码
#ifdef SENTRY_TRANSPORT_COMPRESSION char *compressed_body = NULL; size_t compressed_body_len = 0; compressed = gzipped_with_compression( body, body_len, &compressed_body, &compressed_body_len); if (compressed) { if (body_owned) { sentry_free(body); body_owned = false; } body = compressed_body; body_len = compressed_body_len; body_owned = true; } #endif
所以问题来了,sentry 要引用 zlib 库,但是它不能引用 crashpad 中的 crashpad_zlib 库,因为社区建议 sentry 和 crashpad 保持独立,两者尽量不耦合,故我们需要使用到系统的库=》zlib
那我们从哪找到 zlib 库呢,首先排除 GNUWIN32 提供的 zlib 库,原因是版本太老了
为什么我要提到 GNUWIN32 这个网站呢,因为国内技术博客提到 zlib 本地集成的解决方法中,很多都会让用户去该网站下载现成的 msi 文件去下载安装
实际使用当中,当你的项目使用到较新的 api,就会提示符号文件找不到,所以不建议使用过时的 zlib 库
最好的办法就是我们手动编译生成适合项目的 zlib 库,这里我使用的是 zlib-1.2.11 版本
源码地址:https://github.com/madler/zlib/releases/tag/v1.2.11
下载到本地后,打开 x86 Native Tools Command Prompt for Vs 20xx 命令框,并在其中 cd 到源码目录下,使用 nmake 快速编译生成
nmake -f win32/Makefile.msc
最后,在 CMake-Gui 中勾选 Advanced 框,并设置 zlib 头文件和静态库路径,如果不设置 zlib 路径,就会出现找不到 zlib 库的错误
解决方法;
重新 Configure 就会发现配置正常了
补充:
编译过程中可能会出现“Unresolved external symbol __except_handler4_common" in Visual Studio XXX” 这样的错误
这种问题一般就是 Code Generation/Runtime Library 的生成方法不匹配导致的
解决方法:所有的工程使用相同的 Runtime Library 编译,比如我这边 Release 下使用 MT
参考:"Unresolved external symbol __except_handler4_common" in Visual Studio 2015
标签:body,sentry,Windows,zlib,len,compressed,使用,v0.7 From: https://www.cnblogs.com/strive-sun/p/18206946