2009-02-03 31 views

Trả lời

18

Đừng lo lắng, đúng vậy.

Khi đầu raDebugString() được gọi bởi một ứng dụng, phải mất các bước này. Lưu ý rằng một sự thất bại tại bất kỳ điểm nào từ bỏ toàn bộ điều và xử lý yêu cầu gỡ lỗi dưới dạng no-op (chuỗi không được gửi ở bất kỳ đâu).

  1. Mở DBWinMutex và đợi cho đến khi chúng tôi có quyền truy cập độc quyền vào nó.
  2. Ánh xạ phân đoạn DBWIN_BUFFER vào bộ nhớ: nếu không tìm thấy, không có trình gỡ lỗi nào chạy để toàn bộ yêu cầu bị bỏ qua.
  3. Mở các sự kiện DBWIN_BUFFER_READY và ​​DBWIN_DATA_READY. Như với phân đoạn bộ nhớ dùng chung, các đối tượng bị thiếu có nghĩa là không có trình gỡ lỗi nào là khả dụng.
  4. Chờ sự kiện DBWIN_BUFFER_READY được báo hiệu: điều này cho biết rằng bộ nhớ đệm không còn được sử dụng nữa. Hầu hết thời gian, sự kiện này sẽ được báo hiệu ngay lập tức khi được kiểm tra, nhưng sẽ không chờ hơn 10 giây để bộ đệm sẵn sàng (hết thời gian từ chối yêu cầu).
  5. Sao chép tối đa 4kbyte dữ liệu vào bộ nhớ đệm và lưu trữ ID tiến trình hiện tại ở đó. Luôn đặt một byte NUL ở cuối của chuỗi.
  6. Cho trình gỡ rối biết rằng bộ đệm đã sẵn sàng bằng cách đặt sự kiện DBWIN_DATA_READY. Trình gỡ rối lấy nó từ đó.
  7. Nhả mutex
  8. Đóng đối tượng Sự kiện và mục, mặc dù chúng tôi giữ tay cầm để mutex xung quanh sau này.
+0

Cảm ơn bạn, những gì tôi muốn nghe :) –

26

Vâng, không phải là nó không phải là sự thật, đó là, nhưng chỉ cần như vậy mà bạn không cần phải chỉ mất Lieven lời cho nó:

Passing dữ liệu giữa các ứng dụng và trình gỡ lỗi được thực hiện qua một đoạn 4kbyte bộ nhớ dùng chung, với Mutex và hai đối tượng Sự kiện bảo vệ quyền truy cập vào nó. Đây là bốn đối tượng hạt nhân có liên quan.

Understanding Win32 OutputDebugString là một bài viết tuyệt vời về vấn đề này.

+0

Tôi biết đó là chủ đề an toàn bởi vì tôi đã từng tự tìm kiếm. Tôi không biết toàn bộ câu chuyện đằng sau nó nữa. Cảm ơn bạn đã làm rõ nó. –

2

Tôi đã gặp rắc rối một lần, tuy nhiên, với chuỗi trong một DLL ISAPI. Đối với một số lý do lẻ, boolean IsMultiThread được định nghĩa trong System.pas không được thiết lập!

Điều này gây ra AccessViolations lạ, khi chuỗi đang chạy nhiều hơn một chuỗi ... Một đơn giản "IsMultiThread: = true;" trong một khởi tạo đơn vị cố định nó.

+0

@Stijn, phiên bản nào của Delphi là cái này? Khi tôi phá vỡ ứng dụng Delphi 2007, IDE cho thấy biến này là 'true'. – rossmcm

Các vấn đề liên quan