Подтвердить что ты не робот

VS2010 сохраняет данные массива/коллекции в файл во время отладки

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

Я хотел бы, чтобы файл содержал значения каждого из полей для каждого элемента в коллекции.

Я не вижу очевидного способа сделать это. Возможно ли это?

4b9b3361

Ответ 1

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

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

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


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

enter image description here

Ответ 2

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

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

  • Откройте окно QuickWatch из меню Debug (Ctrl + D, Q). введите описание изображения здесь

  • Поместите свою переменную в выражение и нажмите кнопку пересчета введите описание изображения здесь

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

  • Вставить (Ctrl + V) в свой любимый редактор. Например, Блокнот. И используйте их. введите описание изображения здесь

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

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

Ответ 3

Что-то подобное возможно с помощью этого метода:

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

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

И скопируйте вывод везде, где хотите

Ответ 4

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

File.WriteAllText( "myFileName.txt", ObjectDumper.Dump(адресGraph));

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

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

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

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

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

Ответ 5

В Галерея Visual studio поиск: Экспортер объектов Расширение.
Помните: насколько я работал, у него есть ошибка, которая блокирует вас от экспорта объекта раз в то время.

Ответ 6

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

Ответ 7

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

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