คัดลอกค่าวัตถุในโหมดดีบัก Visual Studio


145

ในโหมดดีบัก Visual Studio คุณสามารถวางเมาส์เหนือตัวแปรเพื่อแสดงค่าจากนั้นคลิกขวาเพื่อ "คัดลอก" "คัดลอกนิพจน์" หรือ "คัดลอกค่า"

ในกรณีที่ตัวแปรเป็นวัตถุไม่ใช่แค่ประเภทพื้นฐานจะมีเครื่องหมาย + เพื่อขยายและสำรวจวัตถุ มีวิธีคัดลอกทั้งหมดลงในคลิปบอร์ดหรือไม่?

คำตอบ:


198

ในหน้าต่างทันทีพิมพ์

?name_of_variable

สิ่งนี้จะพิมพ์ทุกอย่างออกมาและคุณสามารถคัดลอกได้ทุกที่ที่คุณต้องการด้วยตนเองหรือใช้คุณสมบัติการบันทึกของหน้าต่างทันทีเพื่อเขียนลงไฟล์โดยอัตโนมัติ

อัปเดต : ฉันคิดว่าคุณกำลังถามถึงวิธีการคัดลอก / วางโครงสร้างที่ซ้อนกันของค่าเพื่อให้คุณสามารถค้นหาเป็นข้อความหรือเพื่อให้คุณสามารถบันทึกไว้ด้านข้างแล้วเปรียบเทียบสถานะของวัตถุกับวัตถุนั้นในภายหลัง ถ้าฉันพูดถูกคุณอาจต้องการตรวจสอบส่วนขยายเชิงพาณิชย์ของ Visual Studio ที่ฉันสร้างขึ้นชื่อว่า OzCodeซึ่งช่วยให้คุณทำสิ่งเหล่านี้ได้ง่ายขึ้นมากผ่านคุณสมบัติ "ค้นหา" และ "เปรียบเทียบ"

อัปเดต 2เพื่อตอบคำถามของ @ ppumkin หรือEAPใหม่มีคุณลักษณะการส่งออกใหม่ช่วยให้ผู้ใช้สามารถส่งออกค่าตัวแปรเป็นรหัส Json, XML, Excel หรือ C #

การเปิดเผยข้อมูลทั้งหมด:ฉันเป็นผู้ร่วมสร้างเครื่องมือที่อธิบายไว้ที่นี่


5
จะดีกว่านี้หากสามารถขยายซ้ำเพื่อแสดงทุกอย่างได้ อาจเป็นข้อความจำนวนมาก แต่จากนั้นฉันอาจจะค้นหาค่าที่ลึกลงไปในต้นไม้
Kobus Smit

3
ปล. ฉันชอบคุณสมบัติของ bugaid มาก การดาวน์โหลดเส้นทางตอนนี้และเมื่อมันหมดอายุและฉันเริ่มวัดลูกตาของฉันออกจะทำให้เจ้านายของฉันซื้อให้ฉัน .. :)
Piotr Kula

17
ใครรู้วิธีเอาท์พุทมากกว่า 100 รายการ ฉันได้รับสิ่งนี้หลังจาก 100 รายการแรกถูกแสดงในหน้าต่างทันที: <More ... (แสดง 100 รายการแรกจาก 335 รายการ)>
lachs

7
"หน้าต่างทันที" หมายความว่าอย่างไร
alex

4
@alex: ใน Visual Studio ไปที่ Debug> Windows> ทันที - อนุญาตให้คุณป้อนนิพจน์เพื่อประเมินหรือดำเนินการระหว่างการดีบัก
JTech

50

คุณสามารถเรียกใช้โค้ดด้านล่างในหน้าต่างทันทีและจะส่งออกไปยังไฟล์ xml ซึ่งเป็นตัวแทน XML ที่เป็นอนุกรมของวัตถุ:

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

ที่มา: Visual Studio วิธีการทำให้เป็นอนุกรมวัตถุจากโปรแกรมแก้ไข


5
สิ่งนี้ควรได้รับการโหวตเพื่อให้ผู้คนค้นหาได้ง่ายขึ้น ฉันถามคำถาม SO ที่คล้ายกันมากมายก่อนที่ฉันจะพบวิธีแก้ปัญหาที่ยอดเยี่ยมนี้ซึ่งทำให้ฉันสามารถถ่ายโอนรายการขนาดใหญ่ <List <byte>> ไปยังไฟล์ข้อความ xml หลังจากความผิดพลาดของโปรแกรมที่ทำงานเป็นเวลานานพร้อมกับปัญหาความผิดพลาดที่หายาก การเพิ่มเพียงครั้งเดียว: เมื่อฉันเรียกใช้ครั้งแรกฉันได้รับข้อผิดพลาด: "การประเมินต้องใช้เธรดเพื่อทำงานชั่วคราวใช้หน้าต่างนาฬิกาเพื่อทำการประเมินผล" หลังจากรีเฟรชหน้าต่างนาฬิกาความพยายามครั้งที่สองในการเรียกใช้คำสั่งสำเร็จ
Craig เข้าร่วม

