Apenas Meu Código
Os desenvolvedores que usam as linguagens do .NET Framework estão familiarizados com o depurador Apenas Meu Código que considera chamadas de sistema, de estrutura e outras chamadas não usuário e recolhe essas chamadas nas janelas de pilha de chamadas. No Visual Studio 2013, o Apenas meu código foi estendido às linguagens C++ e JavaScript. Este tópico descreve detalhes específicos do uso do Apenas Meu Código em projetos do .NET Framework, nativos do C++ e de JavaScript.
Conteúdo
Habilitar ou desabilitar Apenas Meu Código
Apenas Meu Código do .NET Framework
Apenas Meu Código do C++
Apenas Meu Código do JavaScript
Habilitar ou desabilitar Apenas Meu Código
Para habilitar ou desabilitar Apenas Meu Código, escolha Opções e Configurações no menu Depurar. No nó Depuração / Geral, marque ou desmarque Habilitar Apenas Meu Código.
Dica
A opção Habilitar Apenas Meu Código é uma configuração global aplicada a todos os projetos do Visual Studio em todas as linguagens.
Substituir filtragem da pilha de chamadas
Em exibições da pilha de chamadas, como as janelas Pilha de Chamadas e Tarefas, Apenas Meu Código recolhe o código de não usuário em um quadro anotado rotulado como [External Code]. Para exibir os quadros recolhidos, escolha Mostrar Código Externo no menu de contexto da exibição da pilha de chamadas.
Dica
A definição Mostrar Código Externo é salva no perfil do usuário atual.Ela é aplicada a todos os projetos em todas as linguagens que são abertos pelo usuário.
Apenas Meu Código do .NET Framework
Código de usuário e de não usuário**|Comportamento de depuração|Comportamento de ponto de interrupção|**Comportamento de exceção
Código de usuário e de não usuário
Para distinguir código de usuário de código de não usuário, o Apenas Meu Código considera os projetos abertos, os arquivos de símbolos (.pdb) e otimizações de programa.
Se um binário é criado a partir de um projeto aberto do Visual Studio, ele considera sempre o código de usuário.
O depurador considera o código como sendo de não usuário quando o binário não é otimizado ou quando o arquivo .pdb não está disponível.
Três atributos também afetam o que o depurador considera como sendo Meu Código:
DebuggerNonUserCodeAttribute diz ao depurador que o código ao qual se aplica não é Meu Código.
DebuggerHiddenAttribute oculta o código do depurador, mesmo que Apenas Meu Código esteja desativado.
DebuggerStepThroughAttribute informa o depurador para percorrer o código ao qual é aplicado, em vez de depurar o código.
Todos os demais códigos são considerados código de usuário.
Comportamento de depuração
Quando você usa Depuração Completa (atalho de teclado: F11) em código de não usuário, o depurador percorre o código até a próxima declaração do usuário. Quando você usa Depuração Circular (teclado: Shift + F11), o depurador executa a próxima linha do código do usuário. Se nenhum código de usuário for encontrado, a execução continuará até que o aplicativo seja fechado, um ponto de interrupção seja atingido ou uma exceção ocorra.
Comportamento de ponto de interrupção
Quando Apenas Meu Código é habilitado, você pode escolher Interromper Tudo (teclado: Ctrl + Alt + Break) e interromper a execução em um local em que não há nenhum código do usuário a ser exibido. Quando isso acontece, a janela Sem Código Fonte será exibida. Se você escolher em um comando de etapa, o depurador leva você até a próxima linha do código do usuário.
Comportamento de exceção
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 de usuário será realçada em verde. A pilha de chamadas exibe um quadro anotado rotulado [Código Externo].
Apenas Meu Código do C++
Código de usuário e de não usuário**|Comportamento de depuração|Comportamento de exceção|Personalizar comportamento de depuração|**Personalizar comportamento da pilha de chamadas
Código de usuário e de não usuário
O Apenas Meu Código do C++ é diferente do Apenas Meu Código do .NET Framework e do JavaScript porque o comportamento de depuração é independente do comportamento da pilha de chamadas.
Pilhas de chamadas
Por padrão, o depurador considera estas funções como código de não usuário em janelas de pilha de chamadas:
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.
Depuração
Por padrão, somente as funções especificadas em arquivos *.natstepfilter na pasta %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers são consideradas código de não usuário.
Você pode criar seu próprio .natstepfilter e .natjmc para personalizar a depuração e o comportamento da janela pilha de chamadas em %USERPROFILE%\My Documents\Visual Studio 2013\Visualizers.
Comportamento de depuração
Quando você usa Depuração Completa (atalho de teclado: F11) em código de não usuário a partir de código de usuário, o depurador percorre o código até a próxima linha de código de usuário. Quando você usa Depuração Circular (teclado: Shift + F11), o depurador executa a próxima linha do código do usuário. Se nenhum código de usuário for encontrado, a execução continuará até que o aplicativo seja fechado, um ponto de interrupção seja atingido ou uma exceção ocorra.
Se o depurador for interrompido em um código de não usuário (por exemplo, se um comando Interromper Tudo parar em um código de não usuário), a depuração continua no código de não usuário.
Comportamento de exceção
Quando o depurador atinge uma exceção, ele parará na exceção independentemente de estar em código de usuário ou de não usuário. As opções Sem tratamento do usuário na caixa de diálogo Exceções são ignoradas.
Personalizar comportamento de depuração
Você pode especificar funções para percorrer listando-as como código de não usuário em arquivos *.natstepfilter.
Para especificar código de não usuário para todos os usuários do computador do Visual Studio, adicione o arquivo .natstepfilter à pasta %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers.
Para especificar código de não usuário para um usuário individual, adicione o arquivo .natstepfilter à pasta %USERPROFILE%\My Documents\Visual Studio 2013\Visualizers.
Os arquivos .natstepfilter são arquivos XML com esta sintaxe:
<?xml version="1.0" encoding="utf-8"?>
<StepFilter xmlns="https://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 |
---|---|
Função |
Obrigatório. Especifica uma ou mais funções como funções de não usuário. |
Name |
Obrigatório. 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 e minúsculas. |
Action |
Obrigatório. Um destes valores que diferenciam maiúsculas e minúsculas:
|
Personalizar comportamento da pilha de chamadas
Você pode especificar módulos, arquivos de origem e funções para serem tratados como código de não usuário em pilhas de chamadas especificando-os em arquivos *.natjmc.
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 de não usuário para um usuário individual, adicione o arquivo .natjmc à pasta %USERPROFILE%\My Documents\Visual Studio 2013\Visualizers.
Os arquivos .natjmc são arquivos XML com esta sintaxe:
<?xml version="1.0" encoding="utf-8"?>
<NonUserCode xmlns="https://schemas.microsoft.com/vstudio/debugger/jmc/2013">
<!-- 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ó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\*” /> 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ório. 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ório. O nome totalmente qualificado da função a ser tratada como código externo. |
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. |
Apenas Meu Código do JavaScript
Código de usuário e de não usuário**|Comportamento de depuração|Comportamento de ponto de interrupção|Comportamento de exceção|**Personalizar Apenas Meu Código
Código de usuário e de não usuário
Classificações de código
O Apenas Meu Código do JavaScript controla a depuração e a exibição da pilha de chamadas categorizando o código em uma destas classificações:
MyCode |
Código do usuário que você possui e controla. |
LibraryCode |
Código de não usuário de bibliotecas que você usa com frequência e do qual seu aplicativo depende para funcionar corretamente (por exemplo WinJS ou jQuery). |
UnrelatedCode |
Código de não usuário que pode ser executado no aplicativo, mas que você não possui e do qual seu aplicativo não depende diretamente para funcionar corretamente (por exemplo, o SDK de publicidade que exibe anúncios). Em projetos da Windows Store, todo código que é carregado no seu aplicativo a partir de um URI HTTP ou HTTPS também é considerado UnrelatedCode. |
O depurador do JavaScript classifica automaticamente estes tipos de código:
Script que é executado passando uma cadeia de caracteres à função eval fornecida pelo host é classificado como MyCode.
Script que é executado passando uma cadeia de caracteres ao construtor Function é classificado como LibraryCode.
Script contido em uma referência da estrutura, como WinJS ou Azure SDK, é classificado como LibraryCode.
Script que é executado passando uma cadeia de caracteres à função setTimeout, setImmediate ou setInterval é classificado como UnrelatedCode.
%VSInstallDirectory%\JavaScript\JustMyCode\mycode.default.wwa.json especifica outro código de usuário e de não usuário para todos os projetos em JavaScript do Visual Studio.
Você pode alterar as classificações padrão e classificar arquivos e URLs específicos adicionando um arquivo .json nomeado mycode.json à pasta raiz de um projeto.
Todos os demais códigos são classificados como MyCode.
Comportamento de depuração
Se uma função não é código de usuário (MyCode), Depuração Completa (atalho de teclado: F11) se comporta como Depuração Parcial (teclado: F10).
Se uma etapa começar em código de não usuário (LibraryCode ou UnrelatedCode), então a depuração temporária se comportará como se Apenas Meu Código não estiver habilitado. Assim que você percorrer de volta até o código de usuário, a depuração de Apenas Meu Código será habilitada novamente.
Quando uma etapa no código de usuário resultar na saída do contexto de execução atual (por exemplo, executar uma etapa na última linha de um manipulador de eventos), o depurador para na próxima linha de código de usuário executada. Por exemplo, se um retorno de chamada for executado em código LibraryCode, o depurador continuará até que a próxima linha de código de usuário seja executada.
Depuração Circular (teclado: Shift + F11) para na próxima linha de código de usuário. Se nenhum código de usuário for encontrado, a execução continuará até que o aplicativo seja fechado, um ponto de interrupção seja atingido ou uma exceção ocorra.
Comportamento de ponto de interrupção
Os pontos de interrupção definidos em qualquer código serão sempre atingidos independentemente da classificação desse código
Se a palavra-chave debugger for encontrada em:
Código LibraryCode, o depurador sempre será interrompido.
Código UnrelatedCode, o depurador não será interrompido.
Comportamento de exceção
Se ocorrer uma exceção não tratada em:
Código MyCode ou LibraryCode, o depurador sempre será interrompido.
Código UnrelatedCode, e o código MyCode ou LibraryCode estiver na pilha de chamadas, o depurador será interrompido.
Se as exceções de primeira opção estiverem habilitadas para a exceção na caixa de diálogo Exceções e a exceção for lançada em código LibraryCode ou UnrelatedCode:
Se a exceção for tratada, o depurador não será interrompido.
Se a exceção não for tratada, o depurador será interrompido.
Personalizar Apenas Meu Código
Para categorizar código de usuário e de não usuário para um único projeto do Visual Studio, adicione um arquivo .json denominado mycode.json à pasta raiz do projeto.
As classificações são executadas nesta ordem:
Classificações padrão
Classificações no arquivo %VSInstallDirectory%\JavaScript\JustMyCode\mycode.default.wwa.json
Classificações no arquivo mycode. json do projeto atual.
Cada etapa de classificação substitui as etapas anteriores. Um arquivo .json não é necessário para listar todos os pares chave-valor, e os valores de MyCode, Libraries e Unrelated podem ser matrizes vazias.
Os arquivos .json MyCode usam esta sintaxe:
{
"Eval" : "Classification",
"Function" : "Classification",
"ScriptBlock" : "Classification",
"MyCode" : [
"UrlOrFileSpec”,
. . .
"UrlOrFileSpec”
],
"Libraries" : [
"UrlOrFileSpec”,
. .
"UrlOrFileSpec”
],
"Unrelated" : [
"UrlOrFileSpec”,
. . .
"UrlOrFileSpec”
]
}
Eval, Function e ScriptBlock
Os pares chave-valor Eval, Function e ScriptBlock determinam como o código gerado dinamicamente é classificado.
Eval |
Script que é executado passando uma cadeia de caracteres à função eval fornecida pelo host. Por padrão, o script Eval é classificado como MyCode. |
Função |
Script que é executado passando uma cadeia de caracteres para o construtor Function. Por padrão, o script Function é classificado como LibraryCode. |
ScriptBlock |
Script que é executado passando uma cadeia de caracteres para a função setTimeout, setImmediate ou setInterval. Por padrão, o script ScriptBlock é classificado como UnrelatedCode. |
Você pode alterar o valor para um destas palavras-chave:
MyCode classifica o script como MyCode.
Library classifica o script como LibraryCode.
Unrelated classifica o script como UnrelatedCode.
MyCode, Libraries e Unrelated
Os pares chave-valor MyCode, Libraries e Unrelated especificam as URLs ou os arquivos que você deseja incluir em uma classificação:
MyCode |
Uma matriz de URLs ou arquivos classificados como MyCode. |
Libraries |
Uma matriz de URLs ou arquivos classificados como LibraryCode. |
Unrelated |
Uma matriz de URLs ou arquivos classificados como UnrelatedCode. |
A cadeia de caracteres de arquivo ou URL que contém um ou mais caracteres *, que correspondem a zero ou mais caracteres. * é equivalente à expressão regular .*.