クラッシュダンプのバグを調査しようとしています(コードを変更できません)。非常に複雑なオブジェクト(シリアル化された表現の数千行)があり、その状態に一貫性がありません。その状態を調査するために、VisualStudioデバッガービューは役に立ちません。ただし、オブジェクトにはデータコントラクトがあります。それをシリアル化してから、お気に入りのテキストエディタを使用してオブジェクト間を移動したいと思います。デバッガーから実行することは可能ですか?
クラッシュダンプのバグを調査しようとしています(コードを変更できません)。非常に複雑なオブジェクト(シリアル化された表現の数千行)があり、その状態に一貫性がありません。その状態を調査するために、VisualStudioデバッガービューは役に立ちません。ただし、オブジェクトにはデータコントラクトがあります。それをシリアル化してから、お気に入りのテキストエディタを使用してオブジェクト間を移動したいと思います。デバッガーから実行することは可能ですか?
回答:
少し前に、オブジェクトをディスク上のファイルにシリアル化するこのワンライナーを作成しました。それをコピーしてイミディエイトウィンドウに貼り付けobj
、オブジェクトに置き換えます(2回参照されます)。text.xml
ファイルをc:\temp
に保存し、お好みに合わせて変更します。
(new System.Xml.Serialization.XmlSerializer(obj.GetType())).Serialize(new System.IO.StreamWriter(@"c:\temp\text.xml"), obj)
ただし、魔法を期待しないでください。オブジェクトをシリアル化できない場合は、例外がスローされます。
identifier "System" is undefined
運が良ければ、appdomainにはすでにJson.Netがあります。その場合、これをイミディエイトウィンドウにポップします。
Newtonsoft.Json.JsonConvert.SerializeObject(someVariable)
これは、まさにそれを可能にするVisualStudio拡張機能です。
https://visualstudiogallery.msdn.microsoft.com/c6a21c68-f815-4895-999f-cd0885d8774f
JSON、XML、またはC#に出力できます
使用する拡張メソッドがあります。
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));
}
イミディエイトウィンドウを使用してシリアル化し、コンテンツをお気に入りのエディターにコピーできる場合があります。
もう1つのオプションは、ToString()
メソッドをオーバーライドして、デバッグモードで呼び出すことです。
クラッシュの直前にコンテンツをファイルに書き出すことも、コードをtry / catchにラップして、ファイルに書き込むこともできます。いつクラッシュするかは識別できると思います。
OmarElabdからの回答のバリエーション-
無料ではありませんが、OzCodeの無料トライアルがあります
(https://marketplace.visualstudio.com/items?itemName=CodeValueLtd.OzCode)。
そこのコンテキスト/ホバーメニュー内にJSONへの組み込みのエクスポートがあり、オブジェクトエクスポート拡張機能よりも少しうまく機能します(無料ではないというトレードオフ)。
http://o.oz-code.com/features#export(デモ)
これは事実から数年後のことですが、これは私にとってはうまくいったので、ここに答えを残します。他の誰かがそれを役立つかもしれません。
ObjectDumper.Netを使用しています。
特にライブユニットテストがある場合は、うまく機能します。テストの実行時にコンソールで変数の値を簡単に表示できるため、手動でデバッグする必要がありません。
これは、XUnitを使用している場合に役立つことがあります。
アレクセイの答えのバリエーション。少し複雑ですが、テキストファイルへの書き込みは含まれません。
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番目のウォッチ(シリアル化するもの)を入力すると、stringWriterウォッチ値はXMLにシリアル化されたobjに設定されます。コピーして貼り付けます。XMLは中括弧{...}で囲まれるため、XMLを何かに使用する場合は、それらを削除する必要があることに注意してください。