是
OutputDebugString(PAnsiChar(''));
线程安全?
我/我们一直在线程中使用它进行调试,如果我以不同的方式做这件事,我就不会想到它。
(德尔福7)
答案 0 :(得分:26)
嗯,不是说它不是真的,它是,但只是为了让你不必为了它而采取Lieven的话:
在。之间传递数据 应用程序和调试器完成 通过一个4kbyte的共享内存块, 使用Mutex和两个Event对象 保护对它的访问。这些是 涉及四个内核对象。
Understanding Win32 OutputDebugString是一篇关于此事的优秀文章。
答案 1 :(得分:18)
别担心,是的。
当应用程序调用OutputDebugString()时,它会采用这些 脚步。请注意,任何时候的失败都会放弃整个事情 将调试请求视为无操作(不发送字符串 任意位置)。
- 打开DBWinMutex并等到我们可以独占访问它。
- 将DBWIN_BUFFER段映射到内存中:如果找不到, 没有运行调试器,因此忽略整个请求。
- 打开DBWIN_BUFFER_READY和DBWIN_DATA_READY事件。和。一样 共享内存段,缺少对象意味着没有调试器 可用。
- 等待DBWIN_BUFFER_READY事件发出信号:这就是说 内存缓冲区不再使用。大多数时候,这个 事件将在检查时立即发出信号,但事实并非如此 等待超过10秒以使缓冲区准备就绪(超时) 放弃要求)。
- 将大约4千字节的数据复制到内存缓冲区并存储 那里还有当前的进程ID。总是在最后放一个NUL字节 字符串。
- 通过设置,告诉调试器缓冲区已准备就绪 DBWIN_DATA_READY事件。调试器从那里获取它。
- 释放互斥锁
- 关闭Event和Section对象,但我们保留句柄 以后的互斥体。
醇>
答案 2 :(得分:3)
我曾经遇到过ISAPI DLL中的字符串问题。由于某些奇怪的原因,未在System.pas中定义的IsMultiThread布尔值!
一旦线程运行多个线程,它就会导致奇怪的AccessViolations ...一个简单的“IsMultiThread:= true;”在单元初始化中修复它。