กำลังเขียนไปยังหน้าต่างแสดงผลของ Visual Studio


605

ฉันพยายามเขียนข้อความไปยังหน้าต่างแสดงผลเพื่อจุดประสงค์ในการดีบั๊ก ฉันค้นหาสำหรับฟังก์ชั่นเช่น system.out.println("")Java ฉันพยายามDebug.Write, และConsole.Write Trace.Writeมันไม่ได้ให้ข้อผิดพลาด แต่ก็ไม่ได้พิมพ์อะไรเช่นกัน

ตัวเลือก "กำหนดค่าคงที่ DEBUG" และ "กำหนดค่าติดตาม TRACE"

เครื่องมือเมนู→ ตัวเลือกการดีบัก"เปลี่ยนเส้นทางข้อความหน้าต่างผลลัพธ์ทั้งหมดไปยังหน้าต่างทันที"ไม่ได้ตรวจสอบ

การกำหนดค่า: ใช้งาน (ดีบัก)

หมายเหตุ: ฉันสร้างโครงการโดยใช้ตัวช่วยสร้างเป็น "แอปพลิเคชันฟอร์ม Windows" หากเกี่ยวข้อง ฉันไม่รู้ว่าจะไปหาที่ไหน


32
ลองใช้Debug.WriteLine()
Nikson Kanti Paul

9
เนื่องจากนี่เป็นโพสต์ที่เก่ากว่าฉันจะเพิ่มสิ่งนี้เป็นความคิดเห็นสำหรับผู้ที่สะดุดกับคำถาม แทนที่จะเปลี่ยนรหัสจริงคุณสามารถใช้เบรกพอยต์พิเศษที่เรียกว่า tracepoints ดูเอกสาร MSDN
Wonko the Sane

13
เพียงเตือนความจำว่า Debug.WriteLine () จะทำงานเมื่อทำงานใน Debug เท่านั้น นั่นหมายถึงการรันด้วย F5 ไม่ใช่ CTRL-F5 เรื่องนี้เป็นเรื่องง่ายที่จะพลาด
kirk.burleson

3
นั่นเป็นความจริง แต่เครื่องมือที่ใช้งานง่ายคือDebugViewซึ่งแสดงเอาต์พุตทั้งหมดไปยังสตรีมการดีบักเมื่อทำงานนอกดีบักเกอร์
the_mandrill

2
หากคุณพยายามที่จะเขียนผลลัพธ์จากการทดสอบหน่วยที่ทำงานภายใต้กรอบการทดสอบ Visual Studio กฎจะแตกต่างกันเล็กน้อยดูคำตอบนี้สำหรับรายละเอียด
yoyo

คำตอบ:


754

เพิ่มSystem.Diagnosticsเนมสเปซแล้วคุณสามารถใช้Debug.WriteLine()พิมพ์ข้อความไปยังหน้าต่างแสดงผลของ IDE ได้อย่างรวดเร็ว สำหรับรายละเอียดเพิ่มเติมโปรดดูที่:


2
ขอบคุณ. ฉันคิดว่าไม่มีวิธีเขียนไปยังเอาต์พุตถ้าฉันเริ่มต้นโดยไม่มีการดีบัก (ctrl-f5) ใช่ไหม?
previous_developer

1
ฉันเดาว่าคุณกำลังมองหาสิ่งนี้: stackoverflow.com/questions/562590/…
Bhargav Bhat

ขอขอบคุณอีกครั้ง แต่นั่นไม่ได้ผลสำหรับฉัน การติดตามไม่ได้พิมพ์โดยไม่มีโหมดการดีบักแม้ว่าจะกำหนด TRACE คงที่แล้วก็ตาม
previous_developer

เพิ่งรันแอพเล็ก ๆ ที่นี่ทำงานได้ดีสำหรับฉัน บางทีสภาพแวดล้อมของคุณอาจมีข้อผิดพลาดเล็กน้อย
Bhargav Bhat

1
นี่คือรหัสทดสอบของฉัน pastebin.com/b7P0bYEaมันค่อนข้างเรียบง่าย แต่ก็ยังไม่มีอะไร ฉันจะลองใช้กับระบบอื่น
previous_developer

154

สิ่งนี้จะเขียนไปที่หน้าต่างเอาต์พุต debug:

using System.Diagnostics;

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

6
สำหรับฉันแล้ว "เอาท์พุท" นี้ไปยังหน้าต่างทันที
nuander

ฉันลองสิ่งนี้ในชุดการทดสอบหน่วย ฉันทำการดีบั๊กการทดสอบที่เลือก แต่ไม่มีสิ่งใดที่ฉันพยายามพิมพ์ออกมาในหน้าต่างแก้ไขข้อบกพร่อง
Frank H.

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

เราสามารถเก็บบันทึกข้อความนี้ที่พิมพ์ในหน้าต่างแก้ไขข้อบกพร่องได้หรือไม่? หรือ visual studio ให้วิธีใด ๆ ในการเข้าถึงบันทึกของหน้าต่างดีบั๊ก .. ?
Anmol Rathod


