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.