【问题标题】:Bypass OutputDebugString in Delphi 7?在 Delphi 7 中绕过 OutputDebugString?
【发布时间】:2010-06-25 06:42:37
【问题描述】:

我想知道是否可以绕过 OutputDebugString?我希望 OutputDebugString 输出显示在 DebugView 中,而不是在内部 Delphi 事件查看器窗口中。但我找不到告诉 Delphi 不要吞下 OutputDebugString 的方法。有什么想法吗?

问候

【问题讨论】:

  • 它应该出现在Delphi窗口的DebugView中。你能确认一下吗?
  • 我也有 Delphi 7,它没有显示在 DebugView 中,只显示在 Delphi 事件日志中。
  • 只有在调试会话中运行时才会显示在 Delphi 事件日志中。如果应用程序在没有附加调试器的情况下启动,则 DebugView 捕获 OutputDebugString。
  • AFAIK 一次只有一个调试器可以接收 OutputDebugString 输出

标签: delphi debugging delphi-7 outputdebugstring


【解决方案1】:

这是不可能的。

OutputDebugString 将字符串发送到调试器(顾名思义)。每个进程只能有 1 个活动调试器。您在 Delphi 下运行您的应用程序 - Delphi 收到消息,因为它是一个调试器。您在 Delphi 之外运行您的应用程序 - DebugView 可以访问它们,因为没有调试器声称它。

但是:为什么您需要这个?只需在 Delphi 事件日志中禁用其他类型的事件 - 您将获得与 DebugView 相同的功能。

【讨论】:

  • 我知道输出被发送到调试器。我的问题是如何绕过它。但看起来没有办法绕过它。如果我禁用其他类型,我不会获得相同的功能。我仍然收到数百条调试消息。在 DebugView 我可以过滤输出,因此我现在只会看到我感兴趣的内容。这有很大的不同。
  • @pantharhei:看这里d-fens.net/…,在我看来这应该是可能的。重定向的源代码可向作者索取。
  • @Lieven:看起来很有趣。如果时间压力没有了,会仔细看看。它会消失吗? ;)
  • 我认为您对这个简单的调试例程的要求太高了。尝试寻找其他日志记录解决方案,例如 ETW (msdn.microsoft.com/en-us/library/bb968803(VS.85).aspx) 或 SmartInspect (gurock.com/smartinspect) 或其他任何东西。
  • @Lieven 您的链接谈论不同的事情。它讨论了作为调试器从 OutputDebugString 读取输出并将其传输到 actual 调试器所在的其他会话的工具。有 2 个调试器,每个都连接到 单独的 源。有 2 个源和 2 个调试器。这与所讨论的情况不同,其中 pantarhei 想要 2 个调试器(Delphi 和 DebugView)连接到 single 源。你不能这样做,因为从源代码读取涉及使用 auto-reset 事件。一旦调试器使用它们 - 由于显而易见的原因,没有其他应用程序也可以使用它们。
【解决方案2】:

我认为没有办法解决这个问题。 Delphi 2009 中的情况仍然相同。您应该提交功能请求:http://qc.embarcadero.com

我想知道 Delphi 的内部事件日志窗口应该有什么优势?

【讨论】:

  • 优点是可以在DebugView中过滤调试字符串。让生活更轻松。
  • 您真的需要的不仅仅是 Delphi 中的开/关过滤器吗? ;-)
  • 提交 D7 的功能请求?你在跟我开玩笑吗?如果目前在 D09 中不可能,我很确定他们不会在 D7 中添加它。
  • 不用说,我的意思是对未来版本的功能请求。它现在对你没有帮助,但它是一个有用的请求。
  • 我很确定早在 1998 年有人说过:“提交 D2 的功能请求?你在开玩笑吗?我很确定他们不会在 D2 中添加它,如果目前在 D4 中是不可能的”:D 这就是为什么我们在 D7 和 D2010 中仍然没有这个功能,而且我们永远不会拥有它,因为没有人关心报告它。
【解决方案3】:

您可以尝试使用Process Monitor 及其新的“调试输出”功能来代替DebugView。它不使用 OutputDebugString,它使用自己的 API,还有一个 Delphi 包装器 here。您可以使用 Process Monitor 过滤功能,Delphi 不会捕获该消息 - 但它不是 OutputDebugString 的通用功能。

【讨论】:

  • 可以用于我自己的本地测试。但我认为我不会将其纳入代码库。但我会看看它。谢谢。
【解决方案4】:

在事件日志属性中禁用“输出消息”不起作用?

【讨论】:

  • 结果是消息没有显示在内部事件日志中。但它们仍然被调试器吞噬。
  • 恐怕一旦调试器附加到进程 Windows 会将输出发送到该调试器。
【解决方案5】:

我知道,不是最初的问题,但值得一看来自 Raize Software 的 CodeSite。它将 OutputDebugString 提升到一个全新的水平。消息(可以)被定向到 CodeSite 查看器,该查看器大致相当于一个高度增强的 DebugView。恕我直言,每一分钱都值得。

【讨论】:

  • 当然。但订购或介绍这些工具不是我的责任。我也看过 SmartInspect。肯定会很高兴。但目前不是。
  • 相反,Pantarhei,向同龄人介绍有用的工具是每个人的责任。
  • 好的。用错了词。所以我已经介绍了这些工具。但我无法决定是否将它们购买并集成到现有工具中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多