WebAssembly, (ou WASM), permite que os desenvolvedores usem código coletado de linguagens como Rust, C ou C + dentro de um navegador da Internet em velocidades próximas às nativas.

WASM também pode ser utilizado com sucesso como um substituto do docker leve para plataformas que exigem sandboxing rápido. Uma interface que é independente de plataforma, como WASI padrão, pode permitir o acesso ao sistema de arquivos, funções básicas como entrada e saída padrão e outras funções semelhantes.

Apesar dos muitos benefícios, depurar WASM pode ser difícil, já que bugs reais estão se tornando mais complicados de reproduzir. Os mapas de origem podem ser usados ​​para encontrar rastreamentos de pilha confiáveis, para ver como eles realmente se parecem e para obter nomes de arquivos confiáveis ​​no WASM.

Neste artigo, falaremos sobre o WASM, por que é difícil depurar e algumas soluções alternativas que você pode usar ao depurar o WASM que envolvem mapas de origem e desenrolamento de pilha.

O que é WebAssembly?

WASM é um código para navegadores da web modernos que se baseia em uma linguagem com um formato binário muito compacto e fornece outras linguagens de codificação com um alvo de compilação para que possam trabalhar na web. Ele funciona em conjunto com o JavaScript, compartilhando muitas funções. Como resultado disso, mesmo os desenvolvedores que não sabem escrever o código WASM ainda podem usá-lo. A compatibilidade do WASM é especialmente atraente considerando 75% dos desenvolvedores da web relatar usando JavaScript para a maioria de suas necessidades de codificação.

Nem todas as funções podem ser acessadas no mesmo espaço de memória, daí a utilização de stacking no programa. DWARF é útil para depurar outros programas, mas também não é totalmente funcional com WASM em qualquer mecanismo de execução atual. Há mais de um ano, mudanças no DWARF foram implementadas para permitir a compreensão do WebAssembly. Isso veio junto com grandes modificações no backend LLVM para WASM.

Em última análise, dominar diferentes tipos de código e seus métodos de depuração é importante para os desenvolvedores, especialmente aqueles que trabalham na nuvem e, especificamente, no setor de software como serviço (SaaS). Isso porque o SaaS permite que os dados sejam acessados ​​ de qualquer dispositivo com um navegador e depende do código que constitui um aplicativo hospedado no servidor do navegador. O código que é compatível em diferentes navegadores e livre de bugs melhora a experiência do cliente e aumenta a retenção de clientes.

Desenrolamento da pilha

Primeiro, você deseja obter um rastreamento de pilha. Como vamos fazer isso? Ele começa com o desenrolar da pilha. O esquema de desenrolamento do WebAssembly precisa ser ativado, o que geralmente é feito com bibliotecas como libunwind. Para desenrolar pilhas para WASM, o principal foco são os endereços de retorno. Qualquer coisa além disso simplesmente não é necessário.

Você pode desenrolar uma pilha capturando os registradores, desenrolando assim no programa enquanto ele está sendo executado. Este método é melhor usado quando alertas de erro Rust ou exceções C ++ são apresentados para você. O enrolamento da pilha pode executar destruidores quando confrontado com exceções,

Outra maneira de desfazer uma pilha é usando um despejo de memória. A memória da pilha cheia com os registradores é despejada em um despejo de memória e depois desfeita. É aparente que o WebAssembly não é o melhor em facilitar o desenrolar da pilha, mas isso não é um grande obstáculo se seu navegador funciona com JavaScript, como a maioria faz.

Uma vez que WASM é essencialmente uma máquina de pilha, as chamadas de função podem ser visualizadas no próprio rastreamento de pilha do JavaScript. Ao criar um objeto de exceção em JavaScript, você pode analisar seu rastreamento de pilha por meio deste método.

Padrão de depuração DWARF e WASM

O padrão de depuração DWARF há muito é usado para depuração passo a passo de binários. DWARF é freqüentemente usado no LLVM e em outros back-ends de compiladores, apesar de não ter sido projetado para isso. Apesar de DWARF não ser compatível com WASM em nenhum mecanismo de execução atual, Chrome e Firefox ainda podem fazer uso de informações de depuração. Eles conseguem isso vinculando um mapa de origem à execução do WASM.

DWARF Vinculando a WASM com mapa de origem
Fonte

Isso é importante para garantir a segurança, pois muitas pessoas podem desconfiar do uso de JavaScript em navegadores como o Chrome ou Firefox. De acordo com Will Ellis, desenvolvedor de software de Brisbane, da Privacy Australia , durante a execução certos navegadores, como o Chrome, “algumas pessoas optam por desligar o JavaScript completamente e só permitem que ele funcione em sites em que realmente confiam”. Felizmente, os mapas de origem podem definir um formato para mapeamento entre os arquivos de entrada originais e as instruções JavaScript resultantes, como um tradutor. Dessa forma, a depuração do navegador pode ser realizada em relação a uma exibição dos arquivos de entrada originais.

O padrão de depuração DWARF incorpora seções nos dados DWARF em um arquivo executável. Essa incorporação é possível pelo fato de que WebAssembly é um formato de objeto extensível. O WASM consiste em dois formatos principais: WAST, um formato baseado em texto e um formato binário.

Por causa disso, algumas ferramentas WASM não reconhecem offsets de byte, entre outras coisas. Infelizmente, essas duas versões não são compatíveis ao trabalhar com informações de depuração.

Existem alguns problemas sérios com o destino incorporando informações de depuração no arquivo WASM. Isso permite que qualquer pessoa potencialmente descompile a codificação e visualize as descrições de arquivo de seus metadados ou máquinas de construção. Outro problema é que os dados DWARF para WASM só podem ser armazenados em um arquivo muito grande, muito maior do que o arquivo WASM principal.

A divisão DWARF é a resposta aqui, em que os dados DWARF são segregados do executável principal. Depois de divididos, os dados de depuração podem ser armazenados em um arquivo não executável e não funcional apenas para depuração.

Como você os vincula novamente depois de divididos? Incorpore uma referência a um arquivo que pode ser baixado para depuração no arquivo WASM principal para uma seção especial, como um mapa de origem.

É muito importante conectar os dados de depuração com o arquivo WASM correto. Um ID de depuração é necessário para esse propósito. O conjunto de ferramentas WASM pode pegar esses arquivos e colocá-los em um servidor de símbolos para dados de depuração e binários.

Desafios com mapas de origem também são excessivos no WASM. Isso ocorre porque é difícil definir o escopo de informações, acessar ou mapear nomes de funções e localizar variáveis ​​no modo de depuração e só pode ser usado com a versão baseada em texto do WASM.

Apenas tenha em mente que é importante considerar a maneira como o WebAssembly interage com JavaScript e outros módulos WASM durante a depuração. Os rastreamentos de pilha no WASM vêm com um nome de arquivo que codifica as informações de localização, mas ainda é difícil encontrar o índice de função, pois dois módulos diferentes podem ter o mesmo índice de função. Os módulos WASM são mantidos em contêineres isolados, mas ainda podem exportar e importar funções.

Conclusão

WebAssembly é uma ótima ferramenta para desenvolvedores apesar dos desafios que apresenta com a depuração. Embora haja mais algumas etapas e um pouco de criatividade seja necessária para contornar o design baseado em pilha, ainda é possível usar DWARF para depurar WASM com sucesso.

A postagem Como depurar WASM e obter um rastreamento de pilha confiável apareceu primeiro no LogRocket Blog .

Source link