2008-09-23 27 views
11

Trong cài đặt công cụ bên ngoài của VS có hộp kiểm "Sử dụng cửa sổ đầu ra" để ghi lại đầu ra dòng lệnh của công cụ và đưa nó vào tab VS.Capture đầu ra bàn điều khiển để gỡ lỗi trong VS?

Câu hỏi đặt ra là: tôi có thể nhận được xử lý tương tự cho chương trình của mình khi tôi nhấn F5 không?

Chỉnh sửa: FWIW Tôi đang ở C# nhưng nếu điều đó tạo sự khác biệt cho câu trả lời của bạn thì có thể câu trả lời của bạn là điều tôi đang tìm kiếm.

Điều tôi muốn lấy luồng đầu ra của chương trình và chuyển nó vào tab đầu ra trong VS bằng cách sử dụng cùng thiết bị chuyển hướng đầu ra ('|' và '>') sử dụng trong dấu nhắc cmd.

Trả lời

1

Tôi sẽ đưa ra một vài giả định ở đây. Trước tiên, tôi đoán rằng bạn đang nói về đầu ra printf từ một ứng dụng (cho dù đó là từ một ứng dụng giao diện điều khiển hoặc từ một ứng dụng GUI cửa sổ). Giả định thứ hai của tôi là ngôn ngữ C.

Theo hiểu biết của tôi, bạn không thể chuyển trực tiếp đầu ra printf tới cửa sổ đầu ra trong studio dev, chứ không phải trực tiếp. [nhấn mạnh được thêm bởi OP]

Có thể có một cách nhưng tôi không biết điều đó. Một điều mà bạn có thể làm mặc dù sẽ chỉ đạo chức năng printf cuộc gọi đến thói quen của riêng bạn mà sẽ

  1. gọi printf và in chuỗi
  2. gọi OuputDebugString() để in các chuỗi các cửa sổ đầu ra

Bạn có thể thực hiện một số việc để đạt được mục tiêu này. Đầu tiên sẽ là để viết hàm printf của riêng bạn và sau đó gọi printf và OuputDebugString()

void my_printf(const char *format, ...) 
{ 
    char buf[2048]; 

    // get the arg list and format it into a string 
    va_start(arglist, format); 
    vsprintf_s(buf, 2048, format, arglist); 
    va_end(arglist); 

    vprintf_s(buf);   // prints to the standard output stream 
    OutputDebugString(buf); // prints to the output window 
} 

Đoạn mã trên là chủ yếu chưa được kiểm tra, nhưng nó sẽ giúp các khái niệm trên.

Nếu bạn không làm điều này trong C/C++, thì phương pháp này sẽ không hoạt động cho bạn. :-)

+0

C# xin lỗi, nhưng nếu không thì ý tưởng hay. – BCS

+0

đoạn 2 dường như bao gồm – BCS

+0

http: // stackoverflow này.com/questions/587767/how-to-output-to-console-in-c-windows dường như mô tả cách làm cho nó hoạt động, mặc dù sử dụng OutputDebugString cũng hoạt động tốt. – rogerdpack

0

System.Diagnostics.Debug.Writeline() hoặc Trace.Writeline()

+1

Tôi đang tìm những thứ có thể hoạt động mà không sửa đổi mã đang thực hiện đầu ra. – BCS

0

Bạn có thể sử dụng lớp Systems.Diagnostics.Trace viết đầu ra của bạn vào cửa sổ Output thay vì (hoặc bổ sung cho) giao diện điều khiển . Nó có một cấu hình nhỏ, nhưng nó hoạt động. Có phải là dọc theo dòng của những gì bạn muốn?

Bạn cũng có thể thêm tab của riêng mình trên mỗi this article, nhưng tôi chưa bao giờ thử nó.

+0

Liên kết đó cũng không phải là liên kết. Crumbs. – BCS

3

Bạn sẽ có thể nắm bắt đầu ra trong tệp văn bản và sử dụng tệp đó.

Tôi không có một VS tiện dụng, vì vậy đây là từ bộ nhớ:

  1. Tạo C++ Dự án
  2. mở các thiết lập dự án, tab debug
  3. Enable quản lý gỡ lỗi
  4. Chỉnh sửa lệnh để thêm "> output.txt"
  5. Chạy chương trình của bạn trong trình gỡ lỗi

