Pergunta

Tome a seguinte função:

DataTable go() {
    return someTableAdapter.getSomeData();
}

Quando eu definir um ponto de interrupção nesta função, existe a possibilidade de inspecionar o valor retornado? go() está diretamente acoplado a um datagrid em uma página .aspx.

A única maneira de inspecionar a tabela de dados devolvidos é usar uma variável temporária. No entanto, isso é um pouco inconveniente. não há outro caminho?

Foi útil?

Solução

Não que eu saiba. Note que se você do adicionar uma variável, ele será removido pelo compilador em compilações de qualquer maneira ...

Update: Esta funcionalidade foi adicionada a VS2013. Você pode ver os valores de retorno na autos janelas ou uso $ReturnValue na janela do relógio / imediato.

O valor só pode ser visto logo após retornar da função, portanto, a maneira mais fácil de acessá-lo é colocando um ponto de interrupção na chamada de função e passar por cima (F10) a chamada.


Atualização para VS2015: boo! infelizmente, não parecem estar em VS2015 (devenv v14)
Atualização para o VS2017: ele está de volta. (Devenv v15)

Outras dicas

Isto pode ser feito no Visual Studio 2013, com CLR 4.5.1 acordo com o site de feedback do cliente . Não estava disponível em versões anteriores para C #.

(Visual Studio 2008 e no início apoiaram para VB.NET. Tem sido sempre disponível para desenvolvedores C / C ++.)

Eu concordo que isso é uma coisa muito útil ter: não só vendo o valor de retorno do método antes de pisar fora dele, mas também vendo o valor de retorno de métodos Eu só passou por cima. I implementado como parte de uma extensão comercial do Visual Studio chamada " OzCode ".

Com ele, você pode visualizar valores de retorno do método direita no editor de código, como uma espécie de HUD-display:

Declaração Visualization

Para obter mais informações, consulte este vídeo .

De acordo com a Microsoft, não há nenhuma maneira de implementar isso de forma confiável com código gerenciado. Este é um problema que eles estão conscientes e estão trabalhando em:

Para aqueles lá fora que têm experiência de depuração C ++ nativo ou código VB6, você pode ter usado um recurso onde os valores de retorno de função são fornecidos para você na janela de Autos. Infelizmente, esta funcionalidade não existe para código gerenciado. Enquanto você pode contornar esse problema, atribuindo os valores de retorno a uma variável local, isso não é tão conveniente, pois requer modificar seu código. Em código gerenciado, é um complicado muito a determinar o que o valor de retorno de uma função que você passou por cima. Nós percebemos que não poderíamos fazer a coisa certa consistentemente aqui e por isso nós removemos o recurso em vez de lhe dar resultados incorretos no depurador. No entanto, queremos trazer isso de volta para você e nossas equipes CLR e depurador está olhando para um número de potenciais soluções para este problema. Infelizmente, este não é farão parte de 11 Visual Studio.

https://connect.microsoft.com/VisualStudio/feedback/details/597933/add-a-return-pseudo-variable-to-the-visual-studio-debugger-for-net- código

De acordo com a resposta atualmente aceita por Marc Gravell:

Este funcionalidade foi adicionada ao Visual Studio 2013 . Você pode ver o retorno valores nas janelas de automóveis ou usar $ ReturnValue no relógio / imediato janela

Essa resposta também afirmou que esta funcionalidade não funciona no Visual Studio 2015. Este não é (totalmente) true. Em Examine os valores de retorno de chamadas de método há a seguinte nota:

