Integração do Sentry-Native v0.7.2 no Windows com Suporte a Compressão

Configurando o Sentry-Native v0.7.2 no Windows

Após sugerir à comunidade do sentry-native a adição da funcionalidade de compressão gzip e contribuir com um PR que foi aceito, a versão 0.7.2 finalmente incluiu esse recurso: https://github.com/getsentry/sentry-native/releases/tag/0.7.2No entanto, a implementação na prática apresenta algumas diferenças em relação às versões anteriores, principalmente na referência à biblioteca zlib. Este artigo documenta essas diferenças e suas soluções.

O sentry-native utiliza CMake-Gui para sua compilação. Na versão 0.7.2, foi adicionada a opção SENTRY_TRANSPORT_COMPRESSION. Quando ativada, a função compressao_com_gzip é usada para compactar as mnesagens de requisição, conforme demonstrado no trecho de código abaixo:


#ifdef SENTRY_TRANSPORT_COMPRESSION
    char *corpo_comprimido = NULL;
    tamanho_t comprimento_corpo_comprimido = 0;
    bool foi_comprimido = compressao_com_gzip(
        corpo, comprimento_corpo, &corpo_comprimido, &comprimento_corpo_comprimido);
    if (foi_comprimido) {
        if (corpo_proprio) {
            sentry_free(corpo);
            corpo_proprio = false;
        }
        corpo = corpo_comprimido;
        comprimento_corpo = comprimento_corpo_comprimido;
        corpo_proprio = true;
    }
#endif>

Aqui surge o desafio: o Sentry precisa referenciar a biblioteca zlib, mas não pode utilizar a zlib do crashpad (crashpda_zlib), pois a comunidade mantém esses porjetos independentes, com acoplamento mínimo. Portanto, precisamos usar a biblioteca zlib do sistema.

Excluímos a zlib fornecida pelo GNUWIN32, pois sua versão está desatualizada. Muitos tutoriais nacionais recomendam o download do arquivo MSI do GNUWIN32, mas ao usar APIs mais recentes, problemas com símbolos ausentes podem ocorrer. A abordagem recomendada é compilar manualmente a zlib adequada ao seu projeto. Neste exemplo, usamos a versão zlib-1.2.11.

Código-fonte disponível em: https://github.com/madler/zlib/releases/tag/v1.2.11

Após o download, abra o "x86 Native Tools Command Prompt for Vs 20xx", navegue até o diretório do código-fonte e utilize o nmake para compilar rapidamente:


nmake -f win32/Makefile.msc

Para configurar no CMake-Gui:

  1. Marque a opção "Advanced"
  2. Especifique os caminhos dos headers e da biblioteca estática zlib
  3. Sem esses caminhos, ocorrerá erro de biblioteca não encontrada

Após reconfigurar, a configuração deve estar normalizada.

Resolvendo Problemas de Compilação

Durante a compilação, pode ocorrer o erro "Unresolved external symbol __except_handler4_common" no Visual Studio. Geralmente, isso acontece devido a incompatibilidade no método de geração da Runtime Library.

Solução: todos os projetos devem usar a mesma Runtime Library. Por exemplo, na configuração Release, utilize MT.

Referência: "Unresolved external symbol __except_handler4_common" no Visual Studio 2015

Tags: sentry-native zlib CMake Windows C++

Publicado em 6-7 06:03 por Thomas