Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Observação
Este artigo é específico do .NET Framework. Ele não se aplica a implementações mais recentes do .NET, incluindo o .NET 6 e versões posteriores.
Ao compilar código não gerenciado, é possível configurar um arquivo executável para depuração definindo alternativas do IDE ou opções de linha de comando. Por exemplo, você pode usar a opção de linha de comando /Zi no Visual C++ para solicitar que ele emita arquivos de símbolo de depuração (extensão de arquivo .pdb). Da mesma forma, a opção de linha de comando /Od informa ao compilador para desabilitar a otimização. O código resultante é executado mais lentamente, mas é mais fácil de depurar, caso isso seja necessário.
Ao compilar o código gerenciado do .NET Framework, compiladores como Visual C++, Visual Basic e C# compilam seu programa de origem em CIL (common intermediate language). Em seguida, o CIL é compilado com JIT, pouco antes da execução, no código do computador nativo. Assim como acontece com o código não-gerenciado, você pode configurar uma imagem executável para depuração definindo switches do IDE ou opções de linha de comando. Você também pode configurar a compilação JIT para depuração praticamente da mesma forma.
Essa configuração JIT tem dois aspectos:
Você pode solicitar que o compilador JIT gere informações de acompanhamento. Isso permite que o depurador combine uma cadeia de CIL com sua contraparte de código de máquina e rastreie onde as variáveis locais e os argumentos de função estão armazenados. No .NET Framework versão 2.0 e posterior, o compilador JIT sempre gera informações de acompanhamento, portanto, não é necessário solicitá-la.
Você pode solicitar que o compilador JIT não otimize o código do computador resultante.
Normalmente, o compilador que gera o CIL define essas opções do compilador JIT adequadamente, com base nas opções de linha de comando que você especifica, por exemplo, /Od.
Em alguns casos, talvez você queira alterar o comportamento do compilador JIT para que o código do computador gerado seja mais fácil de depurar. Por exemplo, talvez você queira gerar informações de acompanhamento JIT de um build de varejo ou controlar a otimização. Você pode fazer isso com um arquivo de inicialização (.ini).
Por exemplo, se o assembly que você deseja depurar for chamado MyApp.exe, você poderá criar um arquivo de texto chamado MyApp.ini, na mesma pasta que MyApp.exe, que contém estas três linhas:
[.NET Framework Debugging Control]
GenerateTrackingInfo=1
AllowOptimize=0
Você pode definir o valor de cada opção como 0 ou 1 e qualquer opção ausente usa como padrão 0. Configurar GenerateTrackingInfo como 1 e AllowOptimize como 0 facilita a depuração.
Do .NET Framework 2.0 em diante, o compilador JIT sempre gera informações de rastreamento, independentemente do valor de GenerateTrackingInfo; no entanto, o valor de AllowOptimize ainda tem um efeito. Ao usar o Ngen.exe (Gerador de Imagem Nativa) para precompilar a imagem nativa sem otimização, o arquivo .ini deve estar presente na pasta de destino AllowOptimize=0 quando Ngen.exe for executado. Se você tiver pré-compilado um assembly sem otimização, deverá remover o código pré-compilado usando o comando NGen.exe /desinstalar antes de executar novamente Ngen.exe para pré-compilar o código como otimizado. Se o arquivo .ini não estiver presente na pasta, por padrão Ngen.exe pré-compila o código como otimizado.
O System.Diagnostics.DebuggableAttribute controla as configurações de um assembly.
DebuggableAttribute inclui dois campos que controlam se o compilador JIT deve otimizar e/ou gerar informações de acompanhamento. No .NET Framework 2.0 e versões posteriores, o compilador JIT sempre gera informações de acompanhamento.
Para uma compilação de varejo, os compiladores não definem o DebuggableAttribute. Por padrão, o compilador JIT gera o código de máquina do maior desempenho, porém mais difícil de depurar. Habilitar o acompanhamento JIT reduz um pouco o desempenho e desabilitar a otimização reduz muito o desempenho.
O DebuggableAttribute aplica-se a um conjunto inteiro por vez, não a módulos individuais dentro do conjunto. As ferramentas de desenvolvimento devem, portanto, anexar atributos personalizados ao token de metadados do assembly, se um assembly já tiver sido criado ou à classe chamada System.Runtime.CompilerServices.AssemblyAttributesGoHere. Em seguida, a ferramenta ALink promove esses DebuggableAttribute atributos de cada módulo para o assembly do qual eles se tornam parte. Se houver um conflito, a operação ALink falhará.
Observação
Na versão 1.0 do .NET Framework, o compilador do Microsoft Visual C++ adiciona o DebuggableAttribute quando as opções do compilador /clr e /Zi são especificadas. Na versão 1.1 do .NET Framework, você deve adicionar manualmente DebuggableAttribute em seu código ou usar a opção do vinculador /ASSEMBLYDEBUG .