Visual Studio cara membuat objek dari debugger

90

Saya mencoba untuk menyelidiki bug di crash dump (jadi saya tidak bisa mengubah kode). Saya memiliki objek yang sangat rumit (ribuan baris dalam representasi berseri) dan statusnya tidak konsisten. Untuk menyelidiki statusnya tampilan debugger Visual Studio tidak berguna. Tetapi objek tersebut memiliki kontrak data. Saya ingin membuat serial dan kemudian menggunakan editor teks favorit saya untuk menavigasi objek. Apakah mungkin untuk melakukan dari debugger?

xvorsx.dll
sumber
Perhatikan, jika Anda memiliki beberapa kelas penampung khusus, atau beberapa kelas lain yang ingin Anda lihat berkali-kali selama debug, tetapi IntelliSense dan QuickView tidak dapat mengetahuinya, Anda dapat menulis ekstensi untuk VS yang membantu menampilkan kelas kustom Anda di debug.
Csaba Toth
Banyak teknik bagus juga dapat ditemukan [di sini] ( stackoverflow.com/questions/360277/… )
Josh

Jawaban:

89

Beberapa waktu yang lalu saya menulis satu baris ini membuat serialisasi objek ke file di disk. Copy / paste ke jendela Immediate Anda, dan ganti obj(direferensikan dua kali) dengan objek Anda. Ini akan menyimpan text.xmlfile ke c:\temp, mengubahnya sesuai keinginan Anda.

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

Jangan berharap ada keajaiban, jika objek tidak dapat diserialkan, itu akan memunculkan pengecualian.

Alexey
sumber
3
Ini bekerja untuk saya di jendela langsung. suara positif,
Pankaj Kumar
1
ketika saya menggunakan ini di jendela langsung VS 2015, saya mendapatkan 'kesalahan' ini: "Evaluasi metode asli dalam konteks ini tidak didukung." Ide ide?
Vetras
Ketika saya menjalankannya, saya mendapatkan pesan berikut:identifier "System" is undefined
Rasoul
Punya proyek VB.NET lama, harus meletakkannya seperti ini jika tidak saya mendapatkan kesalahan tentang sintaks ekspresi, jika ada yang membutuhkan: System.Xml.Serialization.XmlSerializer baru (obj.GetType ()). Serialize (New System.IO .StreamWriter ("C: \ temp \ temp.txt"), obj)
Liquid Core
Ini spektakuler. Saya harus menggunakan direktori yang berbeda karena izin menulis, tetapi berfungsi dengan sangat baik. Impor ke Excel dan itu bahkan cantik.
BuddyZ
164

Jika beruntung, Anda sudah memiliki Json.Net di appdomain Anda. Dalam hal ini, masukkan ini ke jendela Immediate Anda:

Newtonsoft.Json.JsonConvert.SerializeObject(someVariable)

mcintyre321
sumber
20
Seandainya saya dapat meningkatkan ini lagi, terutama dibandingkan dengan jawaban lainnya. (Maaf, tapi saya tidak perlu melihat baris XML lain dalam karir saya.)
yzorg
1
Setelah sesi debug uji yang sangat lama, pengecualian terjadi di program saya sebelum program itu dapat menulis ribuan hasil uji ke file, saya berada di titik putus tempat pengecualian terjadi dan masih dapat memeriksa koleksi hasil. Tip ini menghemat banyak waktu saya!
HAL9000
1
Anda mungkin juga perlu menggunakan Json.Net di tempat lain agar dapat dimuat saat Anda mencoba menggunakannya di jendela Immediate (bukan hanya menambahkan referensi).
Evan
1
Saya harus menambahkan paket Newtonsoft.Json menggunakan Nuget, dan juga menambahkan sebaris kode dalam metode di mana saya memiliki breakpoint untuk membuat kelas Newtonsoft.Json.JsonArrayAttribute () tiruan untuk membuatnya bekerja. Solusi terbaik!
Richard Moore
1
Ini jawaban yang bagus. Saya menggunakannya hanya dengan sedikit perubahan untuk menyelamatkan saya dari perjalanan ke kecantikan. Newtonsoft.Json.JsonConvert.SerializeObject (someVariable, Newtonsoft.Json.Formatting.Indented)
Jamie
37

Berikut adalah ekstensi Visual Studio yang memungkinkan Anda melakukan hal itu:

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

Anda dapat menampilkan ke JSON, XML atau C #

