Menulis ke jendela keluaran Visual Studio


606

Saya mencoba menulis pesan ke jendela keluaran untuk keperluan debugging. Saya mencari fungsi seperti Java system.out.println(""). Saya mencoba Debug.Write, Console.Writedan Trace.Write. Itu tidak memberikan kesalahan, tetapi juga tidak mencetak apa pun.

Opsi "Define DEBUG constant" dan "Define TRACE constant" dicentang.

Alat Menu → PilihanDebugging"Alihkan semua teks Jendela Output ke Jendela Segera" pilihan tidak dicentang.

Konfigurasi: Aktif (Debug)

Catatan: Saya membuat proyek dengan wizard sebagai "Aplikasi Formulir Windows" jika relevan. Saya tidak tahu ke mana harus mencari.


32
coba gunakanDebug.WriteLine()
Nikson Kanti Paul

9
Karena ini adalah posting yang lebih lama, saya akan menambahkan ini sebagai komentar untuk mereka yang menemukan pertanyaan. Alih-alih benar-benar mengubah kode, Anda juga dapat menggunakan breakpoint khusus yang disebut tracepoints. Lihat dokumentasi MSDN
Wonko the Sane

13
Hanya pengingat bahwa Debug.WriteLine () hanya akan berfungsi ketika berjalan di Debug. Itu berarti menjalankannya dengan F5 dan bukan CTRL-F5. Ini mudah untuk dilewatkan.
kirk.burleson

3
Itu benar, tetapi alat yang berguna adalah DebugView yang menunjukkan semua output ke aliran debug ketika berjalan di luar debugger
the_mandrill

2
Jika Anda mencoba untuk menulis output dari unit test yang berjalan di bawah kerangka uji Visual Studio aturannya sedikit berbeda, lihat jawaban ini untuk detailnya.
yoyo

Jawaban:


754

Tambahkan System.Diagnosticsnamespace, dan kemudian Anda dapat menggunakannya Debug.WriteLine()untuk dengan cepat mencetak pesan ke jendela output IDE. Untuk detail lebih lanjut, silakan merujuk ini:


2
Terima kasih. Saya berasumsi tidak ada cara untuk menulis ke keluaran jika saya mulai tanpa debugging (ctrl-f5) kan?
previous_developer

1
Saya kira Anda sedang mencari ini: stackoverflow.com/questions/562590/…
Bhargav Bhat

Terima kasih lagi tetapi itu tidak berhasil untuk saya. Trace tidak mencetak tanpa mode debug meskipun TRACE konstan didefinisikan.
previous_developer

Baru saja menjalankan aplikasi kecil di sini, berfungsi dengan baik untuk saya. Mungkin ada kesalahan kecil di lingkungan Anda?
Bhargav Bhat

1
Ini adalah kode pengujian saya; pastebin.com/b7P0bYEa Ini cukup sederhana tapi tetap tidak ada. Saya akan mencobanya di sistem lain.
previous_developer

154

Ini akan menulis ke jendela hasil debug:

using System.Diagnostics;

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

6
Bagi saya ini "output" ke jendela Segera
nuander

Saya mencoba ini pada serangkaian unit test. Saya menolak tes yang dipilih, tetapi tidak ada yang saya coba cetak di jendela debug.
Frank H.

Akan tetapi, ini menghasilkan jendela Debug, hanya setelah saya menutup halaman web. Saya ingin tampilan langsung ketika saya menjalankan kode. Tunggu sebentar - Saya menemukan bahwa jendela output disembunyikan ketika kode sedang dieksekusi. Jika saya menampilkan jendela, output saya ada di sana.
Joe Cotton

Bisakah kita menyimpan log pesan ini yang dicetak di jendela debug? atau apakah visual studio menyediakan cara apa pun untuk mengakses log jendela debug ..?
Anmol Rathod

82

Menggunakan:

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

55
Debug.WriteLine

adalah apa yang kamu cari.

Jika tidak, coba lakukan ini:

Alat Menu → PilihanDebugging → hapus centang Kirim Output untuk Segera .


1
Kemungkinan Debug.Write () tidak memasukkan carriage return, jadi pesan semakin di-buffered?
Guy Starbuck

2
Saya tidak melihat Debug.WriteLine ("String") sampai setelah saya melakukan apa yang dikatakan Mikha. Tools|Options|Debugging uncheck Send Output to Immediate
Skindeep2366

3
Saya pikir dalam versi selanjutnya kotak centang adalah "Redirect semua jendela Output teks ke Jendela Segera"
Houdini Sutherland

6
dalam VS 2015 itu disebut: "Redirect semua teks Window Output ke Jendela Segera", untuk berjaga-jaga, beberapa harus mencari 5 menit untuk menemukan pengaturan yang sesuai :) - Saya sedang menggulir ke atas dan ke bawah untuk menemukan optiona dimulai dengan " Send ... ":)
dba

22

Bagi saya, hanya Trace namespace dan bukan Debug yang bekerja:

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

Saya bekerja di proyek C # di bawah Visual Studio 2010.


2
Saya menggunakan VS 2013 Professional dan berusaha untuk mendapatkan output dari tes unit menggunakan kerangka uji unit Visual Studio. Tampaknya test harness menangkap dan mengalihkan Debug.WriteLine tetapi tidak Trace.WriteLine. Dan Anda tidak akan melihat Trace output kecuali Anda men-debug tes (tidak hanya menjalankannya).
yoyo

15

Anda mungkin sedang mencari

MessageBox.Show()

atau

Debug.Writeline()

8
MessageBox.Show()bisa sangat menjengkelkan ketika Anda ingin menulis beberapa nilai untuk keperluan debugging.
Demensik

4
Pertanyaannya adalah "Menulis ke jendela keluaran Visual Studio?" tidak ke kotak pesan.
Amir Touitou

