Salin nilai objek dalam mode debug Visual Studio

138

Dalam mode debug Visual Studio dimungkinkan untuk mengarahkan kursor ke variabel untuk menunjukkan nilainya dan kemudian klik kanan untuk "Salin", "Salin Ekspresi" atau "Salin Nilai".

Dalam hal variabel adalah objek dan bukan hanya tipe dasar, ada tanda + untuk memperluas dan menjelajahi objek. Apakah ada cara untuk menyalin semua itu ke clipboard?

Farinha
sumber

Jawaban:

192

Di jendela langsung, ketik

?name_of_variable

Ini akan mencetak semuanya , dan Anda dapat menyalinnya secara manual di mana pun Anda inginkan, atau menggunakan fitur pencatatan langsung jendela untuk secara otomatis menuliskannya ke file.

UPDATE : Saya berasumsi Anda bertanya bagaimana menyalin / menempel struktur bersarang dari nilai-nilai sehingga Anda bisa mencarinya secara tekstual, atau sehingga Anda dapat menyimpannya di samping dan kemudian membandingkan keadaan objek dengan itu. Jika saya benar, Anda mungkin ingin memeriksa ekstensi komersial ke Visual Studio yang saya buat, bernama OzCode , yang memungkinkan Anda melakukan hal ini dengan lebih mudah melalui fitur "Cari" dan "Bandingkan".

PEMBARUAN 2 Untuk menjawab pertanyaan @ ppumkin, atau EAP baru memiliki fitur Ekspor baru memungkinkan pengguna untuk Mengekspor nilai variabel ke kode Json, XML, Excel, atau C #.

Pengungkapan penuh: Saya adalah pencipta bersama alat yang saya jelaskan di sini.

Omer Raviv
sumber
5
Akan lebih baik jika itu bisa secara rekursif berkembang untuk menunjukkan segalanya. Bisa jadi banyak teks tetapi saya kemudian akan mencari nilai yang lebih dalam di pohon.
Kobus Smit
3
PS Saya sangat menyukai fitur bugaid. mengunduh jejak sekarang dan saat kedaluwarsa dan saya mulai mengukur bola mata saya akan membuat bos saya membelinya untuk saya .. :)
Piotr Kula
16
Adakah yang tahu cara menghasilkan lebih dari 100 item? Saya mendapatkan ini setelah 100 yang pertama ditampilkan di jendela Segera: <Lebih banyak ... (100 yang pertama dari 335 item ditampilkan.)>
lachs
6
Apa sebenarnya yang dimaksud dengan "jendela langsung"?
alex
3
@alex: di Visual Studio, buka Debug> Windows> Segera - Ini memungkinkan Anda untuk memasukkan ekspresi untuk dievaluasi atau dieksekusi selama debugging
JTech
49

Anda dapat menjalankan kode di bawah ini di jendela langsung dan itu akan mengekspor ke file xml representasi XML serial objek:

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

Sumber: Visual Studio cara membuat serialisasi objek dari debugger

Bat_Programmer
sumber
5
Ini harus ditingkatkan sehingga orang dapat menemukannya dengan lebih mudah. Saya mengarungi banyak pertanyaan SO yang serupa sebelum saya menemukan solusi hebat ini, yang memungkinkan saya untuk membuang Daftar <Daftar <byte>> yang besar ke file teks xml setelah crash program yang sudah berjalan lama dengan masalah crash yang jarang terjadi. Hanya satu tambahan: ketika saya pertama kali menjalankannya saya mendapat kesalahan: "Evaluasi membutuhkan utas untuk sementara waktu. Gunakan jendela Tonton untuk melakukan evaluasi." Setelah menyegarkan jendela arloji, upaya kedua untuk menjalankan perintah berhasil.
Craig. Dibuka
Bat_Programmer: Anda mungkin ingin mengubah baris pertama dari jawaban Anda, karena itu menunjukkan bahwa apa yang akan menjadi output adalah daftar objek, sedangkan apa yang sebenarnya menjadi output adalah representasi XML serial dari objek tunggal yang ditentukan (variabel).
Craig. Diisi
Cannot evaluate expression because the code of the current method is optimized.???
Falco Alexander
Jika Anda memiliki json maka Anda dapat melakukan hal berikut:File.WriteAllText(@"c:\movie.json", JsonConvert.SerializeObject(movie));
user890332
The debugger is unable to evaluate this expression. Saya menggunakan Visual Studio 2019; Saya diganti objdengan nama variabel yang ketikSystem.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

Ada Pengekspor Objek ekstensi baru-baru ini yang melakukan ini dengan nyaman.

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

