O que significa “Não é possível avaliar a expressão porque o código do método atual é otimizado.” significar?

StackOverflow https://stackoverflow.com/questions/131628

Pergunta

Eu escrevi algum código com um monte de recursão, que leva um pouco de tempo para completar. Sempre que eu "pause" a correr para olhar para o que está acontecendo eu recebo:

Não é possível avaliar a expressão porque o código do método atual é otimizado.

Eu acho que entendo o que isso significa. No entanto, o que me intriga é que depois de eu acertar o passo, o código não é "otimizada" mais, e posso olhar para os meus variáveis. Como isso acontece? Como pode o back flip código e para trás entre código otimizado e não optimzed?

Foi útil?

Solução

O depurador usa FuncEval para permitir que você "olhada" variáveis. FuncEval requer fios para ser parado em código gerenciado em um ponto seguro GarbageCollector. Manualmente "pausar" a correr no IDE faz com que os tópicos para parar o mais cedo possível. Seu código altamente recursiva tendem a parar em um ponto perigoso. Por isso, o depurador é incapaz de avaliar expressões.

Pressionando F10 irá se mover para o próximo ponto Funceval Seguro e permitirá avaliação da função.

Para mais informações revisar os regras de FuncEval .

Outras dicas

Enquanto a linha DEBUG.BREAK () está no topo da pilha de chamadas que você não pode expressões eval. Isso porque essa linha é otimizado. Prima F10 para passar para a próxima linha - uma linha válida de código -. E o relógio irá funcionar

Você está provavelmente tentando depurar seu aplicativo no modo de versão, em vez de modo de depuração, ou você tem otimizações ativada nas suas configurações de compilação.

Quando o código é compilado com otimizações, algumas variáveis ??são jogados fora, uma vez que não são mais usados ??na função, que é por isso que você está recebendo essa mensagem. No modo de depuração com otimizações desativadas, você não deve ter esse erro.

Esta me deixou louco. Tentei ligar com código gerenciado e nativo -. Não ir

Isso funcionou para mim e eu finalmente foi capaz de avaliar todas as expressões:

  • Vá para o Projeto / Propriedades
  • Selecione a guia Build e clique Avançado ...
  • Certifique-se de informações de depuração está definido como "full" (Não pdb-only)
  • Debug seu projeto - voila

A seguir trabalhou para mim, graças @Vin.

Eu tive esse problema quando eu estava usando VS 2015. Minha solução: configuração tem (Debug) selecionada. Eu resolvi isso desmarcando a propriedade Optimize Code sob propriedades do projeto.

Project (clique direito) => Propriedades => Construir (separador) => Código Optimize desmarque

Procure uma chamada de função com muitos parâmetros e tentar diminuir o número até a depuração retornos.

Certifique-se de que você não tem algo parecido

[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]

no seu AssemblyInfo

amigo de um amigo da Microsoft enviou esta: http://blogs.msdn.com/rmbyers/archive/2008/08/16/Func_2D00_eval-can-fail-while-stopped-in -a-non_2D00_optimized de gestão-method-that-empurra-mais-que-256-argumento-bytes-aspx

O problema mais provável é que sua pilha de chamadas está sendo otimizado porque o seu método de assinatura é muito grande.

tive o mesmo problema, mas foi capaz de resolvê-lo, desligando trapping exceção no depurador. Clique [Debug] [Exceções] e definir as exceções a "User-não tratada".

Normalmente eu tenho esta fora, mas ele vem a calhar de vez em quando. Eu só precisa se lembrar de desligá-lo quando eu terminar.

Eu tive esse problema quando eu estava usando VS 2010. configuração da solução My tem (Debug) selecionada. Eu resolvi isso desmarcando a propriedade Código Optimize sob propriedades do projeto. Projeto (clique direito) => Propriedades => Construir (separador) => Código Optimize desmarque

No meu caso eu tinha 2 projectos na minha solução e foi executando um projeto que não era o projeto de inicialização. Quando eu mudei para início do projeto a depuração começou a trabalhar novamente.

Espero que ajude alguém.

Avaliação:

Em .NET, “função de avaliação (funceval)” é a capacidade de CLR para injetar alguma chamada arbitrária enquanto o depurado está parado em algum lugar. Funceval se encarrega de rosca escolhido do depurador para executar método solicitado. Uma vez acabamentos funceval, ele dispara um evento de depuração. Tecnicamente, CLR definiram maneiras para depurador para emitir um funceval.

