Copie valores de objeto en modo de depuración de Visual Studio

138

En el modo de depuración de Visual Studio, es posible pasar el mouse sobre las variables para mostrar su valor y luego hacer clic derecho en "Copiar", "Copiar expresión" o "Copiar valor".

En caso de que la variable sea un objeto y no solo un tipo básico, hay un signo + para expandir y explorar el objeto. ¿Hay alguna manera de copiar todo eso en el portapapeles?

Farinha
fuente

Respuestas:

192

En la ventana inmediata, escriba

?name_of_variable

Esto imprimirá todo , y puede copiarlo manualmente en cualquier lugar que desee, o usar las funciones de registro de la ventana inmediata para escribirlo automáticamente en un archivo.

ACTUALIZACIÓN : Supongo que estaba preguntando cómo copiar / pegar la estructura anidada de los valores para poder buscarla textualmente o para poder guardarla en el lateral y luego comparar el estado del objeto. Si estoy en lo cierto, es posible que desee consultar la extensión comercial de Visual Studio que creé, llamada OzCode , que le permite hacer esto mucho más fácilmente a través de las funciones "Buscar" y "Comparar".

ACTUALIZACIÓN 2 Para responder a la pregunta de @ ppumkin, o el nuevo EAP tiene una nueva función de exportación que permite a los usuarios exportar los valores de las variables a código Json, XML, Excel o C #.

Divulgación completa: soy el cocreador de la herramienta que describí aquí.

Omer Raviv
fuente
55
Hubiera sido aún mejor si pudiera expandirse recursivamente para mostrar todo. Podría ser mucho texto, pero posiblemente buscaría un valor más profundo en el árbol.
Kobus Smit
3
PD: Me encantan las características de bugaid. descargar el rastro ahora y cuando caduque y empiece a medir mis globos oculares hará que mi jefe me lo compre .. :)
Piotr Kula
16
¿Alguien sabe cómo generar más de 100 artículos? Obtengo esto después de que se hayan mostrado los primeros 100 en la ventana Inmediato: <Más ... (Se mostraron los primeros 100 de 335 elementos).>
lachs
66
¿Qué se entiende exactamente por "la ventana inmediata"?
alex
3
@alex: en Visual Studio, vaya a Depurar> Windows> Inmediato - Le permite ingresar expresiones para ser evaluadas o ejecutadas durante la depuración
JTech
49

Puede ejecutar el siguiente código en la ventana inmediata y exportará a un archivo xml la representación XML serializada de un objeto:

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

Fuente: Visual Studio cómo serializar objetos desde el depurador

Bat_Programmer
fuente
55
Esto debería ser votado para que las personas puedan encontrarlo más fácilmente. Leí muchas preguntas SO similares antes de encontrar esta gran solución, que me permitió volcar una gran Lista <Lista <byte>> en un archivo de texto xml después del bloqueo de un programa de larga ejecución con un problema de bloqueo raro. Solo una adición: cuando lo ejecuté por primera vez, recibí un error: "La evaluación requiere un subproceso para ejecutarse temporalmente. Use la ventana Watch para realizar la evaluación". Después de actualizar la ventana de observación, un segundo intento de ejecutar el comando fue exitoso.
Craig.Feied
Bat_Programmer: es posible que desee cambiar la primera línea de su respuesta, porque sugiere que lo que se generará es una lista de objetos, mientras que lo que realmente se genera es una representación XML serializada de un único objeto (variable) especificado.
Craig.Feied
Cannot evaluate expression because the code of the current method is optimized.???
Falco Alexander
Si tiene json, puede hacer lo siguiente:File.WriteAllText(@"c:\movie.json", JsonConvert.SerializeObject(movie));
user890332
The debugger is unable to evaluate this expression. Estoy usando Visual Studio 2019; Sustituí objcon el nombre de la variable que es 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 una extensión reciente de Object Exporter que hace esto convenientemente.

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

