Visual Studioデバッグモードでオブジェクト値をコピーする


138

Visual Studioデバッグモードでは、変数にカーソルを合わせて値を表示し、右クリックして[コピー]、[式のコピー]、または[値のコピー]を実行できます。

変数が単なる基本型ではなくオブジェクトである場合、オブジェクトを展開して探索するための+記号があります。それをすべてクリップボードにコピーする方法はありますか?

回答:


191

直接ウィンドウで、次のように入力します

?name_of_variable

これによりすべてが印刷され、必要な場所に手動でコピーしたり、イミディエイトウィンドウのログ機能を使用してファイルに自動的に書き込むことができます。

更新:ネストされた値の構造をコピー/貼り付けしてテキストで検索したり、横に保存してオブジェクトの状態を後で比較したりできるようにする方法を尋ねていたと思います。私がそうだとすれば、私が作成したVisual StudioのOzCodeと呼ばれる商用の拡張機能をチェックするとよいでしょう。

更新2 @ppumkinの質問に答えるため、または新しいEAPには新しいエクスポート機能があり、ユーザーは変数値をJson、XML、Excel、またはC#コードにエクスポートできます。

完全な開示:私はここで説明したツールの共同作成者です。


5
再帰的にすべてを表示するように拡張できればさらに良かったでしょう。大量のテキストになる可能性がありますが、ツリーのより深い値を検索する可能性があります。
Kobus Smit 2011年

3
PS私はバゲッドの機能をとても愛しています。今すぐトレイルをダウンロードすると、期限が切れて眼球を測定し始めると、上司にそれを買わせてくれます。:)
Piotr Kula 2012年

16
誰もが100以上のアイテムを出力する方法を知っていますか?最初の100がイミディエイトウィンドウに表示された後、これが表示されます。<詳細...(335アイテムの最初の100が表示されました。)>
lachs

6
「イミディエイトウィンドウ」とは正確にはどういう意味ですか?
アレックス

3
@alex:Visual Studioで、[デバッグ]> [ウィンドウ]> [イミディエイト]に移動します
JTech

49

以下のコードをイミディエイトウィンドウで実行すると、オブジェクトのシリアル化されたXML表現がxmlファイルにエクスポートされます。

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

ソース:Visual Studioデバッガーからオブジェクトをシリアル化する方法


5
人々がそれをより簡単に見つけられるように、これは賛成されるべきです。この素晴らしい解決策を見つける前に、同様のSOに関する多くの質問に目を通しました。これにより、長時間実行されるプログラムがまれにクラッシュしてクラッシュした後、大きなList <List <byte >>をxmlテキストファイルにダンプできました。ただ1つ追加:最初に実行したときに、「評価にはスレッドを一時的に実行する必要があります。ウォッチウィンドウを使用して評価を実行してください」というエラーが発生しました。監視ウィンドウを更新した後、コマンドを実行する2回目の試行が成功しました。
Craig.Feeed

Bat_Programmer:出力されるのはオブジェクトのリストであり、実際に出力されるのは指定された単一のオブジェクト(変数)のシリアル化されたXML表現であることが示唆されているため、回答の最初の行を変更することができます。
Craig.17年

Cannot evaluate expression because the code of the current method is optimized.???
Falco Alexander

:あなたはJSONを持っているなら、あなたは次の操作を行うことができますFile.WriteAllText(@"c:\movie.json", JsonConvert.SerializeObject(movie));
user890332

The debugger is unable to evaluate this expression。私はVisual Studio 2019を使用しています。objタイプである変数名に置き換えましたSystem.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

1
オブジェクトの大きなリストで問題が発生しているようです
Bat_Programmer

@Bat_Programmer Omarのすばらしいツールを決して使わないようにするために、OzCodeエクスポート機能はオブジェクトの巨大なリストをサポートするように微調整されていることに注意してください。試してみて、うまくいくかどうか教えてください。
Omer Raviv 2017年

20

そのオブジェクトのウォッチを追加し、ウォッチウィンドウで、コピーするすべてを展開して選択してからコピーします。


1
PMNにも感謝します。手動でツリーを展開し(右クリックしてすべて展開するとよいでしょう)、それをクリップボードにコピーして、貼り付けて、ツリーの深いところにある値を検索できます。
Kobus Smit 2011年


4

使用することにより、あなたのクラスやメソッドを飾るために属性をあなたがデバッグ中に、あなたのオブジェクト表示から特定の値を持つことができDebuggerDisplay属性など

[DebuggerDisplay("Person - {Name} is {Age} years old")]
public class Person
{
  public string Name { get; set; }
  public int Age { get; set; }
}

問題は、オブジェクトの一部だけではなく、すべてのオブジェクトの内容をコピーできる必要があることです。はい、オブジェクト全体で十分に複雑なDebbuggerDisplay属性を構築できますが、クラスに変更を加えると、属性も変更する必要があります。
ファリーニャ

@Farinhaオブジェクトで何をしたいですか?おそらく、シリアル化されたxmlバージョンのプロパティを持つことができます。
デイブアンダーソン、

1

グーグルが私をこの8年前の質問に導き、私はObjectDumperを使用してコピー貼り付けデバッガーデータと非常によく似たものを達成しました。そよ風だった。

デバッガーからの情報について具体的に尋ねられる質問を知っていますが、ObjectDumperは基本的に同じ情報を提供します。私は、この質問をググる人が私のようなものであり、デバッグ目的でデータが必要であり、技術的にデバッガからのものであるかどうかは気にしないと仮定しています。


1

私は常に使用します:

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

次に、残念ながらバックスラッシュもコピーする文字列値をコピーします。

バックラッシュを削除するには、https//www.w3schools.com/jsref/tryit.asp?filename = tryjsref_replaceにアクセスしてください。

次に、<p id="demo">Visit Microsoft!</p>要素内で、テキストをコピーしたテキストに置き換えます。次に、var res = str.replace("Microsoft", "W3Schools");行を

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

これらの新しい変更を実行しますが、右側の[お試しください]ボタンをクリックすることを忘れないでください。

今、あなたはあなたのようなJSONフォーマッタにドロップできることをJSON形式でオブジェクトのすべてのテキストを持っている必要がありhttp://jsonformatter.orgまたはあなたが今使用することができますPOCO作成するhttp://json2csharp.com/を


1

私はパーティーに少し遅れていることを知っていますが、JSON出力が必要な場合は、オブジェクトをシリアル化するためのJSON実装を作成しました。Newtonsoft.Jsonリファレンスを使用します。

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

0

リストがあり、特定の変数を見つけたい場合:イミディエイトウィンドウで、次のように入力します。

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

これがtrueを返す場合

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

0

変数を右クリックしてAddWatchを選択しただけで、すべての値で構成されるウォッチウィンドウが表示されます。私はすべてを選択し、それをテキストエディターに貼り付けました。


1
問題は、ノードごとに展開するために必要な方法でオブジェクトをコピーすることです。私は145のノードを持っています
derloopkat
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.