Ekstensi: https://visualstudiogallery.msdn.microsoft.com/c6a21c68-f815-4895-999f-cd0885d8774f

Animesh
sumber
1
Tampaknya memberi masalah untuk daftar objek yang lebih besar
Bat_Programmer
@Bat_Programmer Dengan cara apa pun tidak mencegah menggunakan alat Omar yang hebat, harap dicatat bahwa fitur Ekspor OzCode telah disesuaikan untuk mendukung daftar objek yang sangat besar. Silakan coba dan beri tahu saya jika itu bekerja dengan baik untuk Anda.
Omer Raviv
20

Anda dapat menambahkan arloji untuk objek itu, dan di jendela arloji, perluas dan pilih semua yang ingin Anda salin lalu salin.

PMN
sumber
1
Terima kasih PMN yang membantu saya juga. Dengan memperluas pohon secara manual (akan menyenangkan jika ada klik kanan, perluas semua) dan kemudian menyalinnya ke clipboard, saya kemudian dapat menempelkannya dan mencari nilai yang saya cari jauh di dalam pohon.
Kobus Smit
10

Jawaban paling populer dari https://stackoverflow.com/a/23362097/2680660 :

Dengan sedikit keberuntungan Anda sudah memiliki Json.Net di domain app Anda. Dalam hal ini masukkan ini ke jendela Langsung Anda:

Newtonsoft.Json.JsonConvert.SerializeObject(someVariable)
Efreeto
sumber
4

Dengan menggunakan atribut untuk menghias kelas dan metode Anda, Anda dapat memiliki nilai spesifik dari tampilan objek Anda selama debugging dengan atribut DebuggerDisplay misalnya

[DebuggerDisplay("Person - {Name} is {Age} years old")]
public class Person
{
  public string Name { get; set; }
  public int Age { get; set; }
}
Dave Anderson
sumber
Masalahnya, saya harus bisa menyalin semua konten objek, dan bukan hanya beberapa dari mereka. Ya, saya bisa membangun atribut DebbuggerDisplay yang cukup kompleks dengan seluruh objek, tetapi setiap perubahan pada kelas akan membutuhkan perubahan dalam atribut juga.
Farinha
@Farinha Apa yang ingin Anda lakukan dengan objek? Mungkin bisa memiliki properti yang merupakan versi xml serial itu.
Dave Anderson
1

Google menuntun saya ke pertanyaan berusia 8 tahun ini dan saya akhirnya menggunakan ObjectDumper untuk mencapai sesuatu yang sangat mirip dengan data debugger paste-paste. Angin sepoi-sepoi.

Saya tahu pertanyaan yang diajukan secara khusus tentang informasi dari debugger , tetapi ObjectDumper memberikan informasi yang pada dasarnya sama. Saya berasumsi mereka yang mengajukan pertanyaan ini seperti saya dan hanya perlu data untuk keperluan debugging dan tidak peduli apakah itu secara teknis berasal dari debugger atau tidak.

Jesse Hufstetler
sumber
1

Saya selalu menggunakan:

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

Lalu saya menyalin nilai string yang sayangnya juga menyalin garis miring.

Untuk menghapus serangan balik, buka di sini: https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_replace

Kemudian di dalam <p id="demo">Visit Microsoft!</p>elemen ganti teks dengan teks yang Anda salin. kemudian ganti var res = str.replace("Microsoft", "W3Schools");dengan

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

Jalankan perubahan baru ini tetapi jangan lupa klik tombol "coba" di sebelah kanan.

Sekarang Anda harus memiliki semua teks objek dalam format json yang dapat Anda jatuhkan dalam formatter json seperti http://jsonformatter.org atau untuk membuat POCO Anda sekarang dapat menggunakan http://json2csharp.com/

Helzgate
sumber
1

Saya tahu saya agak terlambat ke pesta, tapi saya menulis implementasi JSON untuk membuat serialisasi objek, jika Anda lebih suka memiliki output JSON. Menggunakan referensi Newtonsoft.Json.

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

jika Anda memiliki daftar dan Anda ingin menemukan variabel tertentu: Di jendela langsung, ketik

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

jika ini mengembalikan true

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

Saya baru saja mengklik kanan pada variabel dan memilih AddWatch , yang memunculkan jendela tontonan yang terdiri dari semua nilai. Saya memilih semua dan menempelkannya dalam teks editor teks, itu saja.

agileDev
sumber
1
masalahnya adalah menyalin objek dengan cara yang Anda butuhkan untuk memperluas node demi node dan saya punya 145 node
derloopkat