@AmirTwito Kotak pesan adalah jendela keluaran.
ProfK

4
Ya Anda benar, tetapi pertanyaannya adalah "Menulis ke jendela keluaran Visual Studio?" dan bukan ke kotak pesan sederhana menggunakan kode ini: MessageBox.Show ()
Amir Touitou

4
@ProfK Jendela Keluaran Visual Studio adalah elemen GUI yang sangat spesifik dari program tertentu, dan MessageBox.Showtidak menuliskannya.
jpmc26

9

Panggilan

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

gagal saat bekerja dengan .NET Core (V 1.0 atau 1.1).

Kita seharusnya membuat dan menggunakan logger dari Microsoft.Extensions.Logging, tetapi log itu hanya muncul di jendela konsol popnet dotnet.exe, bukan di jendela Output Visual Studio.


Jadi Debug.WriteLine (), Console.WriteLine () dan Trace.WriteLine () tidak menghasilkan apa pun di Output untuk .Net Core? Adakah cara untuk menggunakan semacam pencatatan sederhana tanpa harus menulis Logclass? Telah mencari di Tools> Options> Debugging dan memeriksa "Show output from:" untuk solusi yang memungkinkan.
Wouter Vanherck

4

Ini membutuhkan kerangka kerja pihak ketiga, yaitu Serilog , tetapi saya tetap menganggapnya sangat lancar dengan mendapatkan output ke beberapa tempat yang bisa saya lihat.

Pertama-tama Anda harus menginstal wastafel Jejak Serilog . Setelah diinstal, Anda perlu mengatur logger seperti ini:

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

(Anda dapat mengatur level minimum yang berbeda atau mengaturnya ke nilai konfigurasi atau fungsi Serilog normal mana pun. Anda juga dapat mengatur Tracelogger ke level tertentu untuk mengganti konfigurasi, atau bagaimanapun Anda ingin melakukan ini.)

Kemudian, Anda cukup mencatat pesan secara normal dan muncul di jendela Output:

Logger.Information("Did stuff!");

Ini sepertinya bukan masalah besar, jadi izinkan saya menjelaskan beberapa manfaat tambahan. Yang terbesar bagi saya adalah saya bisa secara bersamaan masuk ke jendela Output dan konsol :

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

Ini memberi saya fleksibilitas yang besar dalam hal bagaimana saya dikonsumsi output, tanpa harus menduplikasi semua panggilan saya untuk Console.Writedengan Debug.Write. Saat menulis kode, saya bisa menjalankan alat baris perintah di Visual Studio tanpa takut kehilangan output saat keluar. Ketika saya telah menggunakannya dan perlu men-debug sesuatu (dan tidak memiliki Visual Studio tersedia), output konsol sudah tersedia untuk konsumsi saya. Pesan yang sama juga dapat dicatat ke file (atau jenis sink lainnya) saat dijalankan sebagai tugas yang dijadwalkan.

Intinya adalah bahwa menggunakan Serilog untuk melakukan ini membuatnya sangat mudah untuk membuang pesan ke banyak tujuan, memastikan saya selalu dapat dengan mudah mengakses output terlepas dari bagaimana saya menjalankannya.

Ini juga membutuhkan pengaturan dan kode yang sangat minim.


1
Serilog sekarang juga memiliki wastafel "debug" di github.com/serilog/serilog-sinks-debug yang berfungsi dengan cara yang serupa, tetapi memiliki format yang sedikit lebih bagus :-) HTH!
Nicholas Blumhardt

Mengapa tidak membuat metode .net publik (mungkin statis) dan meletakkan semua yang Anda butuhkan di sana seperti Console.Write atau Debug.Write dll dan menggunakannya di mana-mana?
Saulius

@ Saulius "Pesan yang sama juga dapat dicatat ke file (atau jenis sink lainnya) ketika itu berjalan sebagai tugas yang dijadwalkan. Intinya adalah menggunakan Serilog untuk melakukan ini membuatnya sangat mudah untuk membuang pesan ke banyak tujuan, memastikan saya selalu dapat dengan mudah mengakses output terlepas dari bagaimana saya menjalankannya. "
jpmc26

1

Ini bukan jawaban untuk pertanyaan awal. Tapi karena saya menemukan pertanyaan ini ketika mencari cara untuk secara interaktif membuang data objek, saya pikir orang lain mungkin mendapat manfaat dengan menyebutkan alternatif yang sangat berguna ini.

Saya akhirnya menggunakan Window Perintah dan memasukkan Debug.Printperintah, seperti yang ditunjukkan di bawah ini. Ini mencetak objek memori dalam format yang dapat disalin sebagai teks, yang sangat saya butuhkan.

> Debug.Print <item>

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


0

Berikut ini bekerja untuk saya di Visual Studio 2015:

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

Baca dokumentasi untuk OutputDebugStringW di sini .

masukkan deskripsi gambar di sini Perhatikan bahwa metode ini hanya berfungsi jika Anda men-debug kode Anda ( debug mode)


11
Apakah itu C ++? Pertanyaannya ditandai c # .
jpmc26

0

Untuk keperluan debugging, System.Diagnostics.Debug.Writeline()perintah tidak akan dikompilasi ke versi rilis kode Anda kecuali Anda memiliki pendengar debug. Itu menulis untuk semua pendengar jejak yang termasuk jendela VS output ketika berjalan dalam mode Debug.

Untuk aplikasi Konsol. Console.Writeline()akan bekerja tetapi hasilnya masih akan dihasilkan dalam versi rilis biner Anda.

Output debug juga akan muncul di jendela output normal ketika debugging tes; sedangkan, output konsol.writeline tidak (tetapi dapat ditemukan di jendela output tes.)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.