在Visual Studio调试模式下复制对象值


138

在Visual Studio调试模式下,可以将鼠标悬停在变量上以显示其值,然后右键单击“复制”,“复制表达式”或“复制值”。

如果变量是对象而不是基本类型,则可以使用+号来扩展和浏览对象。有没有办法将所有内容复制到剪贴板?

Answers:


190

在立即窗口中,键入

?name_of_variable

这将打印出所有内容,您可以手动将其复制到所需的任何位置,或使用即时窗口的日志记录功能将其自动写入文件。

更新:我假设您正在询问如何复制/粘贴值的嵌套结构,以便可以按文本进行搜索,也可以将其保存在侧面,然后将对象的状态与其进行比较。如果我是对的,您可能想检查一下我创建的Visual Studio商业扩展,称为OzCode,它使您可以通过“搜索”和“比较”功能更轻松地完成这些操作。

更新2为了回答@ppumkin的问题,或者新的EAP具有新的导出功能,允许用户将变量值导出到Json,XML,Excel或C#代码。

完全公开:我是这里描述的工具的共同创建者。


5
如果可以递归扩展以显示所有内容,那就更好了。可能有很多文本,但是我可能会在树中更深的位置搜索它。
Kobus Smit

3
PS:我非常喜欢Bugaid的功能。现在就下载径迹,当它到期时,我会开始检查自己的眼球,这会让我的老板为我买.. :)
Piotr Kula

16
有人知道如何输出100多个项目吗?我在前100个窗口中显示了前100个后得到了此信息:<更多...(显示335个项目中的前100个。)>
lachs

6
“即时窗口”到底是什么意思?
亚历克斯

3
@alex:在Visual Studio中,转到“调试”>“ Windows”>“即时”-它允许您输入要在调试过程中求值或执行的表达式
JTech,2017年

49

您可以在立即窗口中的代码下面运行,它将把对象的序列化XML表示导出到xml文件中:

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

来源:Visual Studio如何从调试器序列化对象


5
应该对此进行修改,以便人们可以更轻松地找到它。在找到一个很好的解决方案之前,我经历了很多类似的SO问题,这使我可以在长时间运行的程序崩溃后,将大的List <List <byte >>转储到xml文本文件中,而这种问题很少发生。只是一个补充:当我第一次运行它时,出现一个错误:“评估需要一个线程临时运行。请使用监视窗口执行评估。” 刷新监视窗口后,第二次尝试运行命令成功。
Craig.Feied

Bat_Programmer:您可能希望更改答案的第一行,因为它建议输出的是对象列表,而实际输出的是单个指定对象(变量)的序列化XML表示。
Craig.Feied

Cannot evaluate expression because the code of the current method is optimized.???
Falco Alexander

如果您有json,则可以执行以下操作:File.WriteAllText(@"c:\movie.json", JsonConvert.SerializeObject(movie));
user890332

The debugger is unable to evaluate this expression。我正在使用Visual Studio 2019; 我obj用类型为变量的变量替换System.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

1
似乎给更大的对象列表带来了麻烦
Bat_Programmer16

@Bat_Programmer不要以任何方式阻止使用Omar的出色工具,请注意,OzCode导出功能已经过微调,可以支持大量对象。请尝试一下,让我知道它是否适合您。
Omer Raviv

20

您可以为该对象添加一个监视,然后在监视窗口中展开并选择要复制的所有内容,然后将其复制。


1
谢谢PMN的帮助。通过手动展开树(如果右键单击,将其全部展开会很好),然后将其复制到剪贴板,然后我可以将其粘贴并搜索在树的深处寻找的值。
Kobus Smit


4

通过使用属性装饰类和方法,可以在调试期间使用DebuggerDisplay属性从对象显示中获取特定值,例如

[DebuggerDisplay("Person - {Name} is {Age} years old")]
public class Person
{
  public string Name { get; set; }
  public int Age { get; set; }
}

问题是,我需要能够复制所有对象内容,而不仅仅是其中一些内容。是的,我可以使用整个对象构建一个足够复杂的DebbuggerDisplay属性,但是对类的任何更改也需要对该属性进行更改。
Farinha

@Farinha您想对该对象做什么?也许可以拥有一个属性,该属性是其序列化的xml版本。
戴夫·安德森

1

Google引导了我一个长达8年的问题,最终我使用ObjectDumper实现了与复制粘贴调试器数据非常相似的功能。轻风轻拂。

我知道专门询问有关调试器信息的问题,但是ObjectDumper提供的信息基本相同。我假设那些用谷歌搜索这个问题的人和我一样,只需要数据用于调试目的,而不管它在技术上是否来自调试器。


1

我一直使用:

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

然后我复制了字符串值,不幸的是还复制了反斜杠。

要消除反冲,请转到此处:https : //www.w3schools.com/jsref/tryit.asp?filename=tryjsref_replace

然后在<p id="demo">Visit Microsoft!</p>元素中,将文本替换为您复制的文本。然后var res = str.replace("Microsoft", "W3Schools");

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

运行这些新更改,但不要忘记单击右侧的“尝试”按钮。

现在,您应该拥有json格式的对象的所有文本,您可以将它们放在诸如http://jsonformatter.org之类的json格式器中,或者要创建POCO,现在可以使用http://json2csharp.com/


1

我知道我参加聚会有点晚了,但是如果您希望有JSON输出,我为序列化对象编写了JSON实现。使用Newtonsoft.Json参考。

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

0

如果您有一个列表并且想要找到一个特定的变量:在立即窗口中,键入

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

如果返回true

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

0

我只是右键单击该变量,然后选择AddWatch,这将打开由所有值组成的监视窗口。我选择了所有内容并将其粘贴到文本文本编辑器中,仅此而已。


1
问题是复制对象的方式需要逐个节点扩展,而我确实有145个节点
derloopkat
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.