Depurar apenas o código do usuário com Apenas Meu Código

Apenas Meu Código é um recurso de depuração do Visual Studio que percorre automaticamente as chamadas para o sistema, a estrutura e outros códigos que não são de usuários. Na janela Pilha de Chamadas, Apenas Meu Código recolhe essas chamadas em quadros [Código Externo].

Apenas Meu Código funciona de maneira diferente em projetos .NET e C++.

Habilitar ou desabilitar Apenas Meu Código

Para a maioria das linguagens de programação, Apenas Meu Código está habilitado por padrão.

  • Para habilitar ou desabilitar Apenas Meu Código no Visual Studio, emFerramentas>Opções (ouDepurar>Opções) >Depuração>Geral, selecione ou desmarque Habilitar Apenas Meu Código.

Captura de tela de Habilitar Apenas Meu Código na caixa de diálogo Opções.

Captura de tela de Habilitar Apenas Meu Código na caixa de diálogo Opções.

Observação

Habilitar Apenas Meu Código é uma configuração global aplicada a todos os projetos do Visual Studio em todas as linguagens.

depuração Apenas Meu Código

Durante uma sessão de depuração, a janela Módulos mostra quais módulos de código o depurador está tratando como Meu Código (código do usuário), juntamente com seu status de carregamento de símbolo. Para obter mais informações, confira Familiarize-se mais com a forma como o depurador se anexa ao seu aplicativo.

Captura de tela do código do usuário na janela Módulos.

Captura de tela do código do usuário na janela Módulos.

Na janela Pilha de Chamadas ou Tarefas, Apenas Meu Código recolhe o código que não é de usuário em um quadro de código anotado esmaecido rotulado [External Code].

Captura de tela de Código Externo na janela Pilha de Chamadas.

Captura de tela de Código Externo na janela Pilha de Chamadas.

Dica

Para abrir Módulos, Pilha de Chamadas, Tarefas ou a maioria das outras janelas de depuração, você deve estar em uma sessão de depuração. Durante a depuração, em Depurar>Windows, selecione as janelas que você quer abrir.

Para exibir o código em um quadro [Código Externo] recolhido, clique com o botão direito na janela Pilha de Chamadas ou Tarefa e selecione Mostrar Código Externo no menu de contexto. As linhas de código externas expandidas substituem o quadro [Código Externo].

Captura de tela de Mostrar Código Externo na janela Pilha de Chamadas.

Captura de tela de Mostrar Código Externo na janela Pilha de Chamadas.

Observação

Mostrar Código Externo é uma configuração atual do criador de perfil de usuário que se aplica a todos os projetos em todos as linguagens abertas pelo usuário.

Clicar duas vezes em uma linha de código externa expandida na janela Pilha de Chamadas realça em verde a linha de código de chamada no código-fonte. Para DLLs ou outros módulos não encontrados ou carregados, uma página de símbolo ou origem não encontrada pode ser aberta.

A partir do Visual Studio 2022 versão 17.7, você pode descompilar automaticamente o código .NET clicando duas vezes no código externo na janela Pilha de chamadas. Para mais informações, consulte Gere código-fonte de assemblies .NET durante a depuração.

Apenas Meu Código do .NET

Em projetos .NET, Apenas Meu Código usa arquivos de símbolo (.pdb) e otimizações de programa para classificar o código de usuário e de não usuário. O depurador do .NET considera binários otimizados e arquivos .pdb não carregados como um código não usuário.

Três atributos do compilador também afetam o que o depurador do .NET considera ser código de usuário:

O depurador do .NET considera todos os outros códigos como código de usuário.

Durante a depuração do .NET:

  • Depurar>Intervir (ou F11) em etapas de código que não é de usuário sobre o código para a próxima linha de código do usuário.
  • Depurar>Circular (ou Shift+F11) no código que não é de usuário é executado para a próxima linha de código do usuário.

Se não houver mais código de usuário, a depuração continuará até que ele termine, atinja outro ponto de interrupção ou gere um erro.

Se o depurador intervir no código que não é de usuário (por exemplo, você usa Depurar>Interromper Tudo e pausar no código que não é de usuário), a janela Sem Origem será exibida. Em seguida, você pode usar um comando Depurar>Etapa para ir para a próxima linha de código do usuário.

Se uma exceção sem tratamento ocorre no código de não usuário, o depurador é interrompido na linha do código de usuário na qual a exceção foi gerada.

Se as exceções de primeira opção estiverem habilitadas para a exceção, a linha do código do usuário que chama será realçada em verde no código-fonte. A janela Pilha de Chamadas exibe o quadro anotado rotulado [Código Externo].

Apenas Meu Código do C++

