VS2010 сохранить данные массива / коллекции в файл во время отладки - PullRequest
18 голосов
/ 25 августа 2011

Есть ли способ сохранить данные массива / списка / коллекции в файл во время отладки в 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 ]

26 голосов
/ 01 сентября 2011

Когда достигается точка останова, откройте окно Immediate и используйте Tools.LogCommandWindowOutput , чтобы вывести вывод в файл:

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

Примечание: Вы можете использовать Log, который является псевдонимом для Tools.LogCommandWindowOutput


Обновление: Символ > важен.Кроме того, псевдоним log чувствителен к регистру.Смотрите скриншот:

enter image description here

6 голосов
/ 07 октября 2016

Я тоже допускал такой вопрос, но в VS2013. Я должен сохранить содержимое массива при отладке.

Например, мне нужно сохранить содержимое двойного массива с именем «trimmedInput». Я делаю так:

  1. Откройте окно QuickWatch из меню отладки (Ctrl + D, Q). enter image description here

  2. Поместите вашу переменную в выражение и нажмите кнопку пересчета enter image description here

  3. Вы увидите все значения. Теперь вы можете выделить их все (Ctrl + A) и скопировать (Ctrl + C).

  4. Вставьте (Ctrl + V) их в ваш любимый редактор. Блокнот, например. И использовать их. enter image description here

Это самый простой способ, который я знаю. Без дополнительных усилий. Надеюсь, что мое описание поможет вам!

P.S. Извините за не английский интерфейс на скриншотах. Вся необходимая информация написана в тексте.

2 голосов
/ 01 сентября 2011

Нечто подобное возможно с этим методом:

Я создал метод расширения, который я использую во всех своих проектах, - это общий и более мощный метод ToString (), который отображает содержимое любого объекта. Я включил исходный код в эту ссылку: https://rapidshare.com/files/1791655092/FormatExtensions.cs

UPDATE: Вам просто нужно поместить FormatExtensions.cs в ваш проект и изменить пространство имен FormatExtensions, чтобы оно совпадало с базовым пространством имен вашего проекта. Поэтому, когда вы находитесь в точке останова, вы можете напечатать в окне просмотра: myCustomCollection.ToStringExtended ()

И скопируйте вывод куда хотите

1 голос
/ 25 июня 2016

Вкл. Галерея Visual Studio Поиск: Экспортер объектов Расширение.
Имейте в виду: насколько я работал, в нем есть ошибка, из-за которой вы не можете экспортировать объект время от времени.

1 голос
/ 06 сентября 2011

Вы также можете вызывать методы в Immediate Window, и поэтому я думаю, что вам лучше всего использовать объект ObjectDumper, например тот, что в примерах LINQ или этот , а затем напишите что-то вроде этого в Immediate Window:

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

В зависимости откакой ObjectDumper вы решите использовать, вы можете настроить его в соответствии с вашими потребностями и указать, на скольких уровнях вы хотите, чтобы он копался в вашем объекте при его выгрузке.

ОБНОВЛЕНИЕ: Вы пояснили в комментарии, что причина, по которой вы хотите сохранить данные в файл, заключается в том, что вы можете выполнять поиск по ним и анализировать коллекцию в разные моменты времени при выполнении или при разных запускахпрограмма.Я на самом деле написал коммерческое расширение для Visual Studio (называемое BugAid ), которое именно это и делает.С его помощью вы можете сделать моментальные снимки переменных (щелкнув по ним правой кнопкой мыши и выбрав «Сохранить переменную»), а затем выполнить различие между переменной и снимком ее значения, которое вы сохранили ранее.Предыдущие и текущие значения каждого элемента в коллекции отображаются бок о бок, как в инструменте сравнения, и вы можете искать в процессе сравнения данных.

Примечание 1: Снимки в настоящее время не могут быть сохранены в файл, и их можно сравнивать только с одним сеансом отладки.

Примечание 2: В текущей версии BugAid поиск и сохранение снимков работают только до 3 уровнейграф объектов.В следующей версии вы сможете контролировать, насколько глубоко вы хотите искать / сохранять данные.

Пожалуйста, дайте мне знать, если это вам помогает или нет.

0 голосов
/ 18 января 2017

В «Немедленном окне» выведите следующее, чтобы получить двоичный дамп:

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 (...), чтобы добавить пробелы между байтами или что угодно.

0 голосов
/ 21 февраля 2012

Вот решение, которое заботится о коллекциях. Это визуализатор 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-совместимых коллекций

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...