Cửa sổ ghi vào đầu ra của Visual Studio


605

Tôi đang cố gắng viết một thông báo vào cửa sổ đầu ra cho mục đích gỡ lỗi. Tôi đã tìm kiếm một hàm như Java system.out.println(""). Tôi đã cố gắng Debug.Write, Console.WriteTrace.Write. Nó không đưa ra một lỗi, nhưng nó cũng không in bất cứ điều gì.

Các tùy chọn "Xác định hằng số DEBUG" và "Xác định hằng số TRACE" được chọn.

Công cụ menu → Tùy chọnGỡ lỗi"Chuyển hướng tất cả văn bản Cửa sổ đầu ra sang Cửa sổ ngay lập tức" không được chọn.

Cấu hình: Hoạt động (Gỡ lỗi)

Lưu ý: Tôi đã tạo một dự án với trình hướng dẫn là "Ứng dụng Windows Forms" nếu có liên quan. Tôi không biết phải tìm ở đâu.


32
thử sử dụngDebug.WriteLine()
Nikson Kanti Paul

9
Vì đây là một bài viết cũ hơn, tôi sẽ thêm bài viết này như một bình luận cho những người vấp phải câu hỏi. Thay vì thực sự thay đổi mã, bạn cũng có thể sử dụng các điểm dừng đặc biệt được gọi là tracepoints. Xem tài liệu MSDN
Wonko the Sane

13
Chỉ cần nhắc nhở rằng Debug.WriteLine () sẽ chỉ hoạt động khi chạy trong Debug. Điều đó có nghĩa là chạy nó với F5 chứ không phải CTRL-F5. Điều này rất dễ bỏ lỡ.
kirk.burleson

3
Điều đó đúng, nhưng một công cụ tiện dụng là DebugView hiển thị tất cả đầu ra cho luồng gỡ lỗi khi chạy bên ngoài trình gỡ lỗi
the_mandrill

2
Nếu bạn đang cố gắng viết đầu ra từ một bài kiểm tra đơn vị chạy trong khung kiểm tra Visual Studio, các quy tắc hơi khác một chút, hãy xem câu trả lời này để biết chi tiết.
yoyo

Câu trả lời:


754

Thêm System.Diagnosticskhông gian tên và sau đó bạn có thể sử dụng Debug.WriteLine()để nhanh chóng in một tin nhắn đến cửa sổ đầu ra của IDE. Để biết thêm chi tiết, xin vui lòng tham khảo sau:


2
Cảm ơn bạn. Tôi giả sử không có cách nào để ghi vào đầu ra nếu tôi bắt đầu mà không gỡ lỗi (ctrl-f5) phải không?
trước đó

1
Tôi đoán bạn đang tìm kiếm cái này: stackoverflow.com/questions/562590/ từ
Bhargav Bhat

Cảm ơn một lần nữa nhưng điều đó không làm việc cho tôi. Dấu vết không in mà không có chế độ gỡ lỗi ngay cả khi hằng số TRACE được xác định.
previous_developer

Chỉ cần chạy một ứng dụng nhỏ ở đây, hoạt động tốt cho tôi. Có lẽ có một trục trặc nhỏ trong môi trường của bạn?
Bhargav Bhat

1
Đây là mã kiểm tra của tôi; pastebin.com/b7P0bYEa Nó khá đơn giản nhưng vẫn không có gì. Tôi sẽ thử nó trên một hệ thống khác.
previous_developer

154

Điều này sẽ ghi vào cửa sổ đầu ra gỡ lỗi:

using System.Diagnostics;

Debug.WriteLine("Send to debug output.");

6
Đối với tôi, "đầu ra" này cho cửa sổ Ngay lập tức
nuander 10/03/2015

Tôi đã thử điều này trên một loạt các bài kiểm tra đơn vị. Tôi đã gỡ lỗi bài kiểm tra đã chọn, nhưng không có gì tôi cố in ra trong cửa sổ gỡ lỗi.
Frank H.

Điều này không xuất ra cửa sổ Debug, tuy nhiên, chỉ sau khi tôi đóng trang web. Tôi muốn một màn hình ngay lập tức khi tôi thực thi mã. Đợi một chút - Tôi thấy rằng cửa sổ đầu ra bị ẩn trong khi mã đang thực thi. Nếu tôi hiển thị cửa sổ, đầu ra của tôi là ở đó.
Joe Cotton

Chúng ta có thể giữ một bản ghi của thông báo này được in trong cửa sổ gỡ lỗi không? hoặc visual studio cung cấp bất kỳ cách nào để truy cập vào nhật ký của cửa sổ gỡ lỗi ..?
Anmol Rathod

82

Sử dụng:

System.Diagnostics.Debug.WriteLine("your message here");

55
Debug.WriteLine

là những gì bạn đang tìm kiếm.

