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.>
Я хотел бы, чтобы файл содержал значения каждого из полей для каждого элемента в коллекции.
Я не вижу очевидного способа сделать это. Возможно ли это?
Ответы
Ответ 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(...)' для добавления пробелов между байтами или того, что вам нравится.