55
Debug.WriteLine

คือสิ่งที่คุณกำลังมองหา

ถ้าไม่ลองทำสิ่งนี้:

เมนูToolsตัวเลือกการแก้จุดบกพร่อง →ยกเลิกการส่งออกไปยังทันที


1
Debug เป็นไปได้อาจเขียน () ไม่ได้ใส่แคร่คืนเพื่อให้ข้อความได้รับการบัฟเฟอร์?
Guy Starbuck

2
ฉันไม่เห็น Debug.WriteLine ("String") จนกระทั่งหลังจากที่ฉันทำในสิ่งที่มีคาห์กล่าว Tools|Options|Debugging uncheck Send Output to Immediate
Skindeep2366

3
ฉันคิดว่าในรุ่นที่ใหม่กว่ากล่องกาเครื่องหมายคือ "เปลี่ยนเส้นทางข้อความหน้าต่างผลลัพธ์ทั้งหมดไปยังหน้าต่างทันที"
Houdini Sutherland

6
ใน VS 2015 เรียกว่า: "เปลี่ยนเส้นทางข้อความหน้าต่างการส่งออกทั้งหมดไปยังหน้าต่างทันที" ในกรณีที่บางคนต้องมองหา 5 นาทีเพื่อค้นหาการตั้งค่าที่เหมาะสม :) - ฉันเลื่อนขึ้นและลงเพื่อค้นหาตัวเลือกที่ขึ้นต้นด้วย " ส่ง ... ":)
dba

22

สำหรับฉันเฉพาะเนมสเปซการติดตามเท่านั้นและไม่ใช่ Debug ที่ใช้ได้:

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

ฉันทำงานในโครงการ C # ภายใต้ Visual Studio 2010


2
ฉันใช้ VS 2013 Professional และพยายามรับผลการทดสอบหน่วยโดยใช้กรอบการทดสอบหน่วย Visual Studio จะปรากฏการทดสอบการจับภาพและเปลี่ยนเส้นทาง Debug.WriteLine แต่ไม่ใช่ Trace.WriteLine และคุณจะไม่เห็นผลลัพธ์การติดตามอย่างใดอย่างหนึ่งเว้นแต่ว่าคุณจะทำการดีบักการทดสอบ (ไม่ใช่แค่เรียกใช้งาน)
yoyo

15

คุณอาจกำลังมองหา

MessageBox.Show()

หรือ

Debug.Writeline()

8
MessageBox.Show()อาจเป็นเรื่องที่น่ารำคาญมากเมื่อคุณต้องการเขียนหลาย ๆ ค่าเพื่อการดีบั๊ก
Dementic

4
คำถามคือ "เขียนไปยังหน้าต่างแสดงผลของ Visual Studio?" ไม่ไปที่กล่องข้อความ
Amir Touitou

@AmirTwito กล่องข้อความเป็นหน้าต่างเอาต์พุต
ProfK

4
ใช่คุณถูกต้อง แต่คำถามคือ "หน้าต่างเขียนไปยังเอาท์พุทของ Visual Studio?" และไม่ใช่ไปยังกล่องข้อความอย่างง่ายโดยใช้รหัสนี้: MessageBox.Show ()
Amir Touitou

4
@ProfK หน้าต่างแสดงผลของ Visual Studioเป็นองค์ประกอบ GUI เฉพาะของโปรแกรมเฉพาะและMessageBox.Showไม่ได้เขียนลงไป
jpmc26

9

โทร

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

ล้มเหลวเมื่อทำงานกับ. NET Core (V 1.0 หรือ 1.1)

เราควรจะสร้างและใช้เครื่องบันทึกจากMicrosoft.Extensions.Loggingแต่บันทึกนั้นจะปรากฏเฉพาะในหน้าต่างคอนโซลป๊อปอัป dotnet.exe ไม่ใช่ในหน้าต่างแสดงผลของ Visual Studio


ดังนั้น Debug.WriteLine (), Console.WriteLine () และ Trace.WriteLine () จะไม่แสดงผลอะไรใน Output สำหรับ. Net Core? มีวิธีใดบ้างที่จะใช้การบันทึกอย่างง่ายโดยไม่ต้องเขียน Logclass? ได้ค้นหาในเครื่องมือ> ตัวเลือก> แก้ไขข้อบกพร่องและตรวจสอบ "แสดงผลลัพธ์จาก:" เพื่อหาวิธีแก้ปัญหาที่เป็นไปได้
Wouter Vanherck

4

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

คุณต้องติดตั้งชุดติดตาม Traceของ Serilog ก่อน เมื่อติดตั้งแล้วคุณจะต้องตั้งค่าตัวบันทึกดังนี้:

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

(คุณสามารถตั้งค่าระดับต่ำสุดที่แตกต่างกันหรือตั้งเป็นค่าปรับแต่งหรือฟังก์ชั่น Serilog ปกติก็ได้นอกจากนี้คุณยังสามารถตั้งค่า Trace logger ให้อยู่ในระดับที่เฉพาะเจาะจงเพื่อแทนที่ configs หรืออย่างไรก็ตามคุณต้องการทำเช่นนี้)

