Kopiuj wartości obiektów w trybie debugowania programu Visual Studio


138

W trybie debugowania programu Visual Studio można najechać kursorem na zmienne, aby wyświetlić ich wartość, a następnie kliknąć prawym przyciskiem myszy „Kopiuj”, „Kopiuj wyrażenie” lub „Kopiuj wartość”.

W przypadku, gdy zmienna jest obiektem, a nie tylko typem podstawowym, istnieje znak +, aby rozwinąć i zbadać obiekt. Czy istnieje sposób, aby skopiować to wszystko do schowka?

Odpowiedzi:


190

W bezpośrednim oknie wpisz

?name_of_variable

Spowoduje to wydrukowanie wszystkiego i możesz ręcznie skopiować to w dowolnym miejscu lub użyć funkcji rejestrowania bezpośredniego okna, aby automatycznie zapisać to do pliku.

AKTUALIZACJA : Zakładam, że pytałeś, jak skopiować / wkleić zagnieżdżoną strukturę wartości, abyś mógł przeszukać ją tekstowo lub zapisać ją z boku, a następnie porównać z nią stan obiektu. Jeśli mam rację, możesz chcieć wypróbować komercyjne rozszerzenie programu Visual Studio, które stworzyłem, o nazwie OzCode , które umożliwia znacznie łatwiejsze wykonanie tych czynności dzięki funkcjom „Wyszukaj” i „Porównaj”.

UPDATE 2 Aby odpowiedzieć na pytanie @ ppumkin, lub nowy EAP ma nową funkcję eksportu, która umożliwia użytkownikom eksportowanie wartości zmiennych do kodu Json, XML, Excel lub C #.

Pełne ujawnienie: jestem współtwórcą opisanego tutaj narzędzia.


5
Byłoby jeszcze lepiej, gdyby mógł rekurencyjnie rozszerzać się, aby pokazać wszystko. Może to być dużo tekstu, ale wtedy prawdopodobnie poszukałbym wartości głębiej w drzewie.
— Kobus Smit

3
PS Uwielbiam funkcje Bugaid. ściąganie szlaku teraz, a kiedy wygaśnie i zacznę mierzyć moje gałki oczne, sprawi, że mój szef kupi go za mnie .. :)
— Piotr Kula

16
Czy ktoś wie, jak wydrukować ponad 100 pozycji? Otrzymuję to po wyświetleniu pierwszych 100 pozycji w oknie bezpośrednim: <Więcej ... (wyświetlono pierwsze 100 z 335 pozycji.)>
— lachs

6
Co dokładnie oznacza „bezpośrednie okno”?
— Alex

3
@alex: w Visual Studio przejdź do Debug> Windows> Immediate - pozwala na wprowadzanie wyrażeń do oceny lub wykonania podczas debugowania
— JTech

49

Możesz uruchomić poniższy kod w bezpośrednim oknie, a wyeksportuje on do pliku xml zserializowaną reprezentację XML obiektu:

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

Źródło: Visual Studio, jak serializować obiekt z debugera


5
Należy to zaopiniować, aby ludzie mogli go łatwiej znaleźć. Przeszedłem przez wiele podobnych pytań SO, zanim znalazłem to świetne rozwiązanie, które pozwoliło mi zrzucić dużą List <List <byte>> do pliku tekstowego xml po awarii długo działającego programu z rzadkim problemem związanym z awarią. Tylko jeden dodatek: kiedy uruchomiłem go po raz pierwszy, pojawił się błąd: „Ocena wymaga tymczasowego uruchomienia wątku. Użyj okna Watch, aby przeprowadzić ocenę”. Po odświeżeniu okna nadzoru druga próba uruchomienia polecenia zakończyła się pomyślnie.
— Craig, pokonał

Bat_Programmer: możesz chcieć zmienić pierwszą linię swojej odpowiedzi, ponieważ sugeruje ona, że ​​zostanie wyświetlona lista obiektów, podczas gdy to, co jest naprawdę wyprowadzane, to serializowana reprezentacja XML pojedynczego określonego obiektu (zmiennej).
— Craig, pokonał

Cannot evaluate expression because the code of the current method is optimized.???
— Falco Alexander

Jeśli masz json, możesz wykonać następujące czynności:File.WriteAllText(@"c:\movie.json", JsonConvert.SerializeObject(movie));
— user890332