Você deve ter os avaliadores de expressão legado ligado para $ ReturnValue para ser reconhecido (Ferramentas / Opções / depuração / Use o legado C # e avaliadores de expressão VB ). Caso contrário, você pode usar $ ReturnValue1 .

Eu testei isso no Visual Studio 2015 Empresa:

  • Com avaliadores de expressão legados desligado: única $ ReturnValue1 funciona
  • Com avaliadores de expressão legado ligado: ambos $ ReturnValue e $ ReturnValue1 trabalho

Se você vá ao menu Ferramentas ? Opções , IntelliTrace, e alterar a configuração para eventos de coleta e informação de chamada.

Você pode voltar para o evento de chamada anterior ( Ctrl + Mudança + F11 ) e ver o valor temporário retornado da chamada de método na janela autos como uma criança do nome do método.

Isto não é mostrando-lhe o valor de retorno para o método que você está. Isso só mostra-lhe o valor de retorno do último método chamado no método atual.

Assim, é bom para

DataTable go(){return someTableAdapter.getSomeData();}

, pois mostra-lhe o valor de retorno para someTableAdapter.getSomeData().

Mas não para:

int go(){return 100 * 99;}

velho truque dos pré .NET dias: Abra a janela de Registros e olhar para o valor do registrador EAX. Este contém o valor de retorno da última função chamada.

Ao sair do método Go () usando Shift-F11, e depois no "Autos" janela de depuração irá mostrar o valor de retorno da chamada do método que apenas retirado da pilha (neste caso, o go () método que é o que você quiser). Este é o comportamento no Visual Studio 2005; Eu não usei o Visual Studio 2008, então eu não sei se este se comporta da mesma forma nessa versão.

Sim, há uma maneira muito agradável. Uma desvantagem significativa é que você teria que esperar por 5, talvez 6 anos. Desde que eu ver que você postou em novembro de 2008, eu sugiro que você waaaaaa ...

... aaaait. E voila! Só para você, MS lançou a última Visual Studio 2013 , onde é uma característica padrão acessível a partir dos menus durante a execução no modo de depuração (menu Debug ? Windows ? Autos ).

Há uma série de soluções alternativas, mas nenhum parece satisfatório.

Para citar John Skeet abaixo (comentário em uma resposta agora suprimido):

Ainda parece inconveniente para mim - especialmente se você não sabe que valor de retorno você está indo para necessidade antes de iniciar a depuração. eu realmente não quero ter que ter um temporário desordenar variável até meu código cada vez que eu voltar anything.t

Em teoria, o depurador pode ter um return-variável. Afinal de contas: é apenas uma variável na pilha:

unsafe {
  int * sp = stackalloc int[1];
  try {
    return a+b;
  }
  finally {
    Trace.WriteLine("return is " + *(sp+3));
  }
}

Por isso, considero este um pedido de recurso para o Visual Studio.

Microsoft Visual C ++ usado para fazer isso, mas Visual Studio não AFAIK ..: (

A única maneira que eu sei é colocar um ponto de interrupção na linha de retorno e, em seguida, chamar o Quick Watch janela e digite a expressão retornada:

someTableAdapter.getSomeData();

Mas isso só funciona se a chamada não muda o estado de qualquer objeto (uma vez que haverá uma segunda chamada para o mesmo método quando você vai retomar a execução).

Eu queria expandir o PascalK resposta para começar este trabalho no Visual Studio 2015, porque não é uma característica oculta que não está documentado no Examine os valores de retorno de chamadas de método .

Se você tiver chamadas de função aninhados, os pseudo-variáveis ??$ResultValueX são criados automaticamente, onde o X refere-se ao fim chamada de função. Então se você tem uma chamada, como Multiply(Five(), Six()), os seguintes pseudo-variáveis ??são criados:

Five()     | $ResultValue1 = 5
Six()      | $ResultValue2 = 6
Multiply() | $ResultValue3 = 30

Você também pode pedir para avaliar o valor na janela intermediária, bem como, se ele faz bandeiras não estabelecidos ou outras variáveis, mas só retorna algo.

Eu acho que você pode determinar isso por olhar para o registo RAX na janela de Registradores (Debug / Windows / registos). Depois de sair (F11 + DESLOCAMENTO) da função, verificar o registo RAX. Eu não sei para um fato, mas uma vez em cima de uma lua você pode verificar um registo (dias pré .NET) e ver o valor de retorno lá. Pode até ser uma combinação de RAX e RBX, etc.

Abrindo a janela de depuração ? Autos você fica perto. Não vai mostrar o valor de retorno real, mas ele vai mostrar o que foi avaliado na instrução de retorno.

Sim, mudando para VB.NET. ; P (Você se limitou a dizer: "Visual Studio";).

Por enquanto me lembro (de Visual Basic através de todas as versões do VB.NET), você pode simplesmente consultar o nome da função. Ele "funções" como uma variável local que está implicitamente declarado no início da função e seu valor atual também é usado como o valor de retorno sempre que a função sai por meios Declaração de não-retorno (ou seja Exit Function ou apenas caindo) e, claro, quando é utilizada a instrução de retorno.

Ele também está definido para a expressão do instrução de retorno. Assim como uma variável local, o seu valor pode ser inspecionado em qualquer ponto da execução dentro da função (inclusive após a instrução de retorno é executado). faz C # não tem isso e deveria.

Essa característica pouco VB.NET (mais a declaração Exit Function que permite - outra característica C # não tem e deve) é muito útil em uma forma de programação defensiva eu pratico onde eu sempre inicializar o nome da função para o valor falha / default como a primeira instrução. Então, em qualquer ponto de falha (o que normalmente ocorre muito mais frequentemente do que os pontos de sucesso), eu posso simplesmente chamar a declaração Exit Function (ou seja, sem ter que duplicar a expressão falha / default ou até mesmo a / nome da variável constante).

a resposta aceita não funciona corretamente com o Visual Studio 2015, mas colocando um ponto de ruptura na última linha do método e pressionando F10 , ele vai colocar todas as expressões de o valor de retorno na janela de habitantes locais.

Você poderia tentar selecionar "someTableAdapter.getSomeData();", clique direito sobre ela, e ir para Quick Watch .

Arraste e solte a expressão de retorno em uma janela de observação.

Por exemplo, na demonstração

return someTableAdapter.getSomeData();

arrastar e soltar

someTableAdapter.getSomeData()

em uma janela de observação, e você vai ver o valor.

Você pode fazer isso para qualquer expressão.

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