【问题标题】:Copy object values in Visual Studio debug mode在 Visual Studio 调试模式下复制对象值
【发布时间】:2011-02-25 01:26:02
【问题描述】:

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

如果变量是一个对象而不仅仅是一个基本类型,则有一个 + 号来扩展和探索该对象。有没有办法将所有内容复制到剪贴板?

【问题讨论】:

    标签: visual-studio visual-studio-2010 debugging


    【解决方案1】:

    在即时窗口中,键入

    ?name_of_variable

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

    更新:我假设您问的是如何复制/粘贴值的嵌套结构,以便您可以以文本方式搜索它,或者您可以将其保存在一边,然后再保存比较对象的状态。如果我是对的,您可能想查看我创建的 Visual Studio 商业扩展,称为 OzCode,它可以让您通过“搜索”和“比较”功能更轻松地完成这些事情。

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

    全面披露:我是我在此描述的工具的共同创造者。

    【讨论】:

    • 如果它可以递归扩展以显示所有内容会更好。它可能是很多文本,但我可能会在树中搜索更深的值。
    • PS 我非常喜欢 bugaid 的功能。现在下载线索,当它到期时,我开始测量我的眼球会让我的老板为我买它.. :)
    • 有谁知道如何输出100多个项目?在立即窗口中显示前 100 个后,我得到了这个:
    • “即时窗口”到底是什么意思?
    • @alex: 在 Visual Studio 中,转到 Debug > Windows > Immediate - 它允许您在调试期间输入要评估或执行的表达式
    【解决方案2】:

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

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

    来源:Visual Studio how to serialize object from debugger

    【讨论】:

    • 这应该被赞成,这样人们就可以更容易地找到它。在找到这个很棒的解决方案之前,我经历了很多类似的 SO 问题,它允许我在一个具有罕见崩溃问题的长时间运行的程序崩溃后将一个大的 List> 转储到一个 xml 文本文件。只有一个补充:当我第一次运行它时,我收到一个错误:“评估需要一个线程临时运行。使用 Watch 窗口执行评估。”刷新监视窗口后,第二次尝试运行命令成功。
    • Bat_Programmer:您可能想更改答案的第一行,因为它表明将输出的是对象列表,而真正输出的是单个对象的序列化 XML 表示指定对象(变量)。
    • Cannot evaluate expression because the code of the current method is optimized.???
    • 如果你有 json 那么你可以执行以下操作:File.WriteAllText(@"c:\movie.json", JsonConvert.SerializeObject(movie));
    • The debugger is unable to evaluate this expression。我正在使用 Visual Studio 2019;我用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]]类型的变量名替换了obj
    【解决方案3】:

    【讨论】:

    • 似乎给更大的对象列表带来了问题
    • 我喜欢 Object Exporter,但 Visual Studio 2019 的较新版本不支持它:VSIXInstaller.NoApplicableSKUsException: This extension is not installable on any currently installed products.
    • 当时,这是一个不错的选择。很遗憾它不适用于较新的版本。
    【解决方案4】:

    来自https://stackoverflow.com/a/23362097/2680660的最受欢迎回答:

    如果你运气好的话,你的 appdomain 中已经有了 Json.Net。其中 将其弹出到您的即时窗口中:

    Newtonsoft.Json.JsonConvert.SerializeObject(someVariable)
    

    【讨论】:

    • 太棒了。谢谢大哥!
    【解决方案5】:

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

    【讨论】:

    • 感谢 PMN 也帮助了我。通过手动展开树(如果右键单击,会很好,展开全部)然后将其复制到剪贴板,然后我可以将其粘贴并搜索我在树深处查找的值。
    【解决方案6】:

    通过使用attributes to decorate your classes and methods,您可以在使用DebuggerDisplay attribute 进行调试期间从对象显示中获得特定值,例如

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

    【讨论】:

    • 问题是,我需要能够复制所有对象内容,而不仅仅是其中的一部分。是的,我可以用整个对象构建一个足够复杂的 DebuggerDisplay 属性,但是对类的任何更改也需要更改属性。
    • @Farinha 你想对这个对象做什么?也许可以有一个属性是它的序列化 xml 版本。
    【解决方案7】:

    我总是用:

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

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

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

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

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

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

    现在您应该拥有 json 格式的对象的所有文本,您可以将其放入 json 格式化程序中,例如 http://jsonformatter.org 或创建一个 POCO,您现在可以使用 http://json2csharp.com/

    【讨论】:

      【解决方案8】:

      Google 将我引向了这个 8 年前的问题,我最终使用 ObjectDumper 来实现与复制粘贴调试器数据非常相似的功能。轻而易举。

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

      【讨论】:

        【解决方案9】:

        我知道我参加聚会有点晚了,但如果您更喜欢 JSON 输出,我编写了一个用于序列化对象的 JSON 实现。使用 Newtonsoft.Json 引用。

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

        【讨论】:

          【解决方案10】:

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

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

          如果返回 true

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

          【讨论】:

            【解决方案11】:

            我刚刚右键单击变量并选择了AddWatch,这将打开包含所有值的监视窗口。我选择了所有并将其粘贴到文本编辑器中,仅此而已。

            【讨论】:

            • 问题是复制对象需要逐个节点展开,我确实有 145 个节点
            【解决方案12】:

            这里有用的提示,我会添加我的偏好,以便我下次在这里结束时再次问这个问题。 如果你不介意添加一个不需要输出文件的扩展,或者这样,mladen mihajlovic 的 Visual Studio 的 Hex Visualizer 扩展,他自 2015 年以来就完成了版本。 通过局部变量窗口中的常用放大镜视图对象提供数组的良好显示。 https://marketplace.visualstudio.com/items?itemName=Mika76.HexVisualizer2019是2019版。

            【讨论】:

              【解决方案13】:

              如果您处于调试模式,您可以通过在调试终端中写入 copy() 来复制任何变量。

              这适用于嵌套对象,还可以删除截断并复制完整的值。

              提示:您可以右键单击一个变量,然后单击Copy as Expression,然后将其粘贴到复制功能中。

              【讨论】:

                【解决方案14】:

                ObjectDumper.NET

                这是一个很棒的方法!

                1. 您可能需要此数据进行单元测试,因此请创建一个Sandbox.cs 临时测试,或者您可以创建一个控制台应用程序。
                2. 确保获取 NuGet 包,ObjectDumper.NET,而不是 ObjectDumper。
                3. 运行此测试(或控制台应用)
                4. 查看测试输出或文本文件以获取 C# 初始化代码!

                代码:

                [TestClass]
                public class Sandbox
                {
                    [TestMethod]
                    public void GetInitializerCode()
                    {
                        var db = TestServices.GetDbContext();
                        var list = db.MyObjects.ToList();
                        var literal = ObjectDumper.Dump(list, new DumpOptions
                        {
                            DumpStyle = DumpStyle.CSharp,
                            IndentSize = 4
                        });
                        Console.WriteLine(literal); // Some test runners will truncate this, so use the file in that case.
                        File.WriteAllText(@"C:\temp\dump.txt", literal);
                    }
                }
                

                我曾经使用过 Object Exporter,但它已经使用了 5 年,并且在 Visual Studio 中不再支持。似乎 Visual Studio Extensions 来来去去,但我们希望这个 NuGet 包能够继续存在! (在撰写本文时它也在积极维护中。)

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-09-02
                  • 2013-06-17
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多