ผลลัพธ์ของ System.Diagnostics.Debug.Write ปรากฏที่ใด


147

โปรแกรม C # ต่อไปนี้ (สร้างด้วยcsc hello.cs) พิมพ์เฉพาะHello via Console!บนคอนโซลและHello via OutputDebugStringในหน้าต่าง DebugView อย่างไรก็ตามฉันไม่เห็นSystem.Diagnostics.*สายใดเลย ทำไมถึงเป็นอย่างนั้น?

using System;
using System.Runtime.InteropServices;
class Hello {
    [DllImport("kernel32.dll", CharSet=CharSet.Auto)]
    public static extern void OutputDebugString(string message);

    static void Main() {
        Console.Write( "Hello via Console!" );
        System.Diagnostics.Debug.Write( "Hello via Debug!" );
        System.Diagnostics.Trace.Write( "Hello via Trace!" );
        OutputDebugString( "Hello via OutputDebugString" );
    }
}

อาจจำเป็นต้องมีสวิตช์บรรทัดคำสั่งพิเศษบางอย่างcscหรือไม่

ฉันไม่ได้ใช้ Visual Studio สำหรับการพัฒนาใด ๆ ของฉันนี่คือสิ่งที่เป็น commandline ล้วนๆ


เป็นที่กล่าวถึงในบางความคิดเห็นในการตอบอื่นสามารถใช้ไมโครซอฟท์ (SysInternals) DebugView: technet.microsoft.com/en-us/sysinternals/bb896647.aspx
จอร์จ Birbilis

คำตอบ:


77

ดังที่คนอื่น ๆ ได้ชี้ให้เห็นผู้ฟังจะต้องลงทะเบียนเพื่ออ่านสตรีมเหล่านี้ นอกจากนี้โปรดทราบว่าDebug.Writeจะทำงานเฉพาะเมื่อDEBUGตั้งค่าสถานะการสร้างในขณะที่Trace.Writeจะทำงานเฉพาะเมื่อTRACEตั้งค่าสถานะการสร้าง

การตั้งค่าDEBUGและ / หรือการตั้งค่าTRACEสถานะทำได้อย่างง่ายดายในคุณสมบัติโครงการใน Visual Studio หรือโดยการระบุอาร์กิวเมนต์ต่อไปนี้เป็น csc.exe

/define:DEBUG;TRACE


5
มันมีประโยชน์ (ไม่ได้คาดหวังว่า) สำหรับฉันที่จะหาว่าวัตถุ Debug และ Trace ใช้ฟัง Listen เหมือนกันดังนั้นทั้ง Debug.Write และ Trace.Write เอาท์พุทไปยังที่เดียวกันมันขึ้นอยู่กับว่า ตามเงื่อนไขที่อาจไม่ได้รับการดำเนินการ
hello_earth

1
คุณสามารถอธิบายรายละเอียดเกี่ยวกับเงื่อนไขต่างๆได้อย่างไร? การดีบักสถานการณ์ใดที่การเขียนจะไม่ทำงานเหมือนกับ trace.write
Pacerier

2
สิ่งนี้ใช้ไม่ได้สำหรับฉันฉันมีการดีบักและติดตามค่าสถานะในคุณสมบัติโครงการ vs และกำลังใช้ Debug.WriteLine บรรทัดดำเนินการ แต่ไม่มีอะไรปรากฏในหน้าต่างผลลัพธ์ใครมีคำแนะนำอื่นอีกบ้าง
f1wade

114

ในขณะที่การแก้จุดบกพร่องSystem.Diagnostics.Debug.WriteLineจะแสดงในหน้าต่างการส่งออก ( Ctrl+ Alt+ O), คุณยังสามารถเพิ่มTraceListenerไปยังDebug.Listenersคอลเลกชันเพื่อระบุDebug.WriteLineสายการส่งออกในสถานที่อื่น ๆ

หมายเหตุ: Debug.WriteLineสายอาจไม่แสดงในหน้าต่างการส่งออกถ้าคุณมี Visual Studio ตัวเลือก "เปลี่ยนเส้นทางข้อความทั้งหมดหน้าต่างออกไปยังหน้าต่าง Immediate" การตรวจสอบภายใต้เมนูToolsตัวเลือกการแก้จุดบกพร่อง → ทั่วไป หากต้องการแสดง " เครื่องมือตัวเลือกแก้ไขจุดบกพร่อง " ให้ทำเครื่องหมายในช่องถัดจาก " เครื่องมือตัวเลือกแสดงการตั้งค่าทั้งหมด "


4
ฉันต้องการยืนยันว่า (Ctrl + Alt + O) จะเปิดหน้าต่างแสดงผลขึ้นมาในขณะที่ทำการดีบักใน Visual Studio 2012
Ishikawa

45

คุณต้องเพิ่ม a TraceListenerเพื่อดูพวกมันปรากฏบนคอนโซล

TextWriterTraceListener writer = new TextWriterTraceListener(System.Console.Out);
Debug.Listeners.Add(writer);

พวกเขายังปรากฏในหน้าต่าง Visual Studio Output เมื่ออยู่ในโหมดดีบั๊ก


2
เห็นได้ชัดว่า DebugView จะจับทั้ง .NET Debug.Write () และ Win32 OutputDebugString (): technet.microsoft.com/en-us/sysinternals/bb896647
dlchambers

@dlchambers: ฉันไม่คิดว่าถูกต้อง หน้านั้นเรียกร้องการแสดงOutputDebugString()และ (เคอร์เนล)DbgPrint().
Mike C

1
@dlchambers: ฉันถอนความคิดเห็น; ฉันค้นพบว่า DebugView สามารถจับภาพได้Debug.Write() หากการตั้งค่าการจับภาพรวมถึง "Global Win32" - ซึ่งต้องใช้งานในโหมดผู้ดูแลระบบ
Mike C

10

ขณะที่คุณกำลังดีบักใน Visual Studio ให้แสดงหน้าต่าง "เอาท์พุท" (ดู -> เอาท์พุท) มันจะแสดงที่นั่น



5

เมื่อฉันเขียนdebug.write ("")ในรหัสมันจะแสดงผลใน "หน้าต่างทันที" ไม่ใช่ "หน้าต่างผลลัพธ์"

คุณสามารถลอง สำหรับการแสดงหน้าต่าง "ทันที" ( ดีบั๊กหน้าต่างทันที )


2

ทางออกสำหรับกรณีของฉันคือ:

  1. คลิกขวาที่หน้าต่างเอาต์พุต
  2. ตรวจสอบ 'โปรแกรมออก'

0

สำหรับ VB.NET จะใช้สิ่งต่อไปนี้ คุณต้องเลือก "ดีบั๊ก" และตรวจสอบให้แน่ใจว่าคุณ "เริ่มการดีบั๊ก" F5นี้สามารถเข้าถึงได้โดยการกดปุ่ม

Console.WriteLine จะแสดงข้อความเฉพาะเมื่อสร้างเป็น "Release" ในหน้าต่าง Output ของคุณ

ตามที่กล่าวไว้ก่อนเปิดหน้าต่าง Output ด้วยViewOutputและตรวจสอบให้แน่ใจว่าเลือก "Build" หากคุณต้องการดูข้อความ Console.WriteLine หรือ "Debug" หากคุณต้องการดูข้อความ Debug.WriteLine หรือ Trace.WriteLine

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