5

"T"를 인쇄하는 응용 프로그램에서 "rogue"OutputDebugString 호출을했습니다. 다만 찾을 수는 없습니다.Delphi에서 OutputDebugString 호출 디버깅

어떻게 든 OutputDebugString -function에 중단 점을 설정하고 호출 위치를 볼 수 있습니까?

델파이 2009 년

답변

13

프로젝트에 얼마나 많은 통화 OutputDebugString에있다을 사용하고 있습니다? "파일에서 찾기"대화 상자를 사용하여 모두 찾을 수 있습니다. 너무 많지 않은 경우 문제가 없어야합니다.

그렇지 않으면 물론 검색을 사용하여 OutputDebugString(을 모두 raise Exception.Create(으로 바꿀 수 있습니다.

또한 프로젝트에 다른 모든 장치에서 사용하는 단위로 기능

procedure OutputDebugString(const Str: string); 
begin 
    raise Exception.Create(Str); 
end; 

을 작성할 수 있습니다. uses 목록에 Windows.pas 뒤에이 새 장치 만 선언 된 경우이 새 기능은 Windows.pas 대신 사용됩니다.

업데이트

예. Windows.pas에 중단 점을 배치 할 수 있습니다. 첫째, 프로젝트에서 프로젝트 옵션으로 이동하고 디버깅에서 "디버그 DCU 사용"을 선택하십시오. 그럼 당신은 Windows.pas에 가서 라인 30769에 중단 점을 배치 할 수 있습니다 :

procedure OutputDebugString; external kernel32 name 'OutputDebugStringW'; 
+1

프로젝트 및 구성 요소에 너무 많은 스프레드가 있습니다. 메시지가 제 3 자 코드에서 온 것인지 확실하지 않습니다. – Harriv

+0

예, 디버그 DCU가 수행합니다. 이제 조건을 설정하는 방법을 알아야합니다. – Harriv

+2

코드가 아니라면 (간접적으로) 사용하는 일부 유닛도 OutputDebugStringA로 이동할 수 있습니다. – Remko

7
  • 응용 프로그램을 실행합니다.
  • 일시 중지하십시오.
  • 보기/디버그 창/모듈 열기 창이 열립니다.
  • kernel32.dll을 검색하십시오. 더블 클릭하십시오.
  • OutputDebugStringA를 검색하십시오. Double 두 번 클릭하십시오.
  • CPU 창이 열립니다. 첫 번째 줄에 중단 점을 설정하십시오.
  • OutputDebugStringW를 검색하십시오. Double 두 번 클릭하십시오.
  • CPU 창이 열립니다. 첫 번째 줄에 중단 점을 설정하십시오.

완료.

이제 응용 프로그램에서 OutputDebugString을 호출하면 중단 점에서 중단됩니다. 중단 점 속성에서 로깅을 활성화하여 호출 스택을 기록 할 수도 있습니다.