Depurar apenas o código do usuário com Just My Code
Just My Code é um recurso de depuração do Visual Studio que ignora automaticamente chamadas para o sistema, framework, e outro código não pertencente ao usuário. Na janela pilha de chamadas, Just My Code condensa estas chamadas em quadros de [Código Externo].
Just My Code funciona de forma diferente em projetos .NET e C++.
Ativar ou desativar Just My Code
Para a maioria das linguagens de programação, Just My Code está habilitado por padrão.
- Para habilitar ou desabilitar Just My Code no Visual Studio, em Tools>Options (ou Debug>Options) >Debugging>General, selecione ou desmarque Enable Just My Code.
Observação
Enable Just My Code é uma configuração global que se aplica a todos os projetos do Visual Studio em todos os idiomas.
Apenas a depuração do 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ímbolos. Para obter mais informações, consulte Familiarize-se com a forma como o depurador se conecta ao seu aplicativo.
Na janela Call Stack ou Tasks, Just My Code recolhe o código não pertencente ao utilizador numa moldura de código cinzento anotada rotulada [External Code]
.
Dica
Para abrir os módulos , a pilha de chamadas , as tarefas ou a maioria das outras janelas de depuração, deve-se estar em uma sessão de depuração. Durante a depuração, em Depurar>Windows, selecione as janelas que deseja abrir.
Para exibir o código em um quadro de recolhido [Código Externo], clique com o botão direito do mouse na de Pilha de Chamadas ou na janela de Tarefas e selecione Mostrar de Código Externo no menu de contexto. As linhas de código externo expandidas substituem o quadro [External Code].
Observação
Mostrar Código Externo é uma configuração atual do perfil de utilizador que se aplica a todos os projetos em todos os idiomas que forem abertos pelo utilizador.
Clicar duas vezes em uma linha de código externo expandida na janela da Pilha de Chamadas realça a linha de código chamador em verde no código-fonte. Para DLLs ou outros módulos não encontrados ou carregados, pode abrir-se uma página indicando que um símbolo ou a origem não foram encontrados.
A partir do Visual Studio 2022 versão 17.7, é possível autodescompilar o código .NET clicando duas vezes em código externo na janela Call Stack. Para obter mais informações, consulte Gerar código-fonte de assemblies .NET ao depurar.
.NET Apenas Meu Código
Em projetos .NET, Just My Code usa arquivos de símbolo (.pdb) e otimizações de programa para classificar o código de usuário e não-usuário. O depurador .NET considera binários otimizados e arquivos de .pdb .pdb não carregado s como código não-usuário.
Três atributos do compilador também afetam o que o depurador .NET considera ser código de usuário:
- DebuggerNonUserCodeAttribute diz ao depurador que o código ao qual ele é aplicado não é código de usuário.
- DebuggerHiddenAttribute oculta o código do depurador, mesmo que Just My Code esteja desativado.
- DebuggerStepThroughAttribute instrui o depurador para percorrer o código ao qual é aplicado, em vez de inserir-se no código.
O depurador .NET considera todos os outros códigos como código de usuário.
Durante a depuração no .NET:
- Depurar>Step Into (ou F11) em etapas de código de não-usuário sobre o código para a próxima linha de código de usuário.
- Debug>Step Out (ou Shift+F11) em código que não seja de usuário avança para a próxima linha de código de usuário.
Se não houver mais código de usuário, a depuração continuará até terminar, atingir outro ponto de interrupção ou lançar um erro.
Se o depurador interromper no código que não é do utilizador (por exemplo, você usa Depurar>Interromper Tudo e pausar no código que não é do utilizador), a janela Sem origem será exibida. Em seguida, você pode usar um comando Debug>Step para ir para a próxima linha de código do usuário.
Se ocorrer uma exceção não tratada em código que não seja de usuário, o depurador quebrará na linha de código do usuário onde a exceção foi gerada.
Se as exceções de primeira chance estiverem ativadas para a exceção, a linha de código de utilizador que fez a chamada fica realçada em verde no código-fonte. A janela Call Stack exibe o quadro anotado rotulado [Código externo].
C++ Apenas Meu Código
A partir do Visual Studio 2017 versão 15.8, Just My Code para revisão de código também é suportado. Esse recurso também requer o uso do /JMC (Just my code debugging) switch de compilador. O switch é habilitado por padrão em projetos C++. Para janela de de pilha de chamadas e suporte de pilha de chamadas em Just My Code, a opção /JMC não é necessária.
Para ser classificado como código de usuário, o PDB para o binário que contém o código de 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 Call Stack, Just My Code em C++ considera apenas essas funções como código não pertencente ao utilizador:
- Funções com informações de origem removidas no seu ficheiro de símbolos.
- Funções em que os ficheiros de símbolos indicam que não há nenhum ficheiro de origem correspondente ao frame da pilha.
- As funções especificadas em arquivos de *.natjmc na pasta %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers.
Para o comportamento de execução passo a passo de código, Just My Code em C++ considera apenas essas funções como código não pertencente ao utilizador:
- Funções para as quais o arquivo PDB correspondente não foi carregado no depurador.
- As funções especificadas nos arquivos *.natjmc na pasta %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers.
Observação
Para suporte à revisão de código em Just My Code, o código C++ deve ser compilado usando os compiladores MSVC no Visual Studio 15.8 Preview 3 ou posterior, e a opção de compilador /JMC deve ser habilitada (ela é habilitada por padrão). Para obter detalhes adicionais, consulte Personalizar a pilha de chamadas C++ e o comportamento de revisão de código e esta postagem de blog. Para código compilado usando um compilador mais antigo, os arquivos .natstepfilter são a única maneira de personalizar o passo a passo do código, que é independente do Just My Code. Consulte Personalizar o comportamento de passo-a-passo do C++.
Durante a depuração C++, o código que não é do usuário é ignorado por padrão. Durante a depuração no C++:
- Depurar>Step Into (ou F11) quando em código de não-usuário passa por cima do código ou avança para a próxima linha de código de usuário, se Step Into for chamado a partir de código de não-usuário.
- Debug>Step out (ou Shift+F11) em código que não é de usuário é executado para a próxima linha de código de usuário (fora do quadro de pilha atual).
Se não houver mais código de usuário, a depuração continuará até terminar, atingir outro ponto de interrupção ou lançar um erro.
Se o depurador interromper no código de não-utilizador (por exemplo, se utilizar Depurar>Interromper Todos e fizer pausa no código de não-utilizador), a depuração continuará no código de não-utilizador.
Se o depurador atingir uma exceção, ele para na exceção, seja no código de usuário ou não-usuário. Opções de não tratadas pelo usuário na caixa de diálogo Configurações de exceção são ignoradas.
Personalizar a pilha de chamadas C++ e o comportamento de navegação pelo código
Para projetos C++, você pode especificar os módulos, arquivos de origem e funções que a janela Call Stack trata como código não-usuário, especificando-os em arquivos de *.natjmc. Esta personalização também se aplica ao passo a passo no código se estiver a usar o compilador mais recente (consulte C++ Just My Code).
- Para especificar código não gerado pelo utilizador para todos os utilizadores do computador que executa o Visual Studio, adicione o ficheiro .natjmc à pasta %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers.
- Para especificar o código de não-usuário para um utilizador individual, adicione o arquivo .natjmc à pasta %USERPROFILE%\My Documents\ versão do Visual Studio<>\Visualizers.
Um arquivo de .natjmc é um arquivo XML com esta 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 Módulo
Atributo | Descrição |
---|---|
Name |
Necessário. 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\*" /> instrui o depurador a tratar todos os módulos em \3rdParty\UtilLibs em quaisquer unidades como código externo. |
Company |
Opcional. O nome da empresa que publica o módulo incorporado no arquivo executável. Você pode usar esse atributo para desambiguar os módulos. |
Atributos do elemento File
Atributo | Descrição |
---|---|
Name |
Necessário. O caminho completo do arquivo de origem ou arquivos a serem tratados como código externo. Você pode usar os caracteres curinga do Windows ? e * ao especificar o caminho. |
Atributos do elemento Função
Atributo | Descrição |
---|---|
Name |
Obrigatório. O nome totalmente qualificado da função a ser tratada como código externo. Você pode usar os caracteres curinga do Windows ? e * ao especificar o caminho. |
Module |
Opcional. O nome ou caminho completo para o módulo que contém a função. Você pode usar esse atributo para desambiguar 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 de exibir esta função. |
Personalizar o comportamento de depuração do C++ independentemente das configurações do Just My Code
Em projetos C++, você pode especificar funções a serem substituídas listando-as como funções NoStepInto em arquivos de *.natstepfilter. As funções listadas nos arquivos *.natstepfilter não dependem das configurações de Just My Code. Uma função NoStepInto instrui o depurador a saltar sobre a função, mesmo que esta chame algumas funções StepInto ou outro código de utilizador. Ao contrário das funções listadas em .natjmc, o depurador avançará para a primeira linha de código do usuário dentro da função NoStepInto.
- Para especificar o código não-usuário para todos os usuários locais do Visual Studio, adicione o arquivo de .natstepfilter à pasta %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers.
- Para especificar código não utilizado pelo usuário para um usuário individual, adicione o arquivo .natstepfilter à pasta %USERPROFILE%\My Documents\<versão do Visual Studio>\Visualizers.
Observação
Algumas extensões de terceiros podem desativar a funcionalidade de .natstepfilter.
Um arquivo de .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ório. Especifica uma ou mais funções como funções que não são de usuário. |
Name |
Obrigatório. Uma expressão regular formatada ECMA-262 especificando o nome completo da função para corresponder. Por exemplo:<Name>MyNS::MyClass::.*</Name> Informa ao depurador que todos os métodos em MyNS::MyClass devem ser considerados código não-usuário. A correspondência diferencia maiúsculas de minúsculas. |
Module |
Opcional. Uma expressão regular formatada ECMA-262 especificando o caminho completo para o módulo que contém a função. A correspondência não diferencia maiúsculas de minúsculas. |
Action |
Necessário. Um destes valores sensíveis a maiúsculas e minúsculas:NoStepInto - diz ao depurador para passar por cima da função.StepInto - diz ao depurador para entrar na função, substituindo qualquer outro NoStepInto para a função correspondente. |
Informações adicionais sobre .natstepfilter e arquivos de .natjmc
A partir do Visual Studio 2022 versão 17.6, pode adicionar os ficheiros .natjmc e .natstepfilter diretamente à solução ou ao projeto.
Erros de sintaxe nos arquivos .natstepfilter e .natjmc não são exibidos na janela de saída do depurador.
Ao contrário arquivos .natvis, .natstepfilter e arquivos .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.
JavaScript Apenas Meu Código
Para projetos de .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 de .esproj, você pode configurar o código do usuário (ou seja, apenas meu código configurações) no Visual Studio usando a configuração skipFiles
no launch.json. Essa configuração funciona da mesma forma que as configurações de launch.json no VS Code. Para obter mais informações sobre skipFiles, consulte Ignorar código irrelevante.