2010-12-12 53 views

Trả lời

26

Trong Windows, cách đơn giản nhất để xuất thông tin gỡ lỗi là sử dụng OutputDebugString() và sau đó sử dụng ứng dụng có thể nhận đầu ra đó. Trình xem sự kiện trong bản thân IDE Delphi có thể nhận được đầu vào đó, hoặc bạn có thể sử dụng ứng dụng DebugView từ SysInternals để lấy đầu ra trên một hệ thống chưa cài đặt IDE. AFAIK, GExperts cũng có một công cụ tương tự. Đó là bởi vì một ứng dụng GUI không theo mặc định một bàn điều khiển để viết đầu ra, nếu không bạn phải tạo một ứng dụng (xem câu trả lời của Gerry).

Một trong những ưu điểm của ứng dụng này là ứng dụng sẽ hoạt động mà không gặp vấn đề gì ngay cả khi cuộc gọi bị trượt vào bản phát hành (hoặc nếu có ý định), nhưng hãy cẩn thận để không xuất thông tin nhạy cảm đọc bằng một trong các công cụ ở trên.

Bạn cũng có thể tạo một biểu mẫu đặc biệt (có nghĩa là, với điều khiển ghi nhớ) và đầu ra tuyến đường tại đó.

Ngoài ra còn có các tiện ích ghi nhật ký nâng cao như SmartInspect, CodeSite và các thiết bị khác.

+7

FWIW, tôi muốn đề cập rằng điều này không trả lời câu hỏi, đó là * "Làm thế nào tôi có thể ghi vào cửa sổ * ** console để gỡ lỗi?" * –

+1

Có thể bởi vì trong Windows ghi vào bàn điều khiển không phải là tốt nhất cách để gỡ lỗi? Windows không phải là Linux hoặc Java. –

+0

OutputDebugString() chắc chắn là "đơn giản nhất". Tuy nhiên, khi bạn cần "mạnh mẽ", bạn nên sử dụng DIY với cửa sổ bảng điều khiển. Thực hiện tìm kiếm Google cho "Chúng tôi đã thấy các vấn đề trong nhiều năm với OutputDebugString() không đáng tin cậy vào những thời điểm" vì lý do "đơn giản nhất" và "mạnh mẽ" không giống nhau. Nếu nó không hoàn toàn phải làm việc mỗi lần, OutputDebugString() là tốt. –

24

Cách đơn giản nhất là biên dịch dưới dạng ứng dụng bảng điều khiển, nhưng đặt mã khung ứng dụng bình thường trở lại trong dpr.

program Project2; 

{$APPTYPE CONSOLE} 

uses 
    Forms, 
    SysUtils, 
    Unit1 in 'Unit1.pas' {Form1}; 

begin 
    Application.Initialize; 
    Application.CreateForm(TForm1, Form1); 
    writeln('Hello, World!'); 
    Application.Run; 
end. 

Một phức tạp hơn một chút cách là sử dụng cuộc gọi Windows API AllocConsole:

program Project2; 

uses 
    Forms, 
    SysUtils, 
    Windows, 
    Unit1 in 'Unit1.pas' {Form1}; 

begin 
    Application.Initialize; 
    Application.CreateForm(TForm1, Form1); 
    AllocConsole; 
    writeln('Hello, World!'); 
    Application.Run; 
end. 

Phương pháp này có (thường là) bất lợi của việc tạo ra một giao diện điều khiển mới nếu bạn đang gọi từ dòng lệnh. Từ bộ nhớ nhận được chuyển hướng đến công việc đòi hỏi một số mã hơn là tốt. Lợi ích là bạn có thể quyết định phân bổ bảng điều khiển tại thời gian chạy, thay vì biên dịch thời gian.

+0

Tôi nghĩ những hành vi này khác đi nếu bạn gọi chương trình từ bảng điều khiển. Việc đầu tiên gắn vào cửa sổ giao diện điều khiển hiện có, thứ hai tạo ra một cái mới. – CodesInChaos

+8

+1. Tôi thích cách tiếp cận thứ hai. –

+0

Gắn vào bảng điều khiển đầu tiên thường là hấp dẫn hơn –

1

Nếu bạn đã viết ứng dụng bảng điều khiển, bạn có thể thử chức năng OutputDebugString trong ứng dụng bảng điều khiển (Tôi không thử).

Hoặc bạn có thể chụp đầu ra của ứng dụng bảng điều khiển như trong Capture the output from a DOS (command/console) Window.

Ngoài ra, bạn có thể kiểm tra Console Application Runner Classes. Tôi sử dụng các lớp này. Tôi nghĩ rằng họ là tuyệt vời.

8

Delphi có tùy chọn này, hãy kiểm tra "Generate console application" trong tùy chọn trình liên kết cho dự án. I/O tiêu chuẩn sẽ được chuyển đến cửa sổ bảng điều khiển sẽ đi kèm với ứng dụng GUI của bạn. Sau đó, bạn có thể sử dụng Writeln v.v. như bình thường.

đọc Output (hoặc Input) từ các tài liệu:

chương trình Delphi có một tiêu chuẩn tập tin đầu ra nếu họ có liên quan như giao diện điều khiển ứng dụng.

+0

+1. Tôi nghĩ đây là giải pháp *. –

+0

Cài đặt "tạo ứng dụng bảng điều khiển" sẽ đánh dấu PE thực thi dưới dạng ứng dụng bảng điều khiển. Xem ở đây để biết một số vấn đề khi trộn các loại thực thi: http://blogs.msdn.com/b/junfeng/archive/2004/02/06/68531.aspx –

+0

@ldsandon - Tôi đọc mục nhập blog và không thể tìm thấy vấn đề bạn đề cập đến. Bạn có thể làm cho một báo ở đây? .. FWIW tùy chọn là có kể từ * Delphi 2 * và tôi đã không bao giờ đi qua một báo cáo QC hoặc khiếu nại hoặc vấn đề liên quan đến các tùy chọn. Mục đích duy nhất của tùy chọn là cung cấp I/O tiêu chuẩn cho một ứng dụng GUI. Đọc thêm: [Tiêu chuẩn và I/O] (http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/devcommon/standardroutinesov_xml.html) –

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