Copiar valores de objeto no modo de depuração do Visual Studio

138

No modo de depuração do Visual Studio, é possível passar o mouse sobre as variáveis ​​para mostrar seu valor e clicar com o botão direito do mouse em "Copiar", "Copiar expressão" ou "Copiar valor".

Caso a variável seja um objeto e não apenas um tipo básico, há um sinal de + para expandir e explorar o objeto. Existe uma maneira de copiar tudo isso para a área de transferência?

Farinha
fonte

Respostas:

192

Na janela imediata, digite

?name_of_variable

Isso imprimirá tudo , e você poderá copiá-lo manualmente em qualquer lugar que desejar ou usar os recursos de log da janela imediata para gravá-lo automaticamente em um arquivo.

UPDATE : Suponho que você estava perguntando como copiar / colar a estrutura aninhada dos valores para que você pudesse pesquisá-la textualmente ou para salvá-la ao lado e depois comparar o estado do objeto. Se eu estiver certo, você pode conferir a extensão comercial do Visual Studio que criei, chamada OzCode , que permite fazer essas coisas com muito mais facilidade através dos recursos "Pesquisar" e "Comparar".

ATUALIZAÇÃO 2 Para responder à pergunta de @ ppumkin, ou o novo EAP possui um novo recurso Exportar, os usuários podem exportar os valores das variáveis ​​para o código Json, XML, Excel ou C #.

Divulgação completa: sou o co-criador da ferramenta que descrevi aqui.

Omer Raviv
fonte
5
Teria sido ainda melhor se pudesse expandir recursivamente para mostrar tudo. Poderia ser muito texto, mas seria possível procurá-lo por um valor mais profundo na árvore.
Kobus Smit
3
PS Eu estou amando tanto os recursos do bugaid. download de trilha agora e quando ele expira e eu começar a medir meus olhos para fora vai fazer meu chefe comprá-lo para mim .. :)
Piotr Kula
16
Alguém sabe como produzir mais de 100 itens? Eu recebo isso depois que os 100 primeiros foram exibidos na janela Imediata: <Mais ... (Os primeiros 100 de 335 itens foram exibidos.)>
lachs
6
O que exatamente se entende por "janela imediata"?
Alex
3
@alex: no Visual Studio, vá para Depuração> Windows> Imediato - Permite que você insira expressões a serem avaliadas ou executadas durante a depuração
JTech
49

Você pode executar o código abaixo na janela imediata e ele exportará para um arquivo xml a representação XML serializada de um objeto:

(new System.Xml.Serialization.XmlSerializer(obj.GetType())).Serialize(new System.IO.StreamWriter(@"c:\temp\text.xml"), obj)

Fonte: Visual Studio como serializar objeto do depurador

