如何查看OutputDebugString的输出?

13

我想在我的应用程序中使用OutputDebugString()函数,并且希望在应用程序部署到现场时有选项将其显示在单独的查看器中。

也就是说,我不想改变标志并重新构建我的.exe文件来打开或关闭调试。

通过Google搜索,似乎DebugView应该可以处理这个问题,但是它和TraceTool都没有显示出这段代码的任何输出。

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.FormCreate(Sender: TObject);
begin
   OutputDebugString(PChar('Hello, wurld'));
end;

end.

我已经阅读了文档,但没有结果,并且发现其他人也遇到了类似的问题,但是没有发布解决方案。

有解决方案吗?


3
GExperts 包含调试窗口和一个单元,您可以将其添加到您的应用程序中,即使在 XE2 starter 版本中也可以使用。请参见 DebugIntf 单元和其中包含的 GExpertsDebugWindow.exe 应用程序。这些在 XE2 Starter (以及几乎所有其他版本的 Delphi)下工作。 - Ken White
+1 我会查看 http://www.gexperts.org/tour/index.html?debug_window.html - Mawg says reinstate Monica
4
这就是我写这个DbWinUnit的原因:http://bo.codeplex.com/SourceControl/changeset/view/78543#1494219 它允许你既可以使用OutputDebugString(被当前运行的调试器捕获),也可以使用DBWIN协议,以便DebugView也可以捕获输出。 - Jeroen Wiert Pluimers
3
你尝试过这个吗 - http://www.codeproject.com/Articles/23776/Mechanism-of-OutputDebugString - RBA
1
https://www.peganza.com/delphi-and-outputdebugstring.html - Gabriel
显示剩余3条评论
5个回答

29

DebugView工具很好用,只要确保直接启动您的应用程序(不附加Delphi IDE或其他调试器)。

无论如何,查看Delphi应用程序的OutputDebugString输出的自然方法是使用Delphi IDE和事件日志窗口。

输入图片描述

输入图片描述


4
我简直不敢相信“事件日志”Windows不是Delphi入门版的一部分 :( - RRUZ
1
但是在特征矩阵中看起来是这样的,对吧?而且我找不到它在菜单上... - Mawg says reinstate Monica
1
是的,看起来这是 Delphi Starter 的限制。 - RRUZ
3
我理解Embarcadero不得不削减入门版的功能(否则没有人会购买其他版本)。但是如果集成开发环境无法处理它,他们是否可以使其他程序(如DebugView)在我在IDE中调试应用程序时处理OutputDebugString()? - Mawg says reinstate Monica
1
内置的事件查看器的一个小缺点是,它无法正确显示具有内置换行符的消息——它将其折叠成带有“有趣字符”的单行。Delphi 7 IDE(是的,我知道现在是2014年,但仍然使用它)。 - kostix
显示剩余6条评论

9

GExperts有一个调试查看器和一个单元,可以将其添加到您的应用程序中,即使在XE2 Starter中也可以这样做。请参阅包括它的DebugIntf单元和GExpertsDebugWindow.exe应用程序。这些适用于XE2 Starter(以及几乎所有其他版本的Delphi)。

GExperts还包括许多其他很棒的IDE和编辑器增强功能,并且它们已经存在很长时间,因此它们是相当可靠的工具。


它无法在从未安装Delphi的PC上运行(找不到RTL60.BPL)。我已经在GExperts邮件列表中发布了,但目前还没有收到回复。 - Mawg says reinstate Monica
它是使用运行时包构建的。如果您提供的BPL中的版本号不是打字错误(我认为应该是160,而不是60),则安装了非常早期的版本(60左右是Delphi 6,如果我没记错的话)。如果是160,则可以在Windows\System32文件夹中找到它,并将其放在与调试查看器可执行文件相同的文件夹中。它是Delphi的可分发运行时库之一,因此您可以将其与应用程序一起发布。您还需要VCL160和VCLX160。 - Ken White
1
哎呀,真的是160,不是60。我已经复制了那个BPL,但不知道要复制另外两个。这样很好用。像往常一样,非常感谢您的帮助。 - Mawg says reinstate Monica
小心,GExpers已知会导致IDE崩溃:https://quality.embarcadero.com/browse/RSP-34374 - Gabriel

5

CnWizards包含一个工具CnDebugViewer.exe,可以捕捉OutputDebugString(在Windows 7中应该以管理员身份运行)。

与DbgView不同的是,CnDebugViewer可以为不同的应用程序创建单独的选项卡。

CnPack包含一个单元CnDebug.pas。使用这个单元,您可以跟踪输入的对象、集合、异常、内存转储等。使用CnDebug.pas,您还可以设置是否自动启动CnDebugViewer,是否在发送调试消息时将其转储到文件中,等等。


1
@shenloqi,嗯...有人验证过源代码是干净的吗?我通常不信任来自中国的这种工具。 - Pacerier

4

1
只有当你使用一个故意收集其他程序消息并且没有提供过滤这些消息的方式的工具时,这才是一个问题。普通的调试器不会有这个问题,因为OutputDebugString通常只向单个正在调试的程序发送消息。SysInternals 工具使用一种不同的、非标准的技术来收集消息,而不会成为所有进程的调试器。但它也允许过滤。所以根本没有问题。 - Rob Kennedy
1
代码网站似乎不是免费的 :-( - Mawg says reinstate Monica
CS Express 包含在 XE2 和 XE3 中。我已经使用完整版本多年了; 这是一个杰出的工具,比一开始看起来要有用得多。 - casterle

2
在我的XE5版本中,我需要在以下位置启用“输出消息”选项:

工具 > 选项 > 调试器选项 > 事件日志

我不记得曾经将其禁用过。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接