Bat_Programmer: คุณอาจต้องการเปลี่ยนบรรทัดแรกของคำตอบของคุณเนื่องจากแนะนำว่าสิ่งที่จะได้รับคือรายการของวัตถุในขณะที่สิ่งที่กำลังส่งออกคือการแสดง XML แบบอนุกรมของวัตถุที่ระบุ (ตัวแปร) เพียงรายการเดียว
Craig เข้าร่วม

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

มี Object Exporter ส่วนขยายล่าสุดที่ทำสิ่งนี้ได้สะดวก

http://www.omarelabd.net/exporting-objects-from-the-visual-studio-debugger/

ส่วนขยาย: https://visualstudiogallery.msdn.microsoft.com/c6a21c68-f815-4895-999f-cd0885d8774f


1
ดูเหมือนจะทำให้เกิดปัญหากับรายการวัตถุที่ใหญ่กว่า
Bat_Programmer

@Bat_Programmer ไม่กีดกันการใช้เครื่องมือที่ยอดเยี่ยมของ Omar ในทางใดทางหนึ่งโปรดทราบว่าคุณลักษณะ OzCode Export ได้รับการปรับแต่งเพื่อรองรับรายการวัตถุจำนวนมาก โปรดลองใช้และแจ้งให้เราทราบว่าเหมาะสำหรับคุณหรือไม่
Omer Raviv

21

คุณสามารถเพิ่มนาฬิกาสำหรับวัตถุนั้นและในหน้าต่างนาฬิกาให้ขยายและเลือกทุกสิ่งที่คุณต้องการคัดลอกแล้วคัดลอก


1
ขอบคุณ PMN ที่ช่วยฉันเช่นกัน ด้วยการขยายต้นไม้ด้วยตนเอง (จะดีถ้ามีคลิกขวาขยายทั้งหมด) จากนั้นคัดลอกไปยังคลิปบอร์ดจากนั้นฉันสามารถวางและค้นหาค่าที่ฉันมองลึกลงไปในต้นไม้
Kobus Smit


4

โดยใช้แอตทริบิวต์เพื่อตกแต่งคลาสและวิธีการของคุณคุณสามารถมีค่าเฉพาะจากการแสดงวัตถุของคุณในระหว่างการดีบักด้วยแอตทริบิวต์ DebuggerDisplayเช่น

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

สิ่งนี้คือฉันต้องสามารถคัดลอกเนื้อหาวัตถุทั้งหมดไม่ใช่แค่บางส่วนเท่านั้น ใช่ฉันสามารถสร้างแอตทริบิวต์ DebbuggerDisplay ที่ซับซ้อนเพียงพอกับทั้งออบเจ็กต์ แต่การเปลี่ยนแปลงใด ๆ ในคลาสจะต้องมีการเปลี่ยนแปลงในแอตทริบิวต์ด้วย
Farinha

@Farinha คุณต้องการทำอะไรกับวัตถุ? บางทีอาจมีคุณสมบัติที่เป็นเวอร์ชัน xml ที่ทำให้เป็นอนุกรมของมัน
Dave Anderson

1

Google นำฉันไปสู่คำถาม 8 ปีนี้และฉันลงเอยด้วยการใช้ObjectDumperเพื่อให้ได้สิ่งที่คล้ายกับการคัดลอกข้อมูลดีบักเกอร์ มันเป็นเรื่องง่าย

ฉันรู้ว่าคำถามที่ถามโดยเฉพาะเกี่ยวกับข้อมูลจากดีบักเกอร์แต่ ObjectDumper ให้ข้อมูลที่เหมือนกันโดยทั่วไป ฉันสมมติว่าผู้ที่ใช้ Google คำถามนี้เป็นเหมือนฉันและต้องการข้อมูลเพื่อวัตถุประสงค์ในการดีบักและไม่สนใจว่าในทางเทคนิคจะมาจากดีบักเกอร์หรือไม่


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);

ถ้าผลตอบแทนเป็นจริง

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

0

ฉันเพิ่งคลิกขวาที่ตัวแปรและเลือกAddWatchนั่นคือหน้าต่างนาฬิกาที่แสดงขึ้นมาซึ่งประกอบด้วยค่าทั้งหมด ฉันเลือกทั้งหมดและวางลงในโปรแกรมแก้ไขข้อความนั่นคือทั้งหมดที่


1
ปัญหาคือการคัดลอกวัตถุด้วยวิธีที่คุณต้องขยายโหนดต่อโหนดและฉันมี 145 โหนด
derloopkat

0

เคล็ดลับที่เป็นประโยชน์ที่นี่ฉันจะเพิ่มความต้องการของฉันเมื่อฉันจะถามคำถามนี้อีกครั้งในอนาคต หากคุณไม่สนใจที่จะเพิ่มส่วนขยายที่ไม่ต้องการไฟล์เอาต์พุตหรือมีส่วนขยาย Hex Visualizer สำหรับวิชวลสตูดิโอโดย mladen mihajlovic เขาทำเวอร์ชันตั้งแต่ปี 2015 ให้การแสดงอาร์เรย์ที่ดีผ่านมุมมองแก้ว Magnifine ตามปกติ วัตถุจากหน้าต่างตัวแปรท้องถิ่น https://marketplace.visualstudio.com/items?itemName=Mika76.HexVisualizer2019เป็นเวอร์ชัน 2019

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.