CLR permite iniciar funceval apenas sobre os tópicos que estão em GC ponto seguro (ou seja, quando o fio não vai bloquear GC) e Funceval Seguro (FESafe) ponto (ou seja, onde CLR pode realmente fazer o hijack para o funceval.) Em conjunto . Assim, os possíveis cenários para CLR, um segmento deve ser:

  1. parou em código gerenciado (e em um ponto seguro GC): Isto implica que não podemos fazer um funceval em código nativo. Desde então, o código nativo é fora do controle da CLR, é incapaz de configurar o funceval.

  2. parou em um 1º acaso ou não processada conseguiu exceção (e em um ponto seguro GC): ou seja no momento da exceção, para inspecionar o máximo possível para determinar por que essa exceção ocorreu. (Por exemplo:. Depurador pode tentar avaliar e ver a propriedade Message on exceção gerada)

No geral, formas comuns de parar em código gerenciado incluem parando em um ponto de interrupção, etapa, chamada Debugger.Break, interceptando uma exceção, ou em um início de discussão. Isso ajuda a avaliar o método e expressões.

possíveis resoluções: Com base na avaliação, se thread não está em uma FESafe e GCSafe pontos, CLR não será capaz de seqüestrar o fio para iniciar funceval. Geralmente, a seguir ajuda a garantir que os iniciados funceval quando esperado:

Etapa # 1:

Certifique-se de que você não está tentando depurar uma compilação “Release”. Lançamento é totalmente otimizado e, portanto, vai levar ao erro na discussão. Usando a barra de ferramentas padrão ou o Configuration Manager, você pode alternar entre Debug e Release.

Etapa # 2:

Se você ainda receber o erro, a opção de depuração pode ser definido para a otimização. Verificar e desmarque a opção “código Optimize” propriedade no âmbito do projecto “Propriedades”:

Clique direito do Projeto Selecione a opção “Propriedades” Vá para a aba “construir” Desmarque a opção “código Optimize”

Etapa # 3:

Se você ainda receber o erro, modo de depuração Informações podem estar incorretas. Verifique e ajuste-o para “cheio” em “configurações de compilação avançadas”:

Clique direito do Projeto Selecione a opção “Propriedades” Vá para a aba “construir” Clique no botão “Avançado” Set “Debug Info” como “cheia”

Etapa # 4:

Se você ainda enfrentar o problema, tente o seguinte:

Faça um “Clean” e, em seguida, um “Reconstruir” do seu arquivo de solução Durante a depuração: Vá para a janela módulos (Menu VS -> Debug -> Windows -> Modules) Encontre o seu conjunto na lista de módulos carregados. Verifique o caminho listado contra o carregado de montagem é o que você espera que ele seja Verifique a Timestamp modificada do arquivo para confirmar que a montagem foi na verdade reconstruída Verifique se o módulo carregado é otimizado ou não

Conclusão:

Não é um erro, mas uma informação baseada em certas configurações e como projetado com base em como .NET runtime funciona.

No meu caso eu estava em queridos do modo de desengate eu mudei para depurar tudo funcionou

Eu tive um problema semelhante e ele ficou resolvido quando eu construir a solução no modo de depuração e substituiu o arquivo PDB no caminho de execução.

Eu acredito que o que você está vendo é um resultado das otimizações - às vezes uma variável será reutilizado - particularmente aqueles que são criados na pilha. Por exemplo, suponha que você tenha um método que usa dois inteiros (locais). O primeiro número inteiro é declarado no início do método, e é usado apenas como um contador para um laço. Seu segundo inteiro é usado após o loop foi concluída, e armazena o resultado de um cálculo que está escrito depois para arquivo. Neste caso, o otimizador pode decidir reutilizar o seu primeiro inteiro, salvando o código necessário para o segundo inteiro. Quando você tentar olhar para o segundo inteiro no início, você receber a mensagem que você está perguntando sobre "Não é possível avaliar a expressão". Embora eu não possa explicar as circunstâncias exatas, é possível para o otimizador para transferir o valor do segundo inteiro em um item de pilha separado mais tarde, resultando em você, em seguida, ser capaz de acessar o valor do depurador.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top