The debugger is unable to evaluate this expression. Używam Visual Studio 2019; I podstawiony objz nazwą zmiennej, która jest typSystem.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]]
— Drew

27

1
Wydaje się, że powoduje problemy w przypadku większej listy obiektów
— Bat_Programmer

@Bat_Programmer Aby w żaden sposób nie zniechęcać do korzystania z cudownego narzędzia Omara, pamiętaj, że funkcja OzCode Export została dopracowana, aby obsługiwać ogromne listy obiektów. Spróbuj i daj mi znać, czy działa dobrze.
— Omer Raviv

20

Możesz dodać zegarek dla tego obiektu, a w oknie obserwatora rozwinąć i wybrać wszystko, co chcesz skopiować, a następnie skopiować.


1
Dzięki PMN również mi pomogło. Rozwijając ręcznie drzewo (byłoby miło, gdyby było kliknięcie prawym przyciskiem, rozwiń wszystko), a następnie kopiując je do schowka, mogę je wkleić i wyszukać wartość, którą szukam głęboko w drzewie.
— Kobus Smit


4

Używając atrybutów do ozdabiania klas i metod , możesz mieć określoną wartość z obiektu wyświetlanego podczas debugowania za pomocą atrybutu DebuggerDisplay, np.

[DebuggerDisplay("Person - {Name} is {Age} years old")]
public class Person
{
  public string Name { get; set; }
  public int Age { get; set; }
}

Chodzi o to, że muszę móc skopiować całą zawartość obiektu, a nie tylko niektóre z nich. Tak, mógłbym zbudować wystarczająco złożony atrybut DebbuggerDisplay z całym obiektem, ale wszelkie zmiany w klasie wymagałyby również zmiany atrybutu.
— Farinha

@Farinha Co chcesz zrobić z obiektem? Być może mogłaby mieć właściwość będącą jego zserializowaną wersją XML.
— Dave Anderson

1

Google doprowadziło mnie do tego 8-letniego pytania i ostatecznie użyłem ObjectDumper aby osiągnąć coś bardzo podobnego do kopiowania i wklejania danych debuggera. To była bryza.

Znam pytanie zadawane konkretnie o informacje z debuggera , ale ObjectDumper podaje informacje, które są w zasadzie takie same. Zakładam, że ci, którzy wyszukują w Google to pytanie, są tacy jak ja i potrzebują tylko danych do celów debugowania i nie obchodzi mnie, czy technicznie pochodzą one z debuggera, czy nie.


1

Zawsze używam:

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

Następnie kopiuję wartość ciągu, która niestety kopiuje również tylne ukośniki.

Aby usunąć backlashes, przejdź tutaj: https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_replace

Następnie w <p id="demo">Visit Microsoft!</p>elemencie zastąp tekst skopiowanym tekstem. następnie zamień var res = str.replace("Microsoft", "W3Schools");wiersz na

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

Uruchom te nowe zmiany, ale nie zapomnij kliknąć przycisku „wypróbuj” po prawej stronie.

Teraz powinieneś mieć cały tekst obiektu w formacie json, który możesz upuścić w programie formatującym json, takim jak http://jsonformatter.org lub aby utworzyć POCO, możesz teraz użyć http://json2csharp.com/


1

Wiem, że jestem trochę spóźniony na imprezę, ale napisałem implementację JSON do serializacji obiektu, jeśli wolisz mieć wyjście JSON. Używa odwołania do Newtonsoft.Json.

private static void WriteDebugJSON (dynamic obj, string filePath)
{
    using (StreamWriter d = new StreamWriter(filePath))
    {
        d.Write(JsonConvert.SerializeObject(obj));
    }
}

0

jeśli masz listę i chcesz znaleźć określoną zmienną: W najbliższym oknie wpisz

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

jeśli zwraca prawdę

var myDebugVar = myList.FirstOrDefault(s => s.ID == 5062);
?myDebugVar

0

Po prostu kliknąłem zmienną prawym przyciskiem myszy i wybrałem AddWatch , co spowoduje wyświetlenie okna zegarka, które zawiera wszystkie wartości. Wybrałem wszystko i wkleiłem go do tekstu w edytorze tekstu, to wszystko.


1
problem polega na skopiowaniu obiektu w ten sposób trzeba rozbudowywać węzeł po węźle i mam 145 węzłów
— derloopkat
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.