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.
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.
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]
.
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].
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:
- DebuggerNonUserCodeAttribute informa ao depurador que o código ao qual ele é aplicado não é código do usuário.
- DebuggerHiddenAttribute oculta o código do depurador, mesmo que Apenas Meu Código esteja desativado.
- DebuggerStepThroughAttribute informa ao depurador para percorrer o código ao qual é aplicado, em vez de depurar o código.
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
<.*>
ou<.*
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.