Скопіюйте значення об’єктів у режимі налагодження Visual Studio


138

У режимі налагодження Visual Studio можна навести курсор на змінні, щоб показати їх значення, а потім натиснути правою кнопкою миші кнопку "Копіювати", "Копіювати вираз" або "Копіювати значення".

У випадку, якщо змінна є об'єктом, а не лише базовим типом, є знак + для розширення та дослідження об'єкта. Це є спосіб скопіювати все це у буфер обміну?

Відповіді:


190

У прямому вікні введіть

?name_of_variable

Це дозволить роздрукувати все , і ви зможете скопіювати його вручну в будь-який момент або скористатися функціями реєстрації прямого вікна, щоб автоматично записати його у файл.

ОНОВЛЕННЯ : Я припускаю, що ви запитували, як скопіювати / вставити вкладену структуру значень, щоб ви могли або шукати її текстуально, або щоб ви могли зберегти її на стороні, а потім пізніше порівняти стан об'єкта з ним. Якщо я маю рацію, ви можете перевірити комерційне розширення до створеної мною Visual Studio під назвою OzCode , яка дозволяє вам робити це набагато простіше за допомогою функцій "Пошук" та "Порівняти".

ОНОВЛЕННЯ 2 Щоб відповісти на запитання @ ppumkin або новий EAP має нову функцію Експорт, дозволяє користувачам експортувати змінні значення в код Json, XML, Excel або C #.

Повне розкриття: Я є співавтором інструменту, який я описав тут.


5
Було б ще краще, якби це рекурсивно розширювалось, щоб показати все. Це може бути багато тексту, але я б тоді міг шукати його значення глибше у дереві.
Кобус Сміт

3
PS Я так люблю риси бугайди. завантажуючи слід зараз, і коли він закінчиться, і я почну оцінювати мої очні яблука, змушу мого начальника придбати його за мене .. :)
Piotr Kula

16
Хтось знає, як вивести більше 100 предметів? Я отримую це після того, як у вікні негайних відображаються перші 100: <Більше ... (Було показано перші 100 з 335 позицій.)>
lachs

6
Що саме мається на увазі під «безпосереднім вікном»?
алекс

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 як серіалізувати об’єкт з налагоджувача


5
Це слід застосувати, щоб люди могли його легше знайти. Я перебрав безліч подібних запитань SO, перш ніж знайшов це чудове рішення, яке дозволило мені скинути великий список <Список <байт>> у текстовий файл xml після збоїв тривалої програми з рідкісною проблемою аварійного завершення. Лише одне доповнення: коли я вперше запустив його, у мене з’явилася помилка: «Оцінка вимагає тимчасового запуску потоку. Використовуйте вікно Перегляд, щоб виконати оцінку». Після оновлення вікна перегляду друга спроба запуску команди була успішною.
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

Існує недавнє розширення експортера об'єктів, яке робить це зручно.

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

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


1
Здається, створює проблеми для більшого переліку об’єктів
Bat_Programmer

@Bat_Programmer Щоб ні в якому разі не відмовлятись від використання чудового інструменту Omar, зауважте, що функція експорту OzCode була точно налаштована на підтримку величезних списків об'єктів. Будь ласка, спробуйте і дайте мені знати, чи добре це працює для вас.
Омер Равів

20

Ви можете додати годинник для цього об’єкта, а у вікні перегляду розгорніть та виберіть усе, що потрібно скопіювати, а потім скопіюйте.


1
Дякую PMN, що мені допоміг. Вручну розгорнувши дерево (було б добре, якби було правою кнопкою миші, розгорніть всі), а потім скопіювавши його до буфера обміну, я можу потім вставити його та шукати значення, на яке я дивлюся глибоко в дерево.
Кобус Сміт

10

Найпопулярніша відповідь із https://stackoverflow.com/a/23362097/2680660 :

При будь-якій удачі у вас вже є Json.Net у вашому додатку. У такому випадку вставте це у своє негайне вікно:

Newtonsoft.Json.JsonConvert.SerializeObject(someVariable)

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/


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

0

Я просто натиснув правою кнопкою миші на змінну і вибрав AddWatch , це вікно перегляду, яке складається з усіх значень. Я вибрав усіх і вставив його в текстовий текстовий редактор, ось і все.


1
проблема полягає в тому, щоб скопіювати об’єкт таким чином, вам потрібно розширити вузол по вузлу, і у мене є 145 вузлів
derloopkat
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.