OutputDebugString(PAnsiChar(''));

线程安全?

我/我们一直在线程中使用它进行调试,并且我从未想过是否应该以不同的方式进行操作。

(德尔福7)

有帮助吗?

解决方案

别担心,确实如此。

当应用程序调用 OutputDebugString() 时,它会获取以下信息 步骤。请注意,任何一点的失败都会导致整个过程的失败,并且 将调试请求视为无操作(不发送字符串 随处可见)。

  1. 打开 DBWinMutex 并等待,直到我们拥有对它的独占访问权限。
  2. 将 DBWIN_BUFFER 段映射到内存中:如果找不到它,则没有运行调试器,因此忽略了整个请求。
  3. 打开 DBWIN_BUFFER_READY 和 DBWIN_DATA_READY 事件。与 在共享内存段中,丢失对象意味着没有调试器 可用。
  4. 等待 DBWIN_BUFFER_READY 事件发出信号:这就是说 内存缓冲区已不再使用。大多数情况下 事件被检查时会立即发出信号,但不会 等待缓冲区准备就绪的时间超过 10 秒(超时)。 放弃请求)。
  5. 将最多约 4kbytes 的数据复制到内存缓冲区,并存储 当前流程 ID 也在这里。总是在最后输入一个 NUL 字节 的字符串。
  6. 告诉调试器,通过设置DBWIN_DATA_READY事件可以准备好缓冲区。调试器从那里获取它。
  7. 释放互斥体
  8. 关闭事件和部分对象,尽管我们将静音的句柄保留在稍后。

其他提示

好了,不说这是不正确的,它是,但只是让你不必只取利芬的话:

  的

之间的数据传   应用程序和调试完成   通过共享存储器的一个4K字节块,   用互斥锁和两个事件对象   保护访问它。这些是   4名内核对象参与。

理解的Win32的OutputDebugString 是对此事优异的制品。

我有麻烦一次,不过,在一个ISAPI DLL的字符串。一些奇怪的原因在System.pas定义的IsMultiThread布尔未设置!

它是造成怪异AccessViolations,一旦线程正在运行一个多线程...一个简单的“IsMultiThread:= TRUE;”在一个单元初始化固定它。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top