Nếu mọi thứ hoạt động theo cách tôi nhớ, điều này sẽ chuyển hướng STDOUT đến một tệp, ngay cả khi bạn không thực sự chạy dưới CMD.EXE.

(The debugger có thực hiện riêng của mình cú pháp chuyển hướng, mà không phải là 100% giống như cmd, nhưng nó khá tốt.)

Bây giờ, nếu bạn mở tập tin này trong VS, bạn vẫn có thể thấy đầu ra từ bên trong VS, mặc dù không chính xác trong cùng một cửa sổ mà bạn đang hy vọng.

1

Có thể thao tác này sẽ phù hợp với bạn: đặt điểm ngắt khi đóng } trong Main và sau đó xem cửa sổ bảng điều khiển trước khi đóng. Bạn thậm chí có thể sao chép văn bản ra khỏi nó nếu bạn cần.

Trên mỗi máy mà tôi sử dụng để phát triển, tôi cấu hình cửa sổ giao diện điều khiển của tôi trong một cách nào đó, mà sẽ xảy ra để làm cho cách tiếp cận công việc này tốt hơn:

  1. Chạy cmd.exe
  2. ALT-SPACE, D
  3. Trong Tùy chọn, bật chế độ QuickEdit.
  4. Trong Bố cục, đặt Chiều cao bộ đệm thành 9999
  5. Nhấp vào OK
  6. Thoát khỏi cửa sổ CMD.
+0

+1 cho cấu hình cửa sổ bảng điều khiển. Tôi sẽ thêm cài đặt Chiều cao của Kích thước cửa sổ là 50. – AMissico

3

Bảng điều khiển có thể chuyển hướng đầu ra của nó tới bất kỳ nhà soạn văn bản nào. Nếu bạn thực hiện một trình soạn thảo để ghi vào Diagnostics.Debug, bạn đã sẵn sàng.

Đây là một trình soạn thảo viết cho trình gỡ rối.

using System.Diagnostics; 
using System.IO; 
using System.Text; 

namespace TestConsole 
{ 
    public class DebugTextWriter : TextWriter 
    { 
     public override Encoding Encoding 
     { 
      get { return Encoding.UTF8; } 
     } 

     //Required 
     public override void Write(char value) 
     { 
      Debug.Write(value); 
     } 

     //Added for efficiency 
     public override void Write(string value) 
     { 
      Debug.Write(value); 
     } 

     //Added for efficiency 
     public override void WriteLine(string value) 
     { 
      Debug.WriteLine(value); 
     } 
    } 
} 

Vì nó sử dụng Diagnostics.Debug, nó sẽ tuân thủ cài đặt trình biên dịch của bạn để kết nối nó phải ghi đầu ra hay không. Đầu ra này cũng có thể được nhìn thấy trong Sysinternals DebugView.

Đây là cách bạn sử dụng nó:

using System; 

namespace TestConsole 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.SetOut(new DebugTextWriter()); 
      Console.WriteLine("This text goes to the Visual Studio output window."); 
     } 
    } 
} 

Nếu bạn muốn nhìn thấy đầu ra trong Sysinternals DebugView khi bạn đang soạn thảo trong chế độ phát hành, bạn có thể sử dụng một TextWriter mà ghi vào API OutputDebugString. Nó có thể trông giống như thế này:

using System.IO; 
using System.Runtime.InteropServices; 
using System.Text; 

namespace TestConsole 
{ 
    public class OutputDebugStringTextWriter : TextWriter 
    { 
     [DllImport("kernel32.dll")] 
     static extern void OutputDebugString(string lpOutputString); 

     public override Encoding Encoding 
     { 
      get { return Encoding.UTF8; } 
     } 

     //Required 
     public override void Write(char value) 
     { 
      OutputDebugString(value.ToString()); 
     } 

     //Added for efficiency 
     public override void Write(string value) 
     { 
      OutputDebugString(value); 
     } 

     //Added for efficiency 
     public override void WriteLine(string value) 
     { 
      OutputDebugString(value); 
     } 
    } 
} 
+0

Rất đẹp. Tôi có thể chấp nhận hai câu trả lời. – BCS

Các vấn đề liên quan