Bat_Programmer
fonte
5
Isso deve ser votado para que as pessoas possam encontrá-lo mais facilmente. Examinei muitas perguntas semelhantes de SO antes de encontrar essa ótima solução, que permitiu despejar uma grande List <List <byte>> em um arquivo de texto xml após a falha de um programa de longa duração com um problema raro de falha. Apenas uma adição: quando o executei pela primeira vez, recebi um erro: "A avaliação requer que um thread seja executado temporariamente. Use a janela Observar para executar a avaliação". Após atualizar a janela de inspeção, uma segunda tentativa de executar o comando foi bem-sucedida.
usar o seguinte código
Bat_Programmer: você pode alterar a primeira linha da sua resposta, porque sugere que o que será produzido é uma lista de objetos, enquanto o que realmente está sendo produzido é uma representação XML serializada de um único objeto especificado (variável).
usar o seguinte código
Cannot evaluate expression because the code of the current method is optimized.???
Falco Alexander
Se você possui json, pode fazer o seguinte:File.WriteAllText(@"c:\movie.json", JsonConvert.SerializeObject(movie));
user890332 8/08/19
The debugger is unable to evaluate this expression. Estou usando o Visual Studio 2019; Substituí objpelo nome da variável que é do tipoSystem.Collections.Generic.List 1[[System.ValueTuple 3[[System.String, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.String, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.String, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7]]
Drew
27

Existe uma extensão recente Exportador de Objetos que faz isso de forma conveniente.

http://www.omarelabd.net/exporting-objects-from-the-visual-studio-debugger/

Extensão: https://visualstudiogallery.msdn.microsoft.com/c6a21c68-f815-4895-999f-cd0885d8774f

Animesh
fonte
1
Parece estar dando problemas para ampliar lista de objetos
Bat_Programmer
@Bat_Programmer Para não desencorajar o uso da maravilhosa ferramenta do Omar, observe que o recurso OzCode Export foi ajustado para suportar grandes listas de objetos. Por favor, tente e deixe-me saber se funciona bem para você.
Omer Raviv
20

Você pode adicionar um relógio para esse objeto e, na janela de relógio, expanda e selecione tudo o que deseja copiar e depois copie-o.

PMN
fonte
1
Obrigado PMN que me ajudou também. Expandindo manualmente a árvore (seria bom se houvesse um clique direito, expandir tudo) e copiando-o para a área de transferência, posso colá-lo e procurar um valor que estou procurando no fundo da árvore.
Kobus Smit
10

Resposta mais popular de https://stackoverflow.com/a/23362097/2680660 :

Com alguma sorte, você já possui o Json.Net no seu domínio de aplicativo. Nesse caso, coloque isso na sua janela Imediata:

Newtonsoft.Json.JsonConvert.SerializeObject(someVariable)
Efreeto
fonte
4

Usando atributos para decorar suas classes e métodos, você pode ter um valor específico na exibição do objeto durante a depuração com o atributo DebuggerDisplay, por exemplo

[DebuggerDisplay("Person - {Name} is {Age} years old")]
public class Person
{
  public string Name { get; set; }
  public int Age { get; set; }
}
Dave Anderson
fonte
O problema é que eu preciso copiar todo o conteúdo do objeto, e não apenas alguns deles. Sim, eu poderia criar um atributo DebbuggerDisplay suficientemente complexo com todo o objeto, mas qualquer alteração na classe também precisaria de uma alteração no atributo.
Farinha 28/05
@ Farinha O que você quer fazer com o objeto? Talvez possa ter uma propriedade com a versão xml serializada dela.
Dave Anderson
1

O Google me levou a essa pergunta de 8 anos e acabei usando o ObjectDumper para obter algo muito semelhante aos dados do depurador de copiar e colar. Foi uma brisa.

Conheço a pergunta feita especificamente sobre informações do depurador , mas o ObjectDumper fornece informações basicamente iguais. Estou assumindo que aqueles que pesquisam essa pergunta no Google são como eu e só precisam dos dados para fins de depuração e não se importam se tecnicamente vem do depurador ou não.

Jesse Hufstetler
fonte
1

Eu sempre uso:

string myJsonString = JsonConvert.SerializeObject(<some object>);

Então eu copio o valor da string que infelizmente também copia as barras invertidas.

Para remover as barras invertidas, acesse aqui: https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_replace

Em seguida, dentro do <p id="demo">Visit Microsoft!</p>elemento, substitua o texto pelo texto que você copiou. substitua a var res = str.replace("Microsoft", "W3Schools");linha por

var res = str.replace(/\\/g, '')

Execute essas novas alterações, mas não se esqueça de clicar no botão "experimentar" à direita.

Agora você deve ter todo o texto do objeto no formato json que pode ser solto em um formatador json como http://jsonformatter.org ou para criar um POCO, agora você pode usar http://json2csharp.com/

Helzgate
fonte
1

Sei que estou um pouco atrasado para a festa, mas escrevi uma implementação JSON para serializar um objeto, se você preferir ter saída JSON. Usa a referência Newtonsoft.Json.

private static void WriteDebugJSON (dynamic obj, string filePath)
{
    using (StreamWriter d = new StreamWriter(filePath))
    {
        d.Write(JsonConvert.SerializeObject(obj));
    }
}
Marcus Parsons
fonte
0

se você possui uma lista e deseja encontrar uma variável específica: Na janela imediata, digite

 myList.Any(s => s.ID == 5062);

se isso retornar verdadeiro

var myDebugVar = myList.FirstOrDefault(s => s.ID == 5062);
?myDebugVar
emert117
fonte
0

Acabei de clicar com o botão direito na variável e selecionei AddWatch , que abre a janela de inspeção que consiste em todos os valores. Selecionei tudo e colei em um texto um editor de texto, só isso.

agileDev
fonte
1
o problema é copiar o objeto de que maneira você precisa para expandir o nó por nó e eu tenho 145 nós
derloopkat