クラッシュダンプのバグを調査しようとしています(そのため、コードを変更できません)。本当に複雑なオブジェクト(シリアル化された表現では数千行)があり、その状態は一貫していません。その状態を調査するために、Visual Studioデバッガービューは役に立ちません。しかし、オブジェクトにはデータコントラクトがあります。シリアル化してから、お気に入りのテキストエディターを使用してオブジェクト間を移動したいと思います。デバッガから行うことは可能ですか?
しばらく前に、オブジェクトをディスク上のファイルにシリアル化するこのワンライナーを書きました。イミディエイトウィンドウにコピーして貼り付け、obj
(2回参照されます)をオブジェクトに置き換えます。 text.xml
ファイルをc:\temp
に保存し、お好みに変更します。
(new System.Xml.Serialization.XmlSerializer(obj.GetType())).Serialize(new System.IO.StreamWriter(@"c:\temp\text.xml"), obj)
ただし、魔法を期待しないでください。オブジェクトをシリアル化できない場合、例外がスローされます。
運がよければ、すでにappdomainにJson.Netがあります。その場合、これをイミディエイトウィンドウにポップします。
Newtonsoft.Json.JsonConvert.SerializeObject(someVariable)
まさにそれを可能にするVisual Studio拡張機能を次に示します。
https://visualstudiogallery.msdn.Microsoft.com/c6a21c68-f815-4895-999f-cd0885d8774f
JSON、XML、またはC#に出力できます
イミディエイトウィンドウを使用してシリアル化してから、お気に入りのエディターにコンテンツをコピーすることができます。
別のオプションは、ToString()
メソッドをオーバーライドし、デバッグモードで呼び出します。
また、クラッシュの少し前に内容をファイルに書き出すことも、コードをtry/catchにラップしてファイルを書き込むこともできます。いつクラッシュするかを特定できると思います。
私が使用する拡張メソッドがあります:
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);
}
}
SaveToの文字列でオーバーロードし、イミディエイトウィンドウから呼び出します。
public static void ToSerializedObjectForDebugging(this object o, string saveTo)
{
ToSerializedObjectForDebugging(o, new FileInfo(saveTo));
}
循環参照がある場合は、イミディエイトウィンドウでこれを実行します。
Newtonsoft.Json.JsonConvert.SerializeObject(app, Newtonsoft.Json.Formatting.Indented,
new Newtonsoft.Json.JsonSerializerSettings
{
ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Serialize
});
ObjectDumper.Net を使用しています。
特に、ライブユニットテストがある場合は、うまく機能します。テストの実行時にコンソールで変数の値を簡単に表示できるため、手動でデバッグする必要がなくなります。
これ は、XUnitを使用している場合に役立ちます。
Omar Elabdからの回答のバリエーション-
無料ではありませんが、OzCodeの無料試用版があります
( https://marketplace.visualstudio.com/items?itemName=CodeValueLtd.OzCode )。
コンテキスト/ホバーメニュー内にJSONへの組み込みのエクスポートがあり、Object Export拡張機能よりも少しうまく機能します(無料ではないというトレードオフ)。
http://o.oz-code.com/features#export (デモ)
私はこれが事実から数年後であることを知っていますが、これは私のために働いたので、ここで答えを残しています。
Visual Studioの「イミディエイト」ウィンドウでこれを使用し、c:\directory\file.json
をJSONの書き込み先ファイルへのフルパスに置き換え、myObject
をシリアル化する変数に置き換えます。
System.IO.File.WriteAllText(@"c:\directory\file.json", Newtonsoft.Json.JsonConvert.SerializeObject(myObject))
Alexeyの回答のバリエーション。少し複雑ですが、テキストファイルへの書き込みは含まれません。
1)イミディエイトウィンドウで次を入力します。
System.IO.StringWriter stringWriter = new System.IO.StringWriter();
2)ウォッチウィンドウに2つのウォッチを入力します。
a. stringWriter
b. new System.Xml.Serialization.XmlSerializer(obj.GetType()).Serialize(stringWriter, obj)
2番目のウォッチ(Serializeウォッチ)を入力すると、stringWriterウォッチの値はXMLにシリアル化されたobjに設定されます。コピーして貼り付けます。 XMLは中括弧{...}で囲まれるため、XMLを何かに使用する場合は削除する必要があります。