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?
c#
debugging
serialization
visual-studio-2012
xvorsx.dll
sumber
sumber
Jawaban:
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 menyimpantext.xml
file kec:\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.
sumber
identifier "System" is undefined
Jika beruntung, Anda sudah memiliki Json.Net di appdomain Anda. Dalam hal ini, masukkan ini ke jendela Immediate Anda:
Newtonsoft.Json.JsonConvert.SerializeObject(someVariable)
sumber
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 #
sumber
Gunakan ini di jendela "Immediate" Visual Studio, ganti
c:\directory\file.json
dengan path lengkap ke file yang Anda inginkan untuk menulis JSON danmyObject
dengan variabel Anda untuk membuat serial:System.IO.File.WriteAllText(@"c:\directory\file.json", Newtonsoft.Json.JsonConvert.SerializeObject(myObject))
sumber
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)); }
sumber
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.
sumber
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.
sumber
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 });
sumber
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.
sumber
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.
sumber