จากนั้นคุณเพียงแค่บันทึกข้อความตามปกติและพวกเขาจะปรากฏขึ้นในหน้าต่างผลลัพธ์ของคุณ:

Logger.Information("Did stuff!");

มันไม่ได้เป็นเรื่องใหญ่อะไรอย่างนี้เลยขอผมอธิบายข้อดีเพิ่มเติมหน่อย หนึ่งที่ใหญ่ที่สุดสำหรับฉันคือฉันสามารถเข้าสู่ทั้งหน้าต่างผลลัพธ์และคอนโซลพร้อมกัน:

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

นี้ให้ฉันความยืดหยุ่นที่ดีในแง่ของวิธีการที่ฉันบริโภคการส่งออกได้โดยไม่ต้องทำซ้ำทุกสายของฉันไปด้วยConsole.Write Debug.Writeเมื่อเขียนรหัสฉันสามารถเรียกใช้เครื่องมือบรรทัดคำสั่งใน Visual Studio ได้โดยไม่ต้องกลัวว่าจะสูญเสียเอาต์พุตเมื่อออก เมื่อฉันปรับใช้และจำเป็นต้องแก้ไขข้อบกพร่องบางอย่าง (และไม่มี Visual Studio ให้ใช้) คอนโซลเอาต์พุตพร้อมใช้งานสำหรับการบริโภคของฉัน ข้อความเดียวกันนี้ยังสามารถบันทึกลงในไฟล์ (หรือซิงค์ชนิดอื่น) เมื่อมันทำงานเป็นงานที่กำหนดเวลาไว้

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

นอกจากนี้ยังต้องมีการตั้งค่าและรหัสน้อยมาก


1
ตอนนี้ Serilog มี "debug" sink ที่github.com/serilog/serilog-sinks-debugซึ่งทำงานในลักษณะเดียวกัน แต่มีการจัดรูปแบบที่ดีกว่าเล็กน้อย :-) HTH!
Nicholas Blumhardt

ทำไมไม่สร้างเมธอด. net แบบสาธารณะ (อาจเป็นแบบคงที่) และวางทุกสิ่งที่คุณต้องการเช่น Console.Write หรือ Debug.Write ฯลฯ และใช้งานได้ทุกที่?
Saulius

@Saulius "ข้อความเดียวกันยังสามารถบันทึกลงในไฟล์ (หรือ sink ชนิดอื่น ๆ ) เมื่อมันทำงานเป็นงานที่กำหนดไว้บรรทัดล่างคือการใช้ Serilog ในการทำสิ่งนี้ทำให้ง่ายต่อการทิ้งข้อความไปยังหลากหลาย จุดหมายปลายทางทำให้มั่นใจได้ว่าฉันสามารถเข้าถึงเอาท์พุทได้ตลอดเวลาโดยไม่คำนึงว่าฉันจะวิ่งอย่างไร "
jpmc26

1

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

ในที่สุดฉันก็ใช้หน้าต่างคำสั่งและป้อนDebug.Printคำสั่งดังที่แสดงด้านล่าง สิ่งนี้พิมพ์วัตถุหน่วยความจำในรูปแบบที่สามารถคัดลอกเป็นข้อความซึ่งเป็นสิ่งที่ฉันต้องการจริงๆ

> Debug.Print <item>

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


0

การทำงานต่อไปนี้สำหรับฉันใน Visual Studio 2015:

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

อ่านเอกสารสำหรับ OutputDebugStringW ที่นี่

ป้อนคำอธิบายรูปภาพที่นี่ โปรดทราบว่าวิธีนี้ใช้งานได้เฉพาะเมื่อคุณทำการดีบักรหัสของคุณ ( debug mode)


11
นั่นคือ C ++ ใช่ไหม คำถามคือแท็กC #
jpmc26

0

สำหรับวัตถุประสงค์ในการดีบั๊กSystem.Diagnostics.Debug.Writeline()คำสั่งจะไม่ถูกคอมไพล์ลงในรหัสรุ่นที่วางจำหน่ายเว้นแต่คุณจะมีผู้ฟังดีบั๊ก มันเขียนไปยังผู้ฟังการติดตามทั้งหมดที่มีหน้าต่างเอาต์พุต VS เมื่อทำงานในโหมดดีบั๊ก

สำหรับแอปพลิเคชันคอนโซล Console.Writeline()จะทำงานได้ แต่ผลลัพธ์จะยังคงถูกสร้างขึ้นในไบนารีรีลีสของคุณ

การดีบักเอาต์พุตควรปรากฏในหน้าต่างเอาต์พุตปกติเมื่อทำการดีบักการทดสอบ ในขณะที่เอาต์พุต console.writeline ไม่ได้ (แต่สามารถพบได้ในหน้าต่างทดสอบผลลัพธ์)

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