2009-02-03 3 views

답변

18

걱정하지 않아도됩니다.

OutputDebugString()이 응용 프로그램에 의해 호출 될 때 이러한 단계를 취합니다. 어느 시점에서든 실패하면 모든 것을 포기하고 은 디버깅 요청을 no-op로 처리합니다 (문자열은 으로 전송되지 않음).

  1. DBWinMutex를 열고 독점적으로 액세스 할 때까지 기다리십시오.
  2. DBWIN_BUFFER 세그먼트를 메모리에 맵핑하십시오. 발견되지 않으면 디버거가 실행되지 않으므로 전체 요청이 무시됩니다.
  3. DBWIN_BUFFER_READY 및 DBWIN_DATA_READY 이벤트를 엽니 다. 공유 메모리 세그먼트 처럼 누락 된 개체는 디버거가 없음을 의미합니다.
  4. DBWIN_BUFFER_READY 이벤트가 수신 될 때까지 기다립니다. 메모리 버퍼가 더 이상 사용되지 않는다고 표시되는 이 표시됩니다. 대개의 경우이 이벤트는 검사 할 때 즉시 신호가 보내지 만 은 버퍼가 준비 될 때까지 10 초 이상 대기하지 않습니다 (시간 제한 은 요청을 포기합니다).
  5. 최대 4KB의 데이터를 메모리 버퍼에 복사하고 여기에 현재 프로세스 ID 인 도 저장하십시오. 항상 문자열의 끝에 NUL 바이트를 넣으십시오.
  6. DBWIN_DATA_READY 이벤트를 설정하여 버퍼가 준비되었음을 디버거에 알립니다. 디버거가 거기에서 가져옵니다.
  7. 뮤텍스를 해제하십시오. 뮤텍스를 나중에 처리하도록 처리하지만 이벤트 및 섹션 개체를 닫습니다.
+0

고마워요, 제가 듣고 싶었던 것 : –

26

글쎄, 그건 사실이 아니다하지 않는 것이 그 것이다,하지만 당신은 단지 그것을 위해 톨의 말을하지 않아도 단지 있도록 : 데이터의

합격을 사이 응용 프로그램 및 디버거는 공유 메모리의 4kbyte 청크를 통해 , 뮤텍스가있는 및 액세스를 보호하는 두 개의 이벤트 객체 을 통해 수행됩니다. 이 두 커널 개체는 입니다.

Understanding Win32 OutputDebugString은이 문제에 관한 훌륭한 기사입니다.

+0

한때 나 자신을보아야했기 때문에 스레드가 안전하다는 것을 알았습니다. 나는 그것의 뒤에 전체 이야기를 더 이상 알지 못했다. 명확히 해 주셔서 감사합니다. –

2

그러나 ISAPI DLL의 문자열로 인해 문제가 발생했습니다. 이상한 이유로 System.pas에 정의 된 IsMultiThread 부울이 설정되지 않았습니다!

스레드가 둘 이상의 스레드를 실행하면 이상한 AccessViolations가 발생했습니다. 간단한 "IsMultiThread : = true;" 단위 초기화에서 그것을 고정.

+0

@Stijn, 델파이의 버전은 무엇입니까? Delphi 2007 앱을 중단하면 IDE는이 변수를 'true'로 표시합니다. – rossmcm