Nếu không, hãy thử làm điều này:

Công cụ menu → Tùy chọnGỡ lỗi → bỏ chọn Gửi đầu ra ngay lập tức .


1
Có thể Debug.Write () không chèn trả lại vận chuyển, vì vậy tin nhắn đang được đệm?
Guy Starbuck

2
Tôi đã không thấy Debug.WriteLine ("Chuỗi") cho đến khi tôi làm những gì Micah nói. Tools|Options|Debugging uncheck Send Output to Immediate
Skindeep2366

3
Tôi nghĩ trong các phiên bản sau, hộp kiểm là "Chuyển hướng tất cả văn bản Cửa sổ đầu ra sang Cửa sổ ngay lập tức"
Houdini Sutherland

6
trong VS 2015 có tên: "Chuyển hướng tất cả văn bản Cửa sổ đầu ra sang Cửa sổ ngay lập tức", chỉ trong trường hợp, một số phải tìm trong 5 phút để tìm cài đặt phù hợp :) - Tôi đã cuộn lên và xuống để tìm tùy chọn bắt đầu bằng " Gửi ... ":)
dba

22

Đối với tôi, chỉ có không gian tên Trace chứ không phải Debug hoạt động:

System.Diagnostics.Trace.WriteLine("message");

Tôi đang làm việc trong một dự án C # trong Visual Studio 2010.


2
Tôi đang sử dụng VS 2013 Professional và đang cố lấy đầu ra từ một bài kiểm tra đơn vị bằng cách sử dụng khung kiểm tra đơn vị Visual Studio. Nó xuất hiện khai thác thử nghiệm chụp và chuyển hướng Debug.WriteLine nhưng không phải Trace.WriteLine. Và bạn sẽ không thấy đầu ra Trace trừ khi bạn gỡ lỗi các bài kiểm tra (không chỉ chạy chúng).
yoyo

15

Bạn có thể đang tìm kiếm

MessageBox.Show()

hoặc là

Debug.Writeline()

8
MessageBox.Show()có thể rất khó chịu khi bạn muốn viết nhiều giá trị cho mục đích gỡ lỗi.
Mất trí nhớ

4
Câu hỏi là "Viết ra cửa sổ đầu ra của Visual Studio?" không vào hộp tin nhắn
Amir Touitou

@AmirTwito Một hộp thông báo là một cửa sổ đầu ra.
ProfK

4
Có bạn đúng, nhưng câu hỏi là "Viết ra cửa sổ đầu ra của Visual Studio?" và không sử dụng hộp thông báo đơn giản bằng mã này: MessageBox.Show ()
Amir Touitou

4
@ProfK Cửa sổ đầu ra Visual Studio là một thành phần GUI rất cụ thể của chương trình cụ thể và MessageBox.Showkhông ghi vào nó.
jpmc26

9

Cuộc gọi

System.Diagnostics.Debug.WriteLine("message");

thất bại khi làm việc với .NET Core (V 1.0 hoặc 1.1).

Chúng tôi phải tạo và sử dụng một logger từ Microsoft.Extensions.Logging, nhưng nhật ký đó chỉ xuất hiện trong cửa sổ bảng điều khiển bật lên dotnet.exe, không phải trong cửa sổ đầu ra của Visual Studio.


Vì vậy, Debug.WriteLine (), Console.WriteLine () và Trace.WriteLine () không xuất bất cứ thứ gì trong Đầu ra cho .Net Core? Bất kỳ cách nào để sử dụng một số loại ghi nhật ký đơn giản mà không cần phải viết một Loggroup? Đã tìm kiếm trong Công cụ> Tùy chọn> Gỡ lỗi và kiểm tra "Hiển thị đầu ra từ:" cho các giải pháp có thể.
Wouter Vanherck

4

Điều này đòi hỏi một khuôn khổ của bên thứ ba, cụ thể là Serilog , nhưng dù sao tôi đã tìm thấy nó là một rất trải nghiệm suôn sẻ với việc đưa đầu ra đến một nơi nào đó mà tôi có thể thấy nó.

Trước tiên, bạn cần cài đặt bồn rửa Trace của Serilog . Sau khi cài đặt, bạn cần thiết lập bộ ghi như thế này:

Logger = new LoggerConfiguration()
    .MinimumLevel.Verbose()
    .WriteTo.Trace()
    .CreateLogger();

(Bạn có thể đặt mức tối thiểu khác hoặc đặt thành giá trị cấu hình hoặc bất kỳ chức năng Serilog thông thường nào. Bạn cũng có thể đặt Trace ghi nhật ký ở mức cụ thể để ghi đè cấu hình hoặc tuy nhiên bạn muốn làm điều này.)

Sau đó, bạn chỉ cần đăng nhập tin nhắn bình thường và chúng hiển thị trong cửa sổ đầu ra của bạn:

