VS2010在调试时将数组/集合数据保存到文件中

时间:2011-08-25 17:34:00

标签: visual-studio-2010 debugging

在VS2010中进行调试时,有没有办法将数组/列表/集合数据保存到文件中?

例如,在此代码中:

var addressGraphs = from a in context.Addresses
                    where a.CountryRegion == "Canada"
                    select new { a, a.Contact };

foreach(var ag in addressGraphs) {
   Console.WriteLine("LastName: {0}, Addresses: {1}", ag.Contact.LastName.Trim(),
                     ag.Contact.Addresses.Count());



   foreach(var Address in ag.Contact.Addresses) {
      Console.WriteLine("...{0} {1}", Address.Street1, Address.City);
   }
}

我想在第一个'foreach'行设置断点,然后将'addressGraph'中的数据保存到文件中。

其中'a'包含以下字段:

   int addressID
   string Street1
   string City
   <Ect.>

和“联系人”包含以下字段:

   string FirstName
   string LastName
   int contactID
   <Ect.>

我希望该文件包含集合中每个项目的每个字段的值。

我没有看到明显的方法来做到这一点。有可能吗?

7 个答案:

答案 0 :(得分:26)

当您的断点被点击时,打开Immediate窗口并使用Tools.LogCommandWindowOutput将输出转储到文件中:

>Tools.LogCommandWindowOutput c:\temp\temp.log
?addressGraphs
>Tools.LogCommandWindowOutput /off

注意:您可以使用Log <{1}}

的别名Tools.LogCommandWindowOutput

<强>更新 >字符很重要。此外,log别名区分大小写。 见截图:

enter image description here

答案 1 :(得分:6)

我也遇到过这样的问题,但在VS2013中。我必须在调试时保存数组内容。

例如,我需要保存名为&#34; trimmedInput&#34;的双数组内容。我这样做了:

  1. 从“调试”菜单中打开“QuickWatch窗口”(Ctrl + D,Q)。 enter image description here

  2. 将变量放入Expression并按下Recalculate Button enter image description here

  3. 您将看到所有值。现在您可以全部选择它们(Ctrl + A)并复制(Ctrl + C)。

  4. 在您喜欢的编辑器中粘贴(Ctrl + V)它们。记事本,例如。并使用它们。 enter image description here

  5. 这就是我所知道的简单方法。没有额外的努力。希望我的描述可以帮到你!

    P.S。对于截图上的非英文界面,我们深表歉意所有必要的信息都写在文本中。

答案 2 :(得分:2)

使用此方法可以达到类似的效果:

我构建了一个扩展方法,我在我的所有项目中都使用它,这是一个通用且功能更强大的ToString()方法,它显示了任何对象的内容。 我在这个链接中包含了源代码: https://rapidshare.com/files/1791655092/FormatExtensions.cs

<强>更新 您只需将FormatExtensions.cs放在项目中,并将FormatExtensions的Namespace更改为与项目的基本Namespace重合。所以,当你在断点时,你可以输入你的观察窗口: myCustomCollection.ToStringExtended()

并将输出复制到任何地方

答案 3 :(得分:1)

您也可以在立即窗口中调用方法,因此我认为您最好的选择是使用ObjectDumper对象,如the one in the LINQ samplesthis one,然后在立即写入类似的内容窗口:

  

File.WriteAllText(“myFileName.txt”,ObjectDumper.Dump(addressGraph));

根据您决定使用的ObjectDumper,您可以根据自己的需要对其进行自定义,并能够告诉它在转储对象时需要深入多少层次。

更新:您已在评论中澄清了您要将数据保存到文件的原因,以便您可以搜索它,并在不同的时间点在执行或程序的不同运行。我实际上写了一个Visual Studio的商业扩展(称为BugAid)。有了它,您可以take snapshots of variables(通过右键单击它们并选择“保存变量”),然后在变量和之前保存的值的快照之间进行差异处理。集合中每个项目的先前值和当前值与diff工具一样并排显示,您可以在比较数据时search通过。

注1:目前无法将快照保存到文件中,只能在同一个调试会话中进行比较。

注意2:在当前版本的BugAid中,搜索和保存快照最多只能处理对象图的3个级别。在下一个版本中,您将能够控制搜索/保存数据的深度。

如果这对你有帮助,请告诉我。

答案 4 :(得分:1)

Visual studio Gallery上搜索:对象导出扩展。
请注意:就我工作而言,它有一个阻止您偶尔导出对象的错误。

答案 5 :(得分:0)

这是一个处理集合的解决方案。它是一个VS可视化工具,它将在调试时显示网格中的集合值,并保存到剪贴板和csv,xml和文本文件。我在VS2010 Ultimate中使用它。虽然我没有对它进行过广泛的测试,但我已经在列表和词典上进行了测试。

http://tinyurl.com/87sf6l7

它处理以下集合:

•System.Collections classes  
   ◦System.Collections.ArrayList  
   ◦System.Collections.BitArray  
   ◦System.Collections.HashTable  
   ◦System.Collections.Queue  
   ◦System.Collections.SortedList  
   ◦System.Collections.Stack  
   ◦All classes derived from System.Collections.CollectionBase  

•System.Collections.Specialized classes  
   ◦System.Collections.Specialized.HybridDictionary  
   ◦System.Collections.Specialized.ListDictionary  
   ◦System.Collections.Specialized.NameValueCollection  
   ◦System.Collections.Specialized.OrderedDictionary  
   ◦System.Collections.Specialized.StringCollection  
   ◦System.Collections.Specialized.StringDictionary  
   ◦All classes derived from System.Collections.Specialized.NameObjectCollectionBase  

•System.Collections.Generic classes  
   ◦System.Collections.Generic.Dictionary
   ◦System.Collections.Generic.List  
   ◦System.Collections.Generic.LinkedList  
   ◦System.Collections.Generic.Queue  
   ◦System.Collections.Generic.SortedDictionary  
   ◦System.Collections.Generic.SortedList  
   ◦System.Collections.Generic.Stack  

•IIS classes, as used by  
   ◦System.Web.HttpRequest.Cookies  
   ◦System.Web.HttpRequest.Files  
   ◦System.Web.HttpRequest.Form  
   ◦System.Web.HttpRequest.Headers  
   ◦System.Web.HttpRequest.Params  
   ◦System.Web.HttpRequest.QueryString  
   ◦System.Web.HttpRequest.ServerVariables  
   ◦System.Web.HttpResponse.Cookies  

以及一些与VB6兼容的集合

答案 6 :(得分:0)

在“立即窗口”中打印以下内容以获取二进制转储:

byte[] myArray = { 02,01,81,00,05,F6,05,02,01,01,00,BA };

myArray
  .Select(b => string.Format("{0:X2}", b))
  .Aggregate((s1, s2) => s1 + s2)

这将打印如下内容:

0201810005F60502010100BA

更改'.Aggregate(...)'调用以在字节之间添加空格,或者你喜欢什么。