Como depurar pacotes NuGet com Source Link

O Source Link é uma tecnologia que visa prover uma grande experiência de depuração para binários .NET e que facilita muito a vida dos desenvolvedores na hora de resolver problemas.

Para isso, ele insere metadados nos binários e nos pacotes NuGet, de modo que a IDE possa fazer o download do código fonte diretamente dos repositórios no GitHub, GitLab, Azure DevOps, ou qualquer outro provedor que tenha suporte ao recurso.

Cada IDE possui uma configuração para habilitar o uso do Source Link e permitir a depuração de pacotes NuGet. A seguir, mostro como fazer essa configuração no Jetbrains Rider e no Visual Studio.

Configuração no Rider ou ReSharper

As versões mais recentes do Rider e do ReSharper já vêm com tudo configurado por padrão e a experiência é bem natural.

Configuração do Source Link no Rider em Settings, Tools, External Symbols
Figura 1. Configuração no Rider

Por padrão, se houver símbolos disponíveis via Source Link, o Rider vai baixar os fontes, e caso contrário, permite decompilar os binários, provendo uma estratégia sólida de fallback.

Configuração no Visual Studio:

No Visual Studio o suporte ao Source Link está presente desde a versão 2019, mas por questões de performance, o download dos fontes vem desabilitado por padrão.

Configuração do Source Link no Visual Studio em Tools, Debugging, General
Figura 2. Configuração no Visual Studio

Como podemos ver, precisamos:

  1. Desabilitar a opção Enable Just My Code

  2. Habilitar a opção Enable Source Link support, caso não esteja habilitada

Além disso, também é necessário habilitar os servidores de símbolos:

Habilitando o servidor de símbolos do NuGet.org em Tools, Debugging, Symbols
Figura 3. Habilitar servidores de símbolos
Se você quiser também habilitar a depuração dos assemblies do .NET, habilite o servidor de símbolos Microsoft Symbol Servers. Todos os binários do .NET têm Source Link habilitado desde a versão 2.1.

O Visual Studio tende a ficar bem lento com o download de símbolos habilitado, e pode ser interessante reabilitar a opção Enable Just My Code após terminar a investigação.

No Rider, isso não é necessário porque não há degradação perceptível de performance.

Depurando um pacote

Uma vez com o Source Link habilitado, podemos depurar nosso código e arriscar um Step Into (F11). Assim que fizermos isso, o Visual Studio vai apresentar a seguinte mensagem:

Janela de confirmação de download do código fonte
Figura 4. Janela de confirmação de download do código fonte

Alguns detalhes que podemos notar na imagem acima:

  1. A IDE quer baixar o arquivo fonte MagicFactory.cs

  2. A fonte do download é https://raw.githubusercontent.com, indicando que o código fonte do pacote está hospedado no GitHub

  3. Podemos confirmar o download a cada novo arquivo, ou informar para o Visual Studio não perguntar mais e sempre baixar os fontes

Expandindo os detalhes, podemos ver exatamente o link de onde onde será baixado o fonte. Note que o link inclui o hash do commit (68ead5c2b9ac0eeded3c19e6d3b591662bbcd1cc) que gerou a versão do pacote NuGet que estamos tentando depurar:

Janela de confirmação de download do código fonte, com a seção de detalhes expandida, exibindo o link de download
Figura 5. Detalhes com o link de download

Uma vez baixado o arquivo, podemos depurar o código normalmente:

Breakpoint parado dentro da classe MagicFactory, do fonte MagicFactory.cs
Figura 6. Breakpoint parado dentro do fonte baixado

Como podemos ver na imagem acima, durante nossa sessão de depuração, fomos capazes de explorar a implementação de um pacote NuGet acessando uma fonte C# que acaba de ser baixado do GitHub.

Onde ficam salvos os fontes?

Depois de ver tudo isso funcionando, você pode estar se perguntando "mas e onde ficam salvos esses arquivos?".

Diretório do servidor de fontes
~\AppData\Local\SourceServer

Se conferirmos esse diretório, encontraremos cada um dos arquivos baixados, cada qual abaixo da mesma estrutura de diretórios em que estão inseridos no seu projeto original:

Estrutura de diretórios com todos os arquivos baixados até então
Figura 7. Conteúdo do diretório do servidor de fontes

Espero que este artigo seja útil para você!

Outras opções para compartilhar:
comments powered by Disqus