Logger.Information("Did stuff!");

Điều này dường như không phải là một vấn đề lớn, vì vậy hãy để tôi giải thích một số lợi thế bổ sung. Cái lớn nhất đối với tôi là tôi có thể đăng nhập đồng thời vào cả cửa sổ đầu ra và bàn điều khiển :

Logger = new LoggerConfiguration()
    .MinimumLevel.Verbose()
    .WriteTo.Trace()
    .WriteTo.Console(standardErrorFromLevel: LogEventLevel.Error)
    .CreateLogger();

Điều này mang lại cho tôi sự linh hoạt tuyệt vời về cách tôi tiêu thụ đầu ra, mà không phải lặp lại tất cả các cuộc gọi của tôi Console.Writevới Debug.Write. Khi viết mã, tôi có thể chạy công cụ dòng lệnh của mình trong Visual Studio mà không sợ mất đầu ra khi thoát. Khi tôi đã triển khai nó và cần gỡ lỗi một cái gì đó (và không có sẵn Visual Studio), đầu ra giao diện điều khiển đã có sẵn cho tiêu dùng của tôi. Các tin nhắn tương tự cũng có thể được ghi vào một tệp (hoặc bất kỳ loại chìm nào khác) khi nó chạy như một tác vụ theo lịch trình.

Điểm mấu chốt là việc sử dụng Serilog để thực hiện việc này giúp việc chuyển các tin nhắn đến vô số đích đến thật dễ dàng, đảm bảo tôi luôn có thể dễ dàng truy cập đầu ra bất kể tôi chạy nó như thế nào.

Nó cũng đòi hỏi thiết lập và mã rất tối thiểu.


1
Serilog hiện cũng có phần "gỡ lỗi" tại github.com/serilog/serilog-sinks-debug hoạt động theo cách tương tự, nhưng có định dạng đẹp hơn một chút :-) HTH!
Nicholas Blumhardt

Tại sao không tạo phương thức .net công khai (có thể là tĩnh) và đặt ở đó mọi thứ bạn cần như Console.Write hoặc Debug.Write, v.v. và sử dụng nó ở mọi nơi?
Saulius

@Saulius "Các tin nhắn tương tự cũng có thể được ghi vào một tệp (hoặc bất kỳ loại chìm nào khác) khi nó chạy như một tác vụ theo lịch trình. Điểm mấu chốt là việc sử dụng Serilog để thực hiện điều này giúp dễ dàng chuyển tin nhắn đến vô số điểm đến, đảm bảo tôi luôn có thể dễ dàng truy cập đầu ra bất kể tôi đã chạy nó như thế nào. "
jpmc26

1

Đây không phải là một câu trả lời cho câu hỏi ban đầu. Nhưng vì tôi đã tìm thấy câu hỏi này khi tìm kiếm một phương tiện để hủy dữ liệu đối tượng tương tác, tôi cho rằng những người khác có thể được lợi từ việc đề cập đến phương án rất hữu ích này.

Cuối cùng tôi đã sử dụng Cửa sổ lệnh và nhập Debug.Printlệnh, như hiển thị bên dưới. Điều này đã in một đối tượng bộ nhớ ở định dạng có thể được sao chép dưới dạng văn bản, đó là tất cả những gì tôi thực sự cần.

> Debug.Print <item>

  id: 1
  idt: null
  igad: 99
  igbd: 99
  gl_desc: "New #20"
  te_num: "1-001-001-020"


0

Sau đây làm việc cho tôi trong Visual Studio 2015:

OutputDebugStringW(L"Write this to Output window in VS14.");

Đọc tài liệu cho OutputDebugStringW tại đây .

nhập mô tả hình ảnh ở đây Lưu ý rằng phương pháp này chỉ hoạt động nếu bạn đang gỡ lỗi mã của mình ( debug mode)


11
Có phải đó là C ++? Câu hỏi được gắn thẻ c # .
jpmc26

0

Đối với mục đích gỡ lỗi, System.Diagnostics.Debug.Writeline()lệnh sẽ không được biên dịch thành phiên bản phát hành mã của bạn trừ khi bạn có trình nghe gỡ lỗi. Nó ghi vào tất cả các trình nghe theo dõi bao gồm cửa sổ đầu ra VS khi chạy ở chế độ Gỡ lỗi.

Đối với một ứng dụng Console. Console.Writeline()sẽ hoạt động nhưng đầu ra vẫn sẽ được tạo trong phiên bản phát hành nhị phân của bạn.

Đầu ra gỡ lỗi cũng sẽ xuất hiện trong cửa sổ đầu ra bình thường khi kiểm tra gỡ lỗi; trong khi đó, đầu ra console.writeline không (nhưng có thể được tìm thấy trong cửa sổ đầu ra thử nghiệm.)

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.