디버그 플랫 썽크 방법

기술 자료 번역 기술 자료 번역
기술 자료: 133722 - 이 문서가 적용되는 제품 보기.
모두 확대 | 모두 축소

이 페이지에서

요약

복잡한 썽크 메커니즘을 사용할 수 있는 추적 썽크를 통해 디버깅 도구를 어려운 때문에 플랫 썽크 썽크 컴파일러에서 생성되는 디버깅 어려울 수 있습니다. 이 문서에서는 플랫 썽크, 몇 가지 특정 디버깅 기술 및 여러 가지 일반적인 썽킹 문제를 해결하는 방법을 설명하는 문제 해결 가이드 디버깅을 사용하여 전체 전략을 제공합니다.

추가 정보

설명 대상 DLL 일 수 제한

썽크는 디버깅을 시작하기 전에 몇 가지 제한 사항이 DLL 내부에 썽크 수행할 수 있는 어떤 대상에 염두에 두십시오. Win32 기반 DLL 호출 Win16 기반 응용 프로그램을 Win32 기반 프로세스가 없기 때문에 이 수, 마찬가지로, Win16 기반 DLL을 호출하는 Win32 기반 응용 프로그램 Win16 기반 프로세스가 없습니다. 다음과 같은 일반적인 특정 제한 사항이 있습니다.

  • Win32 기반 DLL Win16 기반 응용 프로그램에서 스레드 썽크 안에 만들 수 없습니다.
  • Win32 기반 응용 프로그램에 비해 훨씬 작은 스택 호출 Win16 기반 프로세스에 있기 때문에 Win32 기반 DLL 썽크에 의해 호출된 내부의 코드가 거의 스택 공간이 필요합니다.
  • 인터럽트 서비스 루틴 (ISR) 포함할 Win16 기반 DLL 인터럽트 처리 동안 Win32 기반 DLL 썽크에 합니다지 않습니다.
  • Win32 기반 응용 프로그램을 썽크 또는 호출 스택 전환 Win16 기반 DLL 매개 변수로 스택에 있는 데이터에 포인터를 전달해야 합니다지 않습니다.

왜 플랫 썽크 디버깅 어려움 수 수 있습니다. 있습니다.

부분적으로 플랫 썽크 메커니즘을 사용하여 복잡한 Windows 커널의 일부이므로 플랫 썽크 디버깅 어렵습니다. 32 비트 컴파일된 코드에 함수 호출을 변환 합니다 팩트 데이터를 해당 복잡성을 스템을 16비트 코드, 또는 그 반대로 호환되는 호출합니다. 32 비트 코드를 다른 데이터 형식을 사용하며 16비트 코드 집합에서 CPU 레지스터 때문에 플랫 썽크 메커니즘을 함수 매개 변수를 번역할 스택 전환하고 반환 값을 변환할 수 합니다. 속도, 최적화된 아직 선점형 Win32 코드를 선점형 비 Win16 코드를 호출할 수 있도록 합니다. 만드는 플랫 썽크 썽크 컴파일러 수동으로 만드는 것보다 훨씬 쉽게 수 있지만 간단하지 않습니다.