A partir do Visual Studio 2017 versão 15.8, também há suporte para Apenas Meu Código para depuração passo a passo de código. Esse recurso também requer o uso da opção do compilador /JMC (depuração Apenas Meu Código). A opção está habilitada por padrão em projetos C++. Para a janela Pilha de Chamadas e o suporte à pilha de chamadas em Apenas Meu Código, a opção /JMC não é necessária.

Para ser classificado como código de usuário, o PDB do binário que contém o código do usuário deve ser carregado pelo depurador (use a janela Módulos para verificar o status de carregamento).

Para o comportamento da pilha de chamadas, como na janela Pilha de Chamadas, Apenas Meu Código em C++ considera apenas essas funções como código que não é de usuário:

  • Funções com informações de origem retiradas no respectivo arquivo de símbolos.
  • Funções nas quais os arquivos de símbolos indicam que não há nenhum arquivo de origem que corresponde ao quadro de pilhas.
  • Funções especificadas em arquivos *.natjmc na pasta %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers.

Para comportamento da depuração passo a passo de código, Apenas Meu Código em C++ considera apenas essas funções como código que não é de usuário:

  • Funções para as quais o arquivo PDB correspondente não foi carregado no depurador.
  • Funções especificadas em arquivos *.natjmc na pasta %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers.

Observação

Para dar suporte à depuração de passo a passo de código em Apenas Meu Código, o código C++ deve ser compilado usando os compiladores MSVC no Visual Studio 15.8 Preview 3 ou posterior, e a opção do compilador /JMC deve ser habilitada (está habilitada por padrão). Para obter detalhes adicionais, confira Personalizar o comportamento de depuração passo a passo de código e pilha de chamadas em C++ e esta postagem no blog. Para o código compilado usando um compilador mais antigo, os arquivos .natstepfilter são a única maneira de personalizar a depuração passo a passo de código, que é independente de Apenas Meu Código. Confira Personalizar o comportamento da depuração passo a passo de C++.

Durante a depuração do C++, o código não usuário é ignorado por padrão. Durante a depuração do C++:

  • Depurar>Intervir (ou F11) em etapas de código não usuário sobre o código ou executadas para a próxima linha de código do usuário, se Intervir for chamado do código não usuário.
  • Depurar>Sair (ou Deslocar+F11) em execuções de código não usuário para a próxima linha de código do usuário (fora do quadro de pilha atual).

Se não houver mais código de usuário, a depuração continuará até que ele termine, atinja outro ponto de interrupção ou gere um erro.

Se o depurador intervir em um código que não é de usuário (por exemplo, usar Depurar>Interromper Tudo e pausar em um código que não é de usuário), a depuração passo a passo continuará no código que não é de usuário.

Se o depurador atingir uma exceção, ele será interrompido na exceção, seja no código do usuário ou que não é do usuário. As opções Sem tratamento do usuário na caixa de diálogo Configurações de Exceção são ignoradas.

Personalizar a pilha de chamadas de C++ e o comportamento da depuração passo a passo de código

Para projetos em C++, você pode especificar os módulos, os arquivos de origem e as funções que a janela Pilha de Chamadas trata como código que não é de usuário especificando-os em arquivos *.natjmc. Essa personalização também se aplica à depuração passo a passo de código se você estiver usando o compilador mais recente (confira Apenas Meu Código em C++).

  • Para especificar código de não usuário para todos os usuários do computador do Visual Studio, adicione o arquivo .natjmc à pasta %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers.
  • Para especificar código que não é de usuário para um usuário individual, adicione o arquivo .natjmc à pasta %USERPROFILE%\Meus Documentos\<versão do Visual Studio>\Visualizadores.

Um arquivo .natjmc é um arquivo XML com essa sintaxe:

<?xml version="1.0" encoding="utf-8"?>
<NonUserCode xmlns="http://schemas.microsoft.com/vstudio/debugger/jmc/2015">

  <!-- Modules -->
  <Module Name="ModuleSpec" />
  <Module Name="ModuleSpec" Company="CompanyName" />

  <!-- Files -->
  <File Name="FileSpec"/>

  <!-- Functions -->
  <Function Name="FunctionSpec" />
  <Function Name="FunctionSpec" Module ="ModuleSpec" />
  <Function Name="FunctionSpec" Module ="ModuleSpec" ExceptionImplementation="true" />

</NonUserCode>

Atributos do elemento de módulo

Atributo Descrição
Name Obrigatórios. O caminho completo do módulo ou dos módulos. Você pode usar os caracteres curinga do Windows ? (zero ou um caractere) e * (zero ou mais caracteres). Por exemplo,

<Module Name="?:\3rdParty\UtilLibs\*" />