Omar Elabd
sumber
4
Link yang tampaknya rusak, tapi di sini adalah proyek github dan Anda dapat menemukannya jika Anda mencari "Obyek Eksportir" di "Ekstensi dan Updates ..." dialog dalam Visual Studio. Ekstensi hebat btw!
Niklas Söderberg
2
Terima kasih @Omar Idenya sempurna. Tapi butuh waktu terlalu lama dan macet dalam beberapa kasus
Wahid Bitar
1
Setuju dengan @WahidBitar - Konsep hebat - sempurna untuk menyiapkan data pengujian unit, tetapi ekstensi tampaknya cukup bermasalah, dan menggunakan Visual Studio saat macet!
Dib
Ini benar-benar alat yang sangat berguna.
Ashutosh Singh
4

Gunakan ini di jendela "Immediate" Visual Studio, ganti c:\directory\file.jsondengan path lengkap ke file yang Anda inginkan untuk menulis JSON dan myObjectdengan variabel Anda untuk membuat serial:

System.IO.File.WriteAllText(@"c:\directory\file.json", Newtonsoft.Json.JsonConvert.SerializeObject(myObject))
Chris Peacock
sumber
3

Saya memiliki metode ekstensi yang saya gunakan:

public static void ToSerializedObjectForDebugging(this object o, FileInfo saveTo)
{
    Type t = o.GetType();
    XmlSerializer s = new XmlSerializer(t);
    using (FileStream fs = saveTo.Create())
    {
        s.Serialize(fs, o);
    }
}

Saya membebani dengan string untuk saveTo dan memanggilnya dari jendela langsung:

public static void ToSerializedObjectForDebugging(this object o, string saveTo)
{
    ToSerializedObjectForDebugging(o, new FileInfo(saveTo));
}
Mike Cheel
sumber
3

Dimungkinkan untuk menggunakan jendela langsung untuk membuat serial dan kemudian menyalin konten ke editor favorit Anda.

Opsi lainnya adalah mengganti ToString()metode dan memanggilnya saat dalam mode debug.

Anda juga dapat menulis konten ke file sesaat sebelum crash, atau membungkus kode menjadi try / catch dan kemudian menulis file tersebut. Saya berasumsi Anda dapat mengidentifikasi kapan itu macet.

Chuck Conway
sumber
Terima kasih, saya mencoba yang sama dari jendela Watch, tetapi saya mengatakan "Evaluasi fungsi memerlukan semua utas untuk dijalankan." Jendela segera menyelesaikannya
xvorsx
1

Variasi jawaban dari Omar Elabd -

Ini tidak gratis, tetapi ada uji coba gratis untuk OzCode
( https://marketplace.visualstudio.com/items?itemName=CodeValueLtd.OzCode ).

Ada built-in mengekspor ke JSON dalam konteks / menu hover di sana, dan itu bekerja sedikit lebih baik daripada ekstensi Object Export (trade-off untuk itu tidak gratis).

http://o.oz-code.com/features#export (demo)

Saya tahu ini beberapa tahun setelah kejadian, tetapi saya meninggalkan jawaban di sini karena ini berhasil untuk saya, dan orang lain mungkin menganggapnya berguna.

Michael Armes
sumber
1

Jika Anda memiliki referensi melingkar, jalankan ini di Jendela langsung:

Newtonsoft.Json.JsonConvert.SerializeObject(app, Newtonsoft.Json.Formatting.Indented,
new Newtonsoft.Json.JsonSerializerSettings
{
    ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Serialize
});
InGeek
sumber
1

Saya telah menggunakan ObjectDumper.Net .

Ini berfungsi dengan baik, terutama jika Anda memiliki pengujian unit langsung. Saya dapat dengan mudah melihat nilai variabel di konsol saat pengujian dijalankan, sehingga saya tidak perlu melakukan debug secara manual.

Ini dapat membantu jika Anda menggunakan XUnit.

DharmaTurtle
sumber
0

Variasi dari jawaban Alexey. Sedikit lebih rumit tetapi tidak melibatkan penulisan ke file teks:

1) Di Jendela Segera masukkan:

System.IO.StringWriter stringWriter = new System.IO.StringWriter();  

2) Di Jendela Jam masukkan dua jam tangan:

a.  stringWriter

b.  new System.Xml.Serialization.XmlSerializer(obj.GetType()).Serialize(stringWriter, obj) 

Setelah Anda memasukkan jam tangan kedua (yang Serialize), nilai jam tangan stringWriter akan disetel ke obj serial ke XML. Salin dan tempel. Perhatikan bahwa XML akan diapit oleh kurung kurawal, {...}, jadi Anda harus menghapusnya jika ingin menggunakan XML untuk apa pun.

Simon Tewsi
sumber