Копировать значения объекта в режиме отладки Visual Studio

138

В режиме отладки Visual Studio можно навести курсор на переменные, чтобы показать их значение, а затем щелкнуть правой кнопкой мыши «Копировать», «Копировать выражение» или «Копировать значение».

В случае, если переменная является объектом, а не просто базовым типом, есть знак +, чтобы развернуть и исследовать объект. Есть ли способ скопировать все это в буфер обмена?

Farinha
источник

Ответы:

192

В появившемся окне введите

?name_of_variable

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

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

ОБНОВЛЕНИЕ 2 Чтобы ответить на вопрос @ ppumkin, или новый EAP имеет новую функцию экспорта, позволяет пользователям экспортировать значения переменных в код Json, XML, Excel или C #.

Полное раскрытие: я являюсь одним из создателей инструмента, который я описал здесь.

Омер Равив
источник
5
Было бы еще лучше, если бы он мог рекурсивно расширяться, чтобы показать все. Это может быть много текста, но тогда я мог бы искать его для более глубокого значения в дереве.
Кобус Смит
3
PS Мне так нравятся черты бугайда. загрузка следа теперь, и когда он истекает, и я начинаю оценивать свои глазные яблоки, заставит моего босса купить это для меня .. :)
Петр Кула
16
Кто-нибудь знает, как вывести более 100 предметов? Я получаю это после того, как первые 100 были отображены в окне «Немедленно»: <Подробнее ... (Были показаны первые 100 из 335 элементов.)>
lachs
6
Что именно подразумевается под «непосредственным окном»?
alex
3
@alex: в Visual Studio перейдите в раздел «Отладка»> «Windows»> «Немедленно» - он позволяет вводить выражения, которые будут оцениваться или выполняться во время отладки
JTech
49

Вы можете запустить приведенный ниже код в непосредственном окне, и он экспортирует в XML-файл сериализованное XML-представление объекта:

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

Источник: Visual Studio, как сериализовать объект из отладчика

Bat_Programmer
источник
5
Это должно быть поддержано, чтобы людям было легче его найти. Я перебрал множество подобных вопросов SO, прежде чем нашел это отличное решение, которое позволило мне выгрузить большой List <List <byte >> в текстовый файл xml после сбоя долго работающей программы с редкой проблемой сбоя. Только одно дополнение: когда я впервые запустил его, я получил ошибку: «Для оценки требуется, чтобы поток временно запускался. Используйте окно Watch для выполнения оценки». После обновления окна наблюдения вторая попытка выполнить команду была успешной.
Craig.Feied
Bat_Programmer: вы можете захотеть изменить первую строку вашего ответа, потому что он предполагает, что выводится список объектов, тогда как на самом деле выводится сериализованное XML-представление одного указанного объекта (переменной).
Craig.Feied
Cannot evaluate expression because the code of the current method is optimized.???
Фалько Александр
Если у вас есть json, вы можете сделать следующее:File.WriteAllText(@"c:\movie.json", JsonConvert.SerializeObject(movie));
user890332
The debugger is unable to evaluate this expression, Я использую Visual Studio 2019; Я заменил objимя переменной, которая является типом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]]
Дрю
27

Недавно появилось расширение Object Exporter, которое делает это удобно.

http://www.omarelabd.net/exporting-objects-from-the-visual-studio-debugger/

Расширение: https://visualstudiogallery.msdn.microsoft.com/c6a21c68-f815-4895-999f-cd0885d8774f

Animesh
источник
1
Кажется, дает проблемы для большего списка объектов
Bat_Programmer
@Bat_Programmer Чтобы ни в коем случае не препятствовать использованию замечательного инструмента Омара, обратите внимание, что функция экспорта OzCode была настроена для поддержки огромных списков объектов. Пожалуйста, попробуйте и дайте мне знать, если это работает хорошо для вас.
Омер Равив,
20

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

ПМН
источник
1
Спасибо PMN, который также помог мне. Развернув дерево вручную (было бы неплохо, если бы был щелчок правой кнопкой мыши, разверните все), а затем скопировав его в буфер обмена, я могу затем вставить его и найти значение, которое я ищу глубоко в дереве.
Кобус Смит
10

Самый популярный ответ от https://stackoverflow.com/a/23362097/2680660 :

Если повезет, у вас уже есть Json.Net в вашем домене приложений. В этом случае вставьте это в ваше окно Immediate:

Newtonsoft.Json.JsonConvert.SerializeObject(someVariable)
Efreeto
источник
4

Используя атрибуты для украшения ваших классов и методов, вы можете получить конкретное значение из отображения вашего объекта во время отладки с атрибутом DebuggerDisplay, например

[DebuggerDisplay("Person - {Name} is {Age} years old")]
public class Person
{
  public string Name { get; set; }
  public int Age { get; set; }
}
Дейв Андерсон
источник
Дело в том, что мне нужно иметь возможность копировать все содержимое объекта, а не только некоторые из них. Да, я мог бы создать достаточно сложный атрибут DebbuggerDisplay со всем объектом, но любые изменения в классе также потребовали бы изменения в атрибуте.
Фаринья
@Farinha Что вы хотите сделать с объектом? Возможно, может иметь свойство, которое является его сериализованной версией XML.
Дейв Андерсон
1

Google привел меня к этому 8-летнему вопросу, и я использовал ObjectDumper для достижения чего-то очень похожего на копирование-вставку данных отладчика. Это был бриз.

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

Джесси Хуфстетлер
источник
1

Я всегда использую:

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

Затем я копирую строковое значение, которое, к сожалению, также копирует обратную косую черту.

Чтобы удалить зазоры, нажмите здесь: https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_replace

Затем внутри <p id="demo">Visit Microsoft!</p>элемента замените текст на текст, который вы скопировали. затем замените var res = str.replace("Microsoft", "W3Schools");строку на

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

Запустите эти новые изменения, но не забудьте нажать кнопку «попробовать» справа.

Теперь у вас должен быть весь текст объекта в формате json, который вы можете перетащить в форматер json, например http://jsonformatter.org, или для создания POCO, который теперь можно использовать http://json2csharp.com/

Helzgate
источник
1

Я знаю, что немного опоздал на вечеринку, но я написал JSON-реализацию для сериализации объекта, если вы предпочитаете вывод JSON. Использует ссылку Newtonsoft.Json.

private static void WriteDebugJSON (dynamic obj, string filePath)
{
    using (StreamWriter d = new StreamWriter(filePath))
    {
        d.Write(JsonConvert.SerializeObject(obj));
    }
}
Маркус Парсонс
источник
0

если у вас есть список, и вы хотите найти конкретную переменную: в появившемся окне введите

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

если это возвращает истину

var myDebugVar = myList.FirstOrDefault(s => s.ID == 5062);
?myDebugVar
emert117
источник
0

Я только что щелкнул правой кнопкой мыши по переменной и выбрал AddWatch , это откроет окно просмотра, которое состоит из всех значений. Я выделил все и вставил в текстовый редактор, вот и все.

agileDev
источник
1
проблема заключается в том, чтобы скопировать объект таким образом, что вам нужно расширить узел за узлом, и у меня есть 145 узлов
derloopkat