informa o depurador para tratar todos os módulos em \3rdParty\UtilLibs em qualquer unidade como código externo.
Company Opcional. O nome da empresa que publica o módulo inserido no arquivo executável. Você pode usar esse atributo para resolver a ambiguidade dos módulos.

Atributos do elemento de arquivo

Atributo Descrição
Name Obrigatórios. O caminho completo do arquivo ou arquivos de origem a serem tratados como código externo. Você pode usar os caracteres curinga do Windows ? e * quando especificar o caminho.

Atributos do elemento de função

Atributo Descrição
Name Obrigatórios. O nome totalmente qualificado da função a ser tratada como código externo. ou pode usar os caracteres ? curinga do Windows e * ao especificar o caminho.
Module Opcional. O nome ou o caminho completo do módulo que contém a função. Você pode usar esse atributo para resolver a ambiguidade de funções com o mesmo nome.
ExceptionImplementation Quando definido como true, a pilha de chamadas exibe a função que lançou a exceção em vez dessa função.

Personalizar o comportamento da depuração passo a passo de C++ independentemente das configurações de Apenas Meu Código

Em projetos C++, você pode especificar funções para percorrer listando-as como funções NoStepInto em arquivos *.natstepfilter. As funções listadas em arquivos *.natstepfilter não dependem das configurações de Apenas Meu Código. Uma função NoStepInto informa ao depurador para percorrer a função, mesmo que ela chame algumas funções StepInto ou outro código de usuário. Ao contrário das funções listadas em .natjmc, o depurador entrará na primeira linha de código do usuário dentro da função NoStepInto.

  • Para especificar o código que não é de usuário para todos os usuários do Visual Studio, adicione o arquivo .natstepfilter à pasta %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers.
  • Para especificar o código que não é de usuário para um usuário individual, adicione o arquivo .natstepfilter à pasta %USERPROFILE%\Meus Documentos\>versão do Visual Studio\Visualizadores<.

Observação

Algumas extensões de terceiros podem desabilitar a funcionalidade .natstepfilter.

Um arquivo .natstepfilter é um arquivo XML com esta sintaxe:

<?xml version="1.0" encoding="utf-8"?>
<StepFilter xmlns="http://schemas.microsoft.com/vstudio/debugger/natstepfilter/2010">
    <Function>
        <Name>FunctionSpec</Name>
        <Action>StepAction</Action>
    </Function>
    <Function>
        <Name>FunctionSpec</Name>
        <Module>ModuleSpec</Module>
        <Action>StepAction</Action>
    </Function>
</StepFilter>

Elemento Descrição
Function Obrigatórios. Especifica uma ou mais funções como funções de não usuário.
Name Obrigatórios. Uma expressão regular formatada como ECMA-262 que especifica o nome completo da função a ser correspondida. Por exemplo:

<Name>MyNS::MyClass::.*</Name>

informa ao depurador que todos os métodos em MyNS::MyClass devem ser considerados como código de não usuário. A correspondência diferencia maiúsculas e minúsculas.
Module Opcional. Uma expressão regular formatada como ECMA-262 que especifica o caminho completo do módulo que contém a função. A correspondência não diferencia maiúsculas de minúsculas.
Action Obrigatórios. Um destes valores que diferenciam maiúsculas e minúsculas:

NoStepInto – instrui o depurador a depurar parcialmente a função.
StepInto – instrui o depurador a intervir na função, substituindo qualquer outro NoStepInto pela função correspondente.

Informações adicionais sobre arquivos .natstepfilter e .natjmc

  • A partir do Visual Studio 2022 versão 17.6, você pode adicionar arquivos .natjmc e .natstepfilter diretamente à solução ou ao projeto.

  • Erros de sintaxe nos arquivos .natstepfilter e .natjmc não são relatados na janela Saída do depurador.

  • Diferente dos arquivos .natvis, os arquivos .natstepfilter e .natjmc não são recarregados a quente. Em vez disso, esses arquivos são recarregados perto do início da sessão de depuração.

  • Para funções de modelo, o uso de &lt;.*&gt; ou &lt;.* no nome pode ser útil.

Apenas Meu Código do JavaScript

Para projetos .esproj no Visual Studio 2022, o Visual Studio Code usa um arquivo launch.json para configurar e personalizar o depurador. launch.json é um arquivo de configuração do depurador.

O Visual Studio anexa o depurador somente ao código do usuário. Para projetos .esproj , você pode definir o código do usuário (ou seja, as configurações Apenas Meu Código ) no Visual Studio usando a skipFiles configuração no launch.json. Essa configuração funciona da mesma forma que as configurações launch.json no VS Code. Para obter mais informações sobre skipFiles, consulte Ignorando código desinteressante.