Nuvem do AddressSanitizer ou teste distribuído
Você não precisa depurar erros do AddressSanitizer quando e onde eles ocorrem. Configure o runtime para criar um despejo de memória que armazena todo o contexto específico do AddressSanitizer quando ocorre um erro. Em seguida, envie esse despejo de memória para outro computador para depuração. A depuração offline pode ser um ponto crítico ao executar o AddressSanitizer na nuvem ou em testes distribuídos. Você pode criar o despejo na infraestrutura de teste ou produção em que a falha ocorre e depurá-la mais tarde no computador de desenvolvedor.
O depurador do Visual Studio fornece erros de AddressSanitizer diagnosticados com precisão. Você pode exibir esses bugs sem precisar executar testes novamente, copiar conjuntos de dados enormes, descobrir dados perdidos ou encontrar computadores de teste que ficaram offline. Você só precisa carregar o despejo de memória.
Despejos de falha são criados após falhas do AddressSanitizer definindo a seguinte variável de ambiente:
set ASAN_SAVE_DUMPS=MyFileName.dmp
Observação
O nome do arquivo deve ter um sufixo .dmp
para seguir as convenções de nomenclatura do Visual Studio.
Esse arquivo de despejo pode ser exibido usando o Visual Studio posteriormente em outro computador.
O Visual Studio pode exibir as informações de erro no contexto do código-fonte original. Para fazer isso, o Visual Studio requer símbolos de depuração e código-fonte indexado. Para a melhor experiência de depuração, o EXE, o PDB e o código-fonte usados para produzir esses binários devem corresponder.
Para mais informações sobre como armazenar fontes e símbolos, confira a seção origem e símbolos. Para informações sobre detalhes da implementação e controle refinado, confira integração do depurador.
Exemplo – compilar, testar e analisar
Considere três computadores: A, B e C. Os builds são feitos no computador B, os testes são executados no computador C e você analisa falhas no computador A. Os erros são relatados em relação aos números de linha de origem e coluna no código-fonte. Você pode ver a pilha de chamadas junto com um conjunto de símbolos no arquivo PDB produzido usando essa versão exata do código-fonte.
As etapas a seguir são para cenários locais ou distribuídos que levam à criação de um arquivo .dmp e para exibir esse arquivo de despejo AddressSanitizer offline.
Produzir um .dmp localmente
- Compilação
- Testar o executável
- Copiar um arquivo .dmp gerado para o diretório de build
- Abra o arquivo .dmp com o .pdb emparelhado, no mesmo diretório
Produzir um .dmp em um sistema distribuído
- Criar e pós-processar o PDB para blocos de dados de indexação de origem
- Copie o par atômico de (.exe, .pdb) para o computador de teste e execute testes
- Gravar os pares atômicos de (.pdb, .dmp) no banco de dados de relatórios de bugs
- O Visual Studio abre um arquivo .dmp com o .pdb emparelhado, no mesmo diretório
Observação
O computador do Visual Studio 2019 que você usa para análise deve ter acesso ao GitHub ou ao interno \\Machine\share
em que sua origem indexada está armazenada.
Exibir arquivos .dmp do AddressSanitizer
Verifique se o IDE do depurador pode encontrar o PDB e os arquivos de origem.
Abra o Visual Studio e selecione Continuar sem código. Em seguida, selecione Arquivo>Abrir>Abrir para abrir a caixa de diálogo Abrir Arquivo. Verifique se o sufixo de nome de arquivo é .dmp.
A tela mostrada aqui precisa de mais uma etapa para habilitar o acesso do IDE aos símbolos e à origem.
Defina os caminhos de símbolo e escolha Depurar com Somente Nativo.
Esta captura de tela mostra o arquivo de despejo carregado final, com fontes e metadados do AddressSanitizer carregados.
Origem e símbolos
O servidor de origem permite que um cliente recupere a versão exata dos arquivos de origem usados para criar um aplicativo. O código-fonte de uma DLL ou executável pode ser alterado ao longo do tempo e entre versões. Você pode usá-lo para examinar o mesmo código-fonte que criou uma versão específica do aplicativo.
Ao depurar um EXE com seu arquivo PDB, o depurador pode usar o bloco de dados do servidor de origem inserido para recuperar os arquivos apropriados do controle do código-fonte. Ele carrega os arquivos que são mapeados para os nomes totalmente qualificados colocados no PDB automaticamente pela opção do compilador /Zi
.
Para usar o servidor de origem, o aplicativo deve ser "indexado de origem" usando pdbstr.exe
para gravar um bloco de dados srcsrv
em seu arquivo PDB. Para mais informações, confira a seção Bloco de Dados de Servidor de origem e indexação de origem. Você também encontrará as etapas para indexar fontes e publicar símbolos e como especificar símbolos e código-fonte para o depurador.
Para a documentação externa, confira:
- Indexação de origem com Git
- Um guia para facilitar a depuração
- A indexação de origem é uma maravilha subutilizada
Confira também
Visão geral do AddressSanitizer
Problemas conhecidos do AddressSanitizer
Referência de linguagem e build do AddressSanitizer
Referência de runtime do AddressSanitizer
Bytes de sombra de AddressSanitizer
Integração do depurador do AddressSanitizer
Exemplos de erro do AddressSanitizer