Sao chép giá trị đối tượng trong chế độ gỡ lỗi Visual Studio


138

Trong chế độ gỡ lỗi của Visual Studio, có thể di chuột qua các biến để hiển thị giá trị của chúng và sau đó nhấp chuột phải vào "Sao chép", "Sao chép biểu thức" hoặc "Sao chép giá trị".

Trong trường hợp biến là một đối tượng và không chỉ là một loại cơ bản, có dấu + để mở rộng và khám phá đối tượng. Có cách nào để sao chép tất cả vào bảng tạm?

Câu trả lời:


190

Trong cửa sổ ngay lập tức, gõ

?name_of_variable

Điều này sẽ in ra mọi thứ và bạn có thể sao chép thủ công bất cứ nơi nào bạn muốn hoặc sử dụng các tính năng ghi nhật ký của cửa sổ ngay lập tức để tự động ghi nó vào một tệp.

CẬP NHẬT : Tôi giả sử bạn đang hỏi cách sao chép / dán cấu trúc lồng nhau của các giá trị để bạn có thể tìm kiếm nó bằng văn bản hoặc để bạn có thể lưu nó ở bên cạnh và sau đó so sánh trạng thái của đối tượng với nó. Nếu tôi đúng, bạn có thể muốn xem tiện ích mở rộng thương mại cho Visual Studio mà tôi đã tạo, được gọi là OzCode , cho phép bạn thực hiện những việc này dễ dàng hơn nhiều thông qua các tính năng "Tìm kiếm" và "So sánh".

CẬP NHẬT 2 Để trả lời câu hỏi của @ ppumkin hoặc EAP mới có tính năng Xuất mới cho phép người dùng Xuất các giá trị biến thành mã Json, XML, Excel hoặc C #.

Tiết lộ đầy đủ: Tôi là người đồng sáng tạo công cụ tôi mô tả ở đây.


5
Sẽ tốt hơn nữa nếu nó có thể mở rộng đệ quy để hiển thị mọi thứ. Nó có thể là rất nhiều văn bản nhưng sau đó tôi sẽ có thể tìm kiếm nó cho một giá trị sâu hơn trong cây.
Kobus Smit

3
PS Tôi rất thích các tính năng của bugaid. tải xuống đường mòn ngay bây giờ và khi nó hết hạn và tôi bắt đầu đo nhãn cầu của mình sẽ khiến ông chủ của tôi mua nó cho tôi .. :)
Piotr Kula

16
Bất cứ ai cũng biết làm thế nào để sản xuất hơn 100 mặt hàng? Tôi nhận được điều này sau khi 100 đầu tiên đã được hiển thị trong cửa sổ Ngay lập tức: <Khác ... (100 trong số 335 mục đầu tiên đã được hiển thị.)>
lachs

6
Chính xác nghĩa là "cửa sổ ngay lập tức" là gì?
alex

3
@alex: trong Visual Studio, đi đến Gỡ lỗi> Windows> Ngay lập tức - Nó cho phép bạn nhập các biểu thức để được đánh giá hoặc thực hiện trong quá trình gỡ lỗi
JTech

48

Bạn có thể chạy mã bên dưới trong cửa sổ ngay lập tức và nó sẽ xuất thành tệp xml, biểu diễn XML được tuần tự hóa của một đối tượng:

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

Nguồn: Visual Studio làm thế nào để tuần tự hóa đối tượng từ trình gỡ lỗi


5
Điều này nên được nâng cấp để mọi người có thể tìm thấy nó dễ dàng hơn. Tôi đã lội qua rất nhiều câu hỏi SO tương tự trước khi tôi tìm thấy giải pháp tuyệt vời này, cho phép tôi chuyển một Danh sách lớn <Danh sách <byte >> sang tệp văn bản xml sau sự cố của chương trình chạy dài với sự cố hiếm gặp. Chỉ cần một bổ sung: khi tôi chạy lần đầu tiên, tôi gặp lỗi: "Đánh giá yêu cầu một luồng để chạy tạm thời. Sử dụng cửa sổ Watch để thực hiện đánh giá." Sau khi làm mới cửa sổ đồng hồ, lần thử thứ hai để chạy lệnh đã thành công.
Craig.Feied

Bat_Programmer: bạn có thể muốn thay đổi dòng đầu tiên của câu trả lời của mình, vì nó gợi ý rằng những gì sẽ là đầu ra là một danh sách các đối tượng, trong khi những gì thực sự là đầu ra là một biểu diễn XML được tuần tự hóa của một đối tượng (biến) được chỉ định.
Craig.Feied

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

Nếu bạn có json thì bạn có thể làm như sau:File.WriteAllText(@"c:\movie.json", JsonConvert.SerializeObject(movie));
user890332

The debugger is unable to evaluate this expression. Tôi đang sử dụng Visual Studio 2019; Tôi đã thay thế objbằng tên biến là loạiSystem.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]]
vẽ

27