필요한 디버깅 도구가 더 어려울 수 있기 때문에 경우에만 메커니즘을 자체가 아니라 복잡한 때문에 플랫 썽크 디버깅 않는 어렵습니다 마스터. 32비트 및 16비트 코드가 구성될 클래임 또는 해당 Win16Mutex 릴리스 시스템에서 때문에 Microsoft Visual C++ 디버거 및 WinDBG 썽크를 통해 추적할 수 없습니다 (예: 응용 프로그램 수준 debuggers. 썽크 통해 추적 WDEB386.EXE 같은 시스템 수준 디버거를 사용해야 합니다. Intel x 86 마이크로프로세서 어떻게 작동하는지 알고 Intel x 86 어셈블리 언어 알아야 할 주요 단점은 WDEB386.EXE 사용하여 수 많은 디버거 명령을 기억할.

사용할 최선의 전략

나누고 때문에 정복 썽크를 디버깅을 위한 가장 좋은 방법은 것입니다 비교적 쉬우며 시스템 수준 디버거에서 어셈블리 언어 코드를 통해 추적 전에 문제 대부분 없애 줍니다. 이러한 격리 함께 테스트하기 전에 각 테스트할 수 있으므로 Win32 기반 DLL 및 Win16 기반 DLL 플랫 썽크가 구성됩니다. Win16 기반 DLL을 테스트할 수 있는 Win16 기반 응용 프로그램을 만들고 Win32 기반 DLL을 테스트할 수 있는 Win32 기반 응용 프로그램을 만듭니다. 이렇게 하면 각 면에 제대로 작동하는지 확인하려면 다양한 디버깅 도구를 사용할 수 있습니다.

썽크 컴파일러를 사용하여 컴파일 전 준비 검사-

각 면에 올바르게 작동하는지 확인한 후에는 함께 썽크 자체를 테스트하는 두 넣을 차례입니다. 썽크 썽크 컴파일러 함께 컴파일하기 전에 다음 항목의 예비 확인을 합니다.
  1. 썽크 스크립트에서 각 함수에 올바른 수와 형식의 매개 변수가 있는지 확인하십시오. 또한 매개 변수 형식을 썽크 컴파일러에 의해 지원되는 확인하십시오. 사용자가 없는 경우 지원되는 형식의 데이터를 전달하는 매개 변수는 어떤 식으로든 변경해야 합니다.
  2. 모든 구조체를 매개 변수로 전달하는 경우 동일한 구조체 Win32 기반 DLL, Win16 기반 DLL 및 썽크 스크립트가 있는 압축을 사용하면 확인하십시오. C/C++ 컴파일러 명령줄 및 썽크 컴파일러 명령줄에 압축을 구조를 설정합니다. 썽크 컴파일러 압축 스위치를 16 비트 쪽에 대한 소문자와 대문자를 32 비트 쪽에 대한 있음을 유의하십시오.
  3. 썽킹을 중인 함수를 제대로 내보낸 및 32비트 경우 16 비트 경우 규칙 또는 _stdcall 호출하면 파스칼식 사용할 확인하십시오. 썽크 컴파일러 _cdecl 및 __fastcall 호출 규칙을 지원하지 않습니다.
  4. Win32 기반 DLL ThunkConnect32() DllMain() 함수가 호출될 때마다 호출하는 확인하십시오. 마찬가지로, 내보낸된 DllEntryPoint() 함수를, ThunkConnect16() 호출하고 ThunkConnect16() 성공할 경우 TRUE를 반환합니다 해당 LibMain()에서 별도의 Win16 기반 DLL을 있는지 확인하십시오.

    참고: 사용자가 실제로 XXX_ThunkConnect16() 및 XXX_ThunkConnect32() XXX 기호 위치 호출할 썽크 컴파일러 -t 스위치 정의합니다. 이러한 기호를 썽크 컴파일러에 의해 생성된 코드를 ThunkConnect16() 및 ThunkConnect32 호출하여 테이블을 생성하는 데 사용합니다.
  5. Win32 및 Win16 썽크 DLL에 대해 같은 썽크 컴파일러 명령줄에-t 스위치는 지정된 값이 있는지 확인하십시오. 또한 값 (4단계에서 참고 참조) ThunkConnect 호출 Win16 기반 및 Win32 기반 DLL에서 접두사 일치해야 합니다.
  6. Win16 기반 DLL이 모듈 정의 (.DEF) 파일의 RESIDENTNAME 키워드를 사용하여 내보낸 DLLEntryPoint 있는지 확인하십시오. RESIDENTNAME 키워드를 사용하지 않고 ThunkConnect32/ThunkConnect16 호출이 실패하고 DLL은 로드되지 않습니다.
  7. 16비트 DLL이 모듈 정의 (.DEF) 파일의 RESIDENTNAME 키워드를 사용하여 내보낸 XXX_ThunkData16 있는지 확인하십시오.
  8. 리소스 컴파일러 같은 4.0 DLL 표시 Win16 기반 DLL의 메이크파일에 확인하십시오. 미만의 4.0 표시되어 있으면 해당 로드하지 않는 및 썽크를 실패합니다.
  9. 32 비트 16 비트 썽크 함수 포인터를 반환하는 경우, 기본 형식 양쪽에 있는 16비트 및 32비트 썽크 같은 크기가 충분한지 확인하십시오. 기본 형식의 크기가 다른 경우 "포인터는 비-동일한 형식으로 돌아갈 수 없습니다." 라는, 오류 메시지가 썽크 컴파일러 문제 이 문제를 해결하려면 한 가지 방법은 다르지만 호환되는, 데이터 형식에 대한 포인터를 반환할 수 있습니다. 예를 들어, int 두 바이트 16 비트 쪽에 4바이트 32 비트 쪽에 있지만 때문에 썽크를 int로 [NULL]에 대한 포인터를 반환할 수 없습니다. 반환 형식이 있는 썽크 썽크 스크립트 및 Win16 기반 및 Win32 기반 DLL의 소스 코드를 long 포인터로 int에서 포인터를 변경하십시오.

    32 비트 16 비트 썽크 작성하는 경우 포인터를 반환하는 없다는 오류 메시지가 썽크 컴파일러 문제, "포인터 형식이 아닌 반환될 수 있습니다." 썽크를 32비트 함수에서 반환된 후에는 포인터가 올바른 Win32 기반 프로세스 주소 공간에서 데이터 않는 지정되므로 포인터 반환 16비트 32비트 썽크 썽크 컴파일러 허용하지 않습니다. 모든 Win32 기반 프로세스 주소 공간 동일한 범위 주소를 사용하는 및 preemptively 컨텍스트를 전환할 수 있기 때문입니다.
  10. 링커는 "외부 확인되지 않은" 오류 보고서 및 기호의 모든 소스 코드 전체에서 일관적으로 철자가 함수 이름입니다 모듈 정의 파일 및 썽크 스크립트 해당 프로토타입 경우를 모두 일관성이 있는지 확인합니다. Win32 쪽에 __stdcall 형식과 썽크 함수를 선언해야 합니다. 그리고 Win16 쪽에서 파스칼식 형식과 함수를 선언해야 합니다. C++ 프로젝트에서 선언하고 extern "C" 링크 지정자가 __stdcall 또는 파스칼식 형식 외에도 함께 양쪽 면에 썽크 함수 정의하는 데 합니다.

썽크 컴파일러를 사용하여 컴파일 후 trouble-Shooting 가이드-

해당 preliminaries 확인한 후에 썽크 DLL을 빌드하고 이를 실행해 보십시오. 실행 록 중인 단색 하려면 추가 테스트를 진행하십시오. 실행되지 않는 경우 다음 문제 해결 가이드를 확인하여 문제의 원인을 해결할 수 있습니다.

Win32 쪽에 있는 Win16 또는 ThunkConnect32() ThunkConnect16()가 실패합니다.

  1. 디버깅 버전의 시스템 DLL 실행하십시오. 디버깅 버전의 KERNEL32.DLL 및 KRNL386.EXE 썽크가 초기화되지 않은 이유를 알 수 있는 많은 진단 메시지가 들어 있습니다. 디버깅 버전의 시스템 DLL 실행하려면 Win32 SDK 도구 시작 메뉴에서 "전환 디버그 DLL" 아이콘을 사용하십시오. "전환" 에 없는 디버깅 DLL에 사용할 일반 정품 버전으로 다시 전환합니다.
  2. Win16 기반 DLL ThunkConnect16() 호출하여 있고 ThunkConnect32() 해당 호출을 Win32 기반 DLL 있는 확인하십시오. 이들 중 하나가 없는 경우 다음 다른 실패하고 썽크 DLL을 로드할 수 없게 됩니다.
  3. Win32 DLL DllMain() 중단점을 넣고 Win16 DLL의 DllEntryPoint() 및 LibMain() DLL 보려면 함수 않는 로드하는 중입니다.
ThunkConnect16() 및 ThunkConnect32() 호출을 제대로 작동하지 않지만 썽크를 아직 없는 경우, 사용자의 썽크로 제어를 단순화하는 시간입니다. 두 가지 방식으로 실제로 공격. 먼저, 매개 변수에서 썽크 한 번에 하나씩 제거 및 이를 다시 컴파일하지 시작하십시오. 또는, 둘째, 작동, 간단한 썽크에 만들고 이 단계를 수행하여 실패할 때까지 위로 빌드:
  1. 간단한 썽크 만들고 실행할 단 썽크 메커니즘이 제대로 설정되어 있어야 합니다. 간단한 썽크 선택하는 것이 반환 값 및 매개 변수가 없는 함수입니다. 간단한 썽크 경우에도 작동하지 않으면 위의 작업을 올바르게 설정되어 있어야 하려면 예비 검사 통해 실행하십시오. 다음 단계 2를 진행하십시오.
  2. 대상 DLL 있는지 확인하고 의존합니다 DLL 찾 및 로드할 수 있습니다. 하나를 없거나 로더가 찾을 수 없는 경우 썽크를 작동하지 않습니다.
  3. DLL 뭔가 썽크 컨텍스트에서 수 없는 작업을 수행하는 않는 대상을 확인하십시오.
작동, 단순화된 썽크에 같지만 실제 썽크 여전히 작동하지 후에는 다음과 같이 하십시오.
  1. 매개 변수를 매개 변수 오류를 일으키는지 확인하려면 한 번에 간단한 썽크를 위해 하나를 추가하십시오. 하나인 경우 매개 변수가 함수에 선언된 및 동일한 개수 및 형식의 매개 변수가 두 DLL 및 썽크 컴파일러 정의된 올바른 형식이 되도록 파스칼식 또는 _stdcall 같이 선언된 함수가 확인하십시오.
  2. 대상 DLL Win16 기반 DLL 전역 또는 정적 데이터에 액세스할 수 없는 경우 함수를 제대로 내보낸 적이 있는지 확인하십시오. Visual C++/GD 스위치를 사용하는 경우 선언하고 Win16 기반 DLL의 소스 코드에서 __export 키워드로 함수를 정의해야 합니다. 컴파일러에서 프롤로그 생성하지 않는 내보낸 함수 에필로그 코드가 필요하지 않도록 .DEF 파일을 처리하지 않으므로 바로 함수의 이름을 DLL의 모듈 정의 (.DEF) 파일 나열하는 충분하지 않습니다.
  3. LocalAlloc() 호출을 사용하여 대상 Win16 기반 DLL 원인 일반 보호(GP) 오류 있는 경우 2 단계에서 설명한 대로 함수를 내보낼 수 있습니다.
  4. GP 내결함성이 있는 KERNEL32 사용자의 대상 Win16 기반 함수가 반환하기 바로 뒤에 표시되면 대상 함수를 선언하고 파스칼식으로 정의된 확인하십시오. C 호출 규칙을 사용할 수 없습니다. 드문 있지만 어셈블리 언어 가능성이 있지만 C 또는 C++ 코드에서 대상 함수에 DS, SS, BP, SI, 또는 DI 레지스터 수정할 않은 확인하십시오.
  5. 즉시 사용자 Win32 기반 대상 함수 반환 후 DLL 또는 KERNEL32 32비트 썽크 있는 GP 오류가 표시되면 대상 함수에 _stdcall으로 선언된 DS, ES, FS, SS, EBP, EBX, ESI, 또는 EDI 레지스터 수정하지 않은 확인하십시오. C 또는 C++ 코드를 수정할 수 있도록 레지스터 원인이 있지만 어셈블리 언어 코드를 신중하게 검사해야 합니다.
  6. 사용자의 Win16 기반 대상 함수에 잘못된 위치로 반환합니다 선언된 및 FAR로 정의된 경우. 특히 소규모 모델 DLL 중요합니다. 그리고 중간 및 대규모 모델 DLL의 함수를 FAR 기본적으로.
  7. 데이터 (즉, thunked 포인터) 매개 변수로 전달된 포인터가 64 K 개 액세스할 때 Win16 기반 함수를 GP 오류가 발생할 경우 선택기 바둑판식된 배열을 할당할 Microsoft 기술 자료의 다음 문서에서 설명하는 대로 합니다.
    132005DOCERR: AllocSelector 및 FreeSelector 문서 미완료
    Win16 쪽에서 thunked 포인터를 거대한 포인터로 사용할 수 없습니다 64 K 제한을 사용하여 단일 CLASS의 항상 구성됩니다. 포인터가 주소 데이터의 전체 원본 범위를 참조하려면, 바둑판식된 선택기 배열을 만드는 경우 및 데이터에 액세스하는 데 막대한 포인터 변수를 사용하는 경우 유일한 있지만 DLL - Win16 기반 대상 액세스할 수 있습니다.
  8. thunked 포인터가 썽크 컨텍스트에서 경우에만 사용해야 합니다. 사용할 썽크 컴파일러에 의해 Win16 기반 대상에 의해 할당된 선택기 썽크를 반환하는 즉시 해제됩니다.
  9. 데이터를 가져오는 중인 않도록 하려면 대상 함수의 시작 부분에 중단점을 배치하십시오. 사용자가, 및 대상 측면, 썽크 독립적으로 디버깅 지금까지 대상 내부에서 오류가 발생한 경우 다음 가능성을 대상 작업을 썽크에서 수행할 수 없는 수행하지 또는 존재하지 않는 메모리를 참조하는 유용합니다. 7단계와 8단계를 참조하십시오.

속성

기술 자료: 133722 - 마지막 검토: 2005년 7월 11일 월요일 - 수정: 2.3
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft Platform Software Development Kit-January 2000 Edition?을(를) 다음과 함께 사용했을 때
    • Microsoft Windows 95
    • Microsoft Windows 98 Standard Edition
    • Microsoft Windows Millennium Edition
키워드:?
kbmt kbhowto kbkernbase kbprogramming KB133722 KbMtko
기계 번역된 문서
중요: 본 문서는 전문 번역가가 번역한 것이 아니라 Microsoft 기계 번역 소프트웨어로 번역한 것입니다. Microsoft는 번역가가 번역한 문서 및 기계 번역된 문서를 모두 제공하므로 Microsoft 기술 자료에 있는 모든 문서를 한글로 접할 수 있습니다. 그러나 기계 번역 문서가 항상 완벽한 것은 아닙니다. 따라서 기계 번역 문서에는 마치 외국인이 한국어로 말할 때 실수를 하는 것처럼 어휘, 구문 또는 문법에 오류가 있을 수 있습니다. Microsoft는 내용상의 오역 또는 Microsoft 고객이 이러한 오역을 사용함으로써 발생하는 부 정확성, 오류 또는 손해에 대해 책임을 지지 않습니다. Microsoft는 이러한 문제를 해결하기 위해 기계 번역 소프트웨어를 자주 업데이트하고 있습니다.

피드백 보내기

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com