【问题标题】:How to view output of OutputDebugString?如何查看 OutputDebugString 的输出?
【发布时间】:2012-06-27 02:04:56
【问题描述】:

我想在我的应用程序中使用OutputDebugString(),然后可以选择在现场部署应用程序时在单独的查看器中显示它。

也就是说,我不想改变一个标志并重建我的 .exe 来打开和关闭调试。

谷歌搜索,似乎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.

我已经阅读了文档,但无济于事,并且看到其他人也遇到过类似的问题,但没有发布解决方案。

有解决办法吗?

【问题讨论】:

标签: delphi debugview outputdebugstring


【解决方案1】:

DebugView 工具工作正常;只需确保直接启动您的应用程序(不附加 Delphi IDE 或其他调试器)。

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

【讨论】:

  • +1 你能确认 XE2 入门版没有事件日志查看器吗? embarcadero.com/products/delphi/delphi-feature-matrix 似乎表明了这一点。那么,大概是我无法从 IDE 中查看我的输出,但只有在我独立运行时才能查看?
  • 我不敢相信Event Log Windows 不是 Delphi Starter 版本的一部分 :(
  • 但是在特征矩阵中看起来是这样的,对吧?而且我在菜单上找不到它...
  • 是的,这似乎是 Delphi Starter 的限制。
  • 嗯,我确实理解 Embarcadero 必须为初学者削减功能(否则没有人会购买其他任何东西)。但是,如果 IDE 不能处理它,他们难道不能让外部程序(例如 DebugView)在我在 IDE 中浏览我的应用程序时处理 OutputDebugString() 吗?
【解决方案2】:

GExperts 有一个调试查看器和一个您添加到应用程序的单元,即使在 XE2 Starter 中也可以为您执行此操作。请参阅DebugIntf 单元和它包含的GExpertsDebugWindow.exe 应用程序。这些在 XE2 Starter(以及几乎所有其他版本的 Delphi)下工作。

GExperts 还包括大量其他很棒的 IDE 和编辑器增强功能,当然它们一直存在,因此它们是非常可靠的工具。

【讨论】:

  • 它不能在从未安装过 Delphi 的 PC 上运行(找不到 RTL60.BPL)。我已经发布到 GExperts 邮件列表,但到目前为止还没有回复。
  • 它是用运行时包构建的。如果您提供的 BPL 中的版本号不是拼写错误(我认为应该是 160,而不是 60),那么您安装了一个非常早期的版本(60 大约是 Delphi 6,IIRC)。如果是 160,您可以在 Windows\System32 文件夹中找到它,并将其放在与您放置调试查看器可执行文件相同的文件夹中。它是 Delphi 的可分发运行时库之一,因此您可以将其与应用程序一起发布。您还需要 VCL160 和 VCLX160。
  • 哎呀,确实是160,不是60。我已经复制了那个BPL,但不知道要复制另外两个。这很好用。一如既往地感谢您的出色帮助。
  • 小心,已知 GExpers 会使 IDE 崩溃:quality.embarcadero.com/browse/RSP-34374
【解决方案3】:

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

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

CnPack 包含一个单元,CnDebug.pas。使用该单元,您可以跟踪类型化对象、集合、异常、memdump 等。通过 CnDebug.pas,您还可以设置是否自动启动 CnDebugViewer、是否在发送调试消息时转储到文件等。

【讨论】:

  • @shenloqi,嗯...有人验证源代码是干净吗?我通常不相信来自中国的此类工具。
【解决方案4】:

使用 OutputDebugString 的一个问题是其他程序也可能在使用它,从而使您的日志混乱:Debugging OutputDebugString calls in Delphi

您可以使用我们在日常使用中非常满意的 CodeSite Express:http://www.raize.com/devtools/codesite/Default.asp

【讨论】:

  • 只有当您使用的工具有意从其他程序收集消息,然后无法过滤它们时,这才是问题所在。普通的旧调试器不会有这个问题,因为OutputDebugString 通常只向调试它的单个程序发送消息。 SysInternals 工具使用不同的非标准技术来收集消息,而不会成为所有进程的调试器。但它也允许过滤。所以真的一点问题都没有。
  • 代码站点似乎不是免费的 :-(
  • CS Express 包含在 XE2 和 XE3 中。多年来我一直在使用完整版;出色的工具,比乍一看更有用。
【解决方案5】:

在我的 XE5 版本中,我必须启用“输出消息”选项:

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

我不记得禁用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-03
    • 2022-08-12
    • 2012-11-09
    • 1970-01-01
    • 2017-09-24
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多