2009-02-03 98 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