如何写入控制台窗口进行调试?

Posted

技术标签:

【中文标题】如何写入控制台窗口进行调试?【英文标题】:How can I write to the console window for debugging? 【发布时间】:2011-05-24 04:35:22 【问题描述】:

我可以在VCL 应用程序的控制台窗口中显示循环结果以进行调试吗?

【问题讨论】:

【参考方案1】:

最简单的方法是编译为控制台应用程序,但将正常的应用程序框架代码放回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.

稍微复杂一点的方法是使用 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.

如果您从命令行调用,此方法(通常)具有创建新控制台的缺点。从内存重定向到工作也需要更多代码。 优点是您可以决定在运行时而不是编译时分配控制台。

【讨论】:

我认为如果您从控制台调用程序,这些行为会有所不同。第一个附加到现有的控制台窗口,第二个创建一个新的。 附加到第一个控制台通常更可取 @CodeInChaos,@David - 是的,我忘了提。如果您想重定向输入或输出,这也是一种痛苦。它最大的优点是可以在项目中选择性地完成,这对于调试很有用。【参考方案2】:

在 Windows 中,输出调试信息的最简单方法是使用OutputDebugString(),然后使用能够接收该输出的应用程序。 Delphi IDE 本身中的事件查看器能够接收该输入,或者您可以使用来自SysInternals 的DebugView 应用程序在没有安装IDE 的系统上获取输出。 AFAIK,GExperts 也有类似的工具。这是因为 GUI 应用程序默认情况下没有用于写入输出的控制台,否则您必须创建一个控制台(请参阅 Gerry 的回答)。

OutputDebugString() 的优点之一是即使调用滑入发布版本(或者如果故意留在那里),应用程序也可以正常运行,但请注意不要输出敏感信息,因为它们可以使用上述工具之一阅读。

您还可以创建一个临时表单(即带有备忘录控件)并在那里路由输出。

还有先进的日志记录工具,如SmartInspect、CodeSite 等。

【讨论】:

FWIW,我想提一下,这并不能回答问题,即 “我如何写信给 控制台窗口 for调试?” 也许是因为在 Windows 中写入控制台不是最好的调试方式? Windows 不是 Linux 或 Java。 OutputDebugString() 绝对是“最简单的”。但是,当您需要“健壮”时,最好使用控制台窗口进行 DIY。谷歌搜索“多年来我们已经看到 OutputDebugString() 有时不可靠的问题”,为什么“最简单”和“稳健”不一样。如果它不是每次都必须工作,OutputDebugString() 很好。【参考方案3】:

Delphi 有一个选项,在项目的链接器选项中检查"Generate console application"。标准 I/O 将被定向到伴随您的 GUI 应用程序的控制台窗口。然后你可以像往常一样使用Writeln等。

从文档中阅读Output(或Input):

Delphi 程序有标准输出 文件,如果它们被链接为控制台 应用程序。

【讨论】:

设置“生成控制台应用程序”会将PE可执行文件标记为控制台应用程序。有关混合可执行类型时的一些问题,请参见此处:blogs.msdn.com/b/junfeng/archive/2004/02/06/68531.aspx @ldsandon - 我阅读了博客条目,但找不到您提到的问题。你能在这里报价吗?.. FWIW 自 Delphi 2 以来就有该选项,我从未遇到过有关该选项的 QC 报告或投诉或问题。该选项的唯一目的是为 GUI 应用程序提供标准 I/O。延伸阅读:Standard Routines and I/O 该选项的唯一目的是将可执行文件标记为 PE 标头中的控制台应用程序。例如,请参阅“这是 ildasm 的作者所说的”,了解当您这样做时会发生什么。 @ldsandon - 这就是选项的作用,我认为它是出于原因...我已经阅读了您之前提到的评论。 AFAICS,Delphi 的链接器选项没有 显示他提到的故障:“从...启动时不释放控制台窗口” 应该吗? “无法将控制台转储重定向到文件...” Delphi 没有问题,分配 文件和输出重定向就好了。 “瞬间闪烁控制台窗口...” 不,不是在 Delphi 中... 更好地阅读那里所写的内容:并非所有这些影响都归因于控制台应用程序类型。当您从 GUI 应用程序分配控制台时会发生一些情况,如果您使用控制台应用程序来显示 GUI,则会发生其他情况。除非 Delphi 使用伪造的控制台应用程序(我认为它没有),否则发生的事情不在 VCL 的控制之下,而是在 Windows 本身的控制之下。如果代码是 C、C++ 或 Delphi 无关紧要。【参考方案4】:

如果你写了控制台应用,可以试试控制台应用中的OutputDebugString函数(我没试过)。

或者您可以捕获控制台应用程序的输出,例如 Capture the output from a DOS (command/console) Window

另外,您可以查看Console Application Runner Classes。我使用这些类。我觉得他们很棒。

【讨论】:

以上是关于如何写入控制台窗口进行调试?的主要内容,如果未能解决你的问题,请参考以下文章

如何使 Xcode 4.4 调试控制台使用弹出窗口进行自动完成?

好长时间没用VS ,发现新建的c#控制台项目按F5进行调试没有窗口显示,

vs调试控制台显示内容设置

如何通过 Blazor WebAssembly 写入浏览器控制台?

如何禁用 websocket 写入调试消息

我在哪里可以找到包管理器窗口中执行的代码的控制台或调试输出?