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.

Habilitar Just My Code, na caixa de diálogo Opções

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.

  1. Se um binário é criado a partir de um projeto aberto do Visual Studio, ele considera sempre o código de usuário.

  2. 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:

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:

  • NoStepInto – informa o depurador para percorrer a função correspondente.

  • StepInto – informa o depurador para percorrer funções correspondentes, substituindo qualquer outro NoStepInto pelas funções correspondentes.

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:

  1. Classificações padrão

  2. Classificações no arquivo %VSInstallDirectory%\JavaScript\JustMyCode\mycode.default.wwa.json

  3. 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 .*.