Có một Trình xuất đối tượng mở rộng gần đây thực hiện việc này một cách thuận tiện.

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

Tiện ích mở rộng: https://visualstudiogallery.msdn.microsoft.com/c6a21c68-f815-4895-999f-cd0885d8774f


1
Có vẻ như đang đưa ra vấn đề cho danh sách các đối tượng lớn hơn
Bat_Programmer

@Bat_Programmer Không được khuyến khích sử dụng công cụ tuyệt vời của Omar, xin lưu ý rằng tính năng Xuất khẩu OzCode đã được tinh chỉnh để hỗ trợ các danh sách đối tượng khổng lồ. Hãy thử nó và cho tôi biết nếu nó hoạt động tốt cho bạn.
Omer Raviv

20

Bạn có thể thêm đồng hồ cho đối tượng đó và trong cửa sổ đồng hồ, mở rộng và chọn mọi thứ bạn muốn sao chép và sau đó sao chép nó.


1
Cảm ơn PMN đã giúp tôi là tốt. Bằng cách mở rộng cây theo cách thủ công (sẽ rất tuyệt nếu có nhấp chuột phải, mở rộng tất cả) và sau đó sao chép nó vào bảng tạm, sau đó tôi có thể dán nó và tìm kiếm một giá trị mà tôi đang nhìn sâu vào trong cây.
Kobus Smit

10

Câu trả lời phổ biến nhất từ https://stackoverflow.com/a/23362097/2680660 :

Với bất kỳ may mắn, bạn đã có Json.Net trong appdomain của bạn rồi. Trong trường hợp này, hãy bật cái này vào cửa sổ Ngay lập tức của bạn:

Newtonsoft.Json.JsonConvert.SerializeObject(someVariable)

4

Bằng cách sử dụng các thuộc tính để trang trí các lớp và phương thức của bạn, bạn có thể có một giá trị cụ thể từ màn hình đối tượng của mình trong quá trình gỡ lỗi với thuộc tính DebuggerDisplay, vd

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

Vấn đề là, tôi cần có khả năng sao chép tất cả các nội dung của đối tượng, và không chỉ một số trong số chúng. Có, tôi có thể xây dựng một thuộc tính DebbuggerDisplay đủ phức tạp với toàn bộ đối tượng, nhưng bất kỳ thay đổi nào đối với lớp cũng sẽ cần một thay đổi trong thuộc tính.
Farinha

@Farinha Bạn muốn làm gì với đối tượng? Có lẽ có một tài sản là phiên bản xml nối tiếp của nó.
Dave Anderson

1

Google dẫn tôi đến câu hỏi 8 năm tuổi này và cuối cùng tôi đã sử dụng ObjectDumper để đạt được một cái gì đó rất giống với dữ liệu trình gỡ lỗi sao chép. Đó là một làn gió.

Tôi biết câu hỏi được hỏi cụ thể về thông tin từ trình gỡ lỗi , nhưng ObjectDumper cung cấp thông tin về cơ bản là giống nhau. Tôi giả sử những người google câu hỏi này giống tôi và chỉ cần dữ liệu cho mục đích gỡ lỗi và không quan tâm liệu nó có xuất phát từ trình gỡ lỗi hay không.


1

Tôi luôn luôn sử dụng:

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

Sau đó, tôi sao chép giá trị chuỗi mà không may cũng sao chép dấu gạch chéo ngược.

Để xóa các phản ứng dữ dội, hãy truy cập vào đây: https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_Vplace

Sau đó, trong <p id="demo">Visit Microsoft!</p>phần tử thay thế văn bản bằng văn bản bạn đã sao chép. sau đó thay thế var res = str.replace("Microsoft", "W3Schools");dòng bằng

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

Chạy những thay đổi mới này nhưng đừng quên nhấp vào nút "thử nó" ở bên phải.

Bây giờ bạn nên có tất cả văn bản của đối tượng ở định dạng json mà bạn có thể thả vào một định dạng json như http://jsonformatter.org hoặc để tạo POCO, bây giờ bạn có thể sử dụng http://json2csharp.com/


1

Tôi biết tôi đến bữa tiệc hơi muộn, nhưng tôi đã viết một triển khai JSON để tuần tự hóa một đối tượng, nếu bạn muốn có đầu ra JSON. Sử dụng tài liệu tham khảo Newtonsoft.Json.

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

0

nếu bạn có một danh sách và bạn muốn tìm một biến cụ thể: Trong cửa sổ ngay lập tức, hãy nhập

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

nếu điều này trả về đúng

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

0

Tôi vừa nhấp chuột phải vào biến và chọn AddWatch , cửa sổ đồng hồ này bao gồm tất cả các giá trị. Tôi đã chọn tất cả và dán nó vào một trình soạn thảo văn bản, đó là tất cả.


1
vấn đề là sao chép đối tượng theo cách bạn cần để mở rộng nút theo nút và tôi có 145 nút
derloopkat
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.