Dyego Maas - Blog

Consultor em IA Generativa e Arquiteto de Software

Como depurar pacotes NuGet com Source Link

Como depurar pacotes NuGet com Source Link

Qual é o jeito mais prático de depurar o código de um pacote NuGet? Neste artigo, mostro como utilizar o Source Link para criar uma experiência de depuração sólida e prática.

4 min de leitura

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
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
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
Habilitar servidores de símbolos

Nota

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.

Aviso

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
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
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
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
Conteúdo do diretório do servidor de fontes

Espero que este artigo seja útil para você!