Extensión: https://visualstudiogallery.msdn.microsoft.com/c6a21c68-f815-4895-999f-cd0885d8774f

Animesh
fuente
1
Parece estar dando problemas para una lista más grande de objetos
Bat_Programmer
@Bat_Programmer Para no desalentar de ninguna manera el uso de la maravillosa herramienta de Omar, tenga en cuenta que la función Exportar OzCode se ha ajustado para admitir grandes listas de objetos. Por favor, pruébalo y avísame si te funciona bien.
Omer Raviv el
20

Puede agregar un reloj para ese objeto, y en la ventana del reloj, expanda y seleccione todo lo que desea copiar y luego cópielo.

PMN
fuente
1
Gracias PMN que me ayudó también. Al expandir manualmente el árbol (sería bueno si hubiera un clic derecho, expandir todo) y luego copiarlo en el portapapeles, luego puedo pegarlo y buscar un valor que estoy buscando en el fondo del árbol.
Kobus Smit
10

La respuesta más popular de https://stackoverflow.com/a/23362097/2680660 :

Con suerte, ya tiene Json.Net en su dominio de aplicación. En cuyo caso, introduzca esto en su ventana Inmediato:

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

Al usar atributos para decorar sus clases y métodos , puede obtener un valor específico de la visualización de su objeto durante la depuración con el atributo DebuggerDisplay, por ejemplo

[DebuggerDisplay("Person - {Name} is {Age} years old")]
public class Person
{
  public string Name { get; set; }
  public int Age { get; set; }
}
Dave Anderson
fuente
La cuestión es que necesito poder copiar todo el contenido del objeto, y no solo algunos de ellos. Sí, podría construir un atributo DebbuggerDisplay lo suficientemente complejo con todo el objeto, pero cualquier cambio en la clase también necesitaría un cambio en el atributo.
Farinha
@ Farinha ¿Qué quieres hacer con el objeto? Quizás podría tener una propiedad que sea la versión xml serializada de la misma.
Dave Anderson
1

Google me llevó a esta pregunta de 8 años y terminé usando ObjectDumper para lograr algo muy similar a copiar y pegar datos del depurador. Fue una brisa.

Sé que la pregunta se hizo específicamente sobre la información del depurador , pero ObjectDumper proporciona información que es básicamente la misma. Supongo que aquellos que googlean esta pregunta son como yo y solo necesitan los datos para fines de depuración y no me importa si técnicamente proviene del depurador o no.

Jesse Hufstetler
fuente
1

Yo siempre uso:

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

Luego copio el valor de la cadena que desafortunadamente también copia las barras diagonales.

Para eliminar las barras invertidas, vaya aquí: https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_replace

Luego, dentro del <p id="demo">Visit Microsoft!</p>elemento, reemplace el texto con el texto que copió. luego reemplace la var res = str.replace("Microsoft", "W3Schools");línea con

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

Ejecute estos nuevos cambios, pero no olvide hacer clic en el botón "Pruébelo" a la derecha.

Ahora debe tener todo el texto del objeto en formato json que puede colocar en un formateador json como http://jsonformatter.org o para crear un POCO ahora puede usar http://json2csharp.com/

Helzgate
fuente
1

Sé que llego un poco tarde a la fiesta, pero escribí una implementación JSON para serializar un objeto, si prefieres tener salida JSON. Utiliza la referencia de Newtonsoft.Json.

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

si tiene una lista y desea encontrar una variable específica: en la ventana inmediata, escriba

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

si esto vuelve verdadero

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

Acabo de hacer clic derecho en la variable y seleccionar AddWatch , que es una ventana de visualización que consta de todos los valores. Seleccioné todo y lo pegué en un editor de texto y texto, eso es todo.

agileDev
fuente
1
el problema es copiar el objeto de esa manera se necesita para expandir el nodo por nodo y tengo 145 nodos
derloopkat