2009-02-03 97 views

回答

18

不要担心,它是。

当应用程序调用OutputDebugString()时,需要执行以下这些步骤: 。请注意,任何一点失败都会放弃整个事件,并且 将调试请求视为无操作(该字符串不会在任何地方发送到 )。

  1. 打开DBWinMutex并等到我们拥有对它的独占访问权限。
  2. 将DBWIN_BUFFER段映射到内存中:如果没有找到, 没有运行调试器,因此整个请求都被忽略。
  3. 打开DBWIN_BUFFER_READY和DBWIN_DATA_READY事件。与 共享内存段一样,缺少对象意味着没有可用的调试器 。
  4. 等待DBWIN_BUFFER_READY事件发出信号:这说 内存缓冲区不再使用。大多数时候,这个 事件将在检查时立即发出信号,但不会等待 等待超过10秒,缓冲区变为就绪(超时 放弃请求)。
  5. 将大约4k字节的数据拷贝到内存缓冲区,并在那里存储 当前的进程ID。始终在字符串的末尾 处放置一个NUL字节。
  6. 通过设置 DBWIN_DATA_READY事件告诉调试器缓冲区已准备就绪。调试器从那里取得它。
  7. 释放互斥锁
  8. 关闭事件和部分对象,尽管我们继续处理 后面的互斥锁。
+0

谢谢你,只是我想听听:) – 2009-02-03 23:47:07

26

哦,不是,这是不正确的,它是,但只是让你不必只取利芬的话:数据

传递 之间应用程序和调试器通过一个4kbyte的共享内存块, 与一个Mutex和两个事件对象 保护对它的访问,完成 。这四个内核对象都是 。

Understanding Win32 OutputDebugString是关于此事的优秀文章。

+0

我知道这是线程安全的,因为我曾经自己去查看它。但我不知道背后的整个故事。感谢您澄清它。 – 2009-02-04 00:05:37

2

我曾经遇到过一次麻烦,但是,在ISAPI DLL中的字符串。由于某些奇怪的原因,System.pas中定义的IsMultiThread布尔值未设置!

一旦线程运行多个线程,它就会造成奇怪的AccessViolations ...一个简单的“IsMultiThread:= true;”在单元初始化中修复它。

+0

@Stijn,这是什么版本的德尔福?当我在Delphi 2007应用程序中断时,IDE将此变量显示为“true”。 – rossmcm 2015-07-16 22:38:03