다음을 통해 공유


로그 파일 정보

업데이트: 2007년 11월

다음 작업에 대한 동작을 기록하는 로그 파일을 만들 수 있습니다.

  • 네이티브 코드와의 상호 운용

  • 프로그램 로드

  • 네트워킹

로깅을 제어하는 레지스트리 키에 대한 내용과 로그 파일을 생성하는 방법에 대한 내용은 방법: 로그 파일 만들기를 참조하십시오.

이 항목에서는 로그 파일에 기록되는 interop 및 로더 로깅에 대한 출력을 설명합니다.

Interop 로그 파일

interop 로깅 출력은 런타임에 발생한 interop 함수 호출의 시그니처와 오류 메시지로 구성됩니다.

.NET Compact Framework 버전 3.5에는 향상된 interop 로깅 지원 기능이 포함되어 있으며 이러한 기능은 항목의 뒷부분에 나오는 "강력 마샬링" 단원에 설명되어 있습니다.

함수 시그니처

관리에서 네이티브로의 호출 및 네이티브에서 관리로의 호출에 대한 시그니처가 모두 기록되며 다음과 같은 호출 형식이 포함됩니다.

  • P/Invoke 호출

  • COM vtable 및 디스패치 호출

  • 대리자 콜백

Interop 로깅은 매개 변수가 예상대로 초기화되지 않은 경우 또는 프로그램이 예기치 않게 종료된 경우 등과 같이 interop 함수를 호출할 때나 interop 함수 호출에서 반환될 때 발생하는 문제를 해결하는 데 도움이 될 수 있습니다.

함수 시그니처 엔트리의 출력은 interop 호출마다 3개의 줄로 구성됩니다. 첫 번째 줄은 수행된 함수 호출 유형을 식별하는 플래그를 제공하며 다음 요소 중 하나 이상을 포함합니다.

  • [pinvokeimpl]
    DllImportAttribute 특성을 사용하는 관리에서 네이티브로의 호출을 식별합니다.

  • [Ctor]
    형식 라이브러리 가져오기(Tlbimp.exe)에 의해 생성된 interop 어셈블리 클래스에 대한 생성자를 식별합니다.

  • [preservesig]
    관리되는 함수 및 네이티브 함수의 시그니처가 동일하며 런타임에 의해 강제로 HRESULT에서 예외로 변환되지 않는다고 가정합니다.

  • [delegate]
    함수가 네이티브에서 관리로의 대리자 콜백임을 나타냅니다. 대리자는 네이티브 코드에서 함수 포인터의 역할을 합니다.

interop 로그 파일의 두 번째 줄은 관리되는 시그니처를 나타냅니다. 관리에서 네이티브로의 함수 호출의 경우 이 줄은 네이티브 코드를 호출하는 관리되는 함수를 식별합니다. 네이티브에서 관리로의 함수 호출의 경우 이 줄은 네이티브 코드에서 호출되는 관리되는 함수를 식별합니다.

세 번째 줄은 런타임에 예상되는 네이티브 시그니처를 나타냅니다. 이 줄은 각 매개 변수의 데이터 형식을 식별하며 관리되는 개체 데이터의 마샬링 방식에 대한 정보를 제공합니다. 런타임은 올바른 형식이 DllImportAttribute 특성에 의해 지정되거나 COM 인터페이스 시그니처 정의에 지정되어 있다고 가정합니다. 올바른 형식을 지정하지 못하면 함수가 잘못된 매개 변수 값으로 실행되므로 예상치 못한 동작이 발생할 수 있습니다.

모든 형식에는 기본 마샬링 형식이 있습니다. 관리되는 형식의 마샬링 동작은 COM 호출과 DllImportAttribute 또는 대리자 콜백 호출에서 다를 수 있습니다. MarshalAsAttribute 특성을 사용하면 기본 형식 이외의 마샬링 형식을 지정할 수 있습니다. 참조 형식의 경우 ref 키워드를 사용하여 값 형식에 대한 포인터 또는 포인터에 대한 포인터를 나타내는 모든 매개 변수를 식별해야 합니다.

다음 표에서는 플랫폼 호출에 대한 interop 로깅을 보여 줍니다.

줄 번호 및 설명

로그 엔트리

1 - 함수 호출 유형

[pinvokeimpl][preservesig]

2 - 관리되는 시그니처

bool PlatformDetector::SystemParametersInfo(uint , uint , System.Text.StringBuilder , uint );

3 - 네이티브 시그니처

BOOLEAN (I1_WINBOOL_VAL) SystemParametersInfo(unsigned int (U4_VAL) , unsigned int (U4_VAL) , WCHAR * (STRINGBUILDER_LPWSTR) , unsigned int (U4_VAL) );

다음 표에서는 대리자 콜백에 대한 interop 로깅을 보여 줍니다.

줄 번호 및 설명

로그 엔트리

1 - 함수 호출 유형

[preservesig][delegate]

2 - 관리되는 시그니처

int WndProc::Invoke(WndProc , IntPtr , uint , uint , int );

3 - 네이티브 시그니처

int (I4_VAL) (*)(INT_PTR (I_VAL) , unsigned int (U4_VAL) , unsigned int (U4_VAL) , int (I4_VAL) )

다음 표에서는 네이티브에서 관리로의 COM 함수 호출에 대한 interop 로깅을 보여 줍니다. 이 경우 런타임은 관리되는 예외 발생 시 실패 HRESULT를 반환합니다.

줄 번호 및 설명

로그 엔트리

1 - 함수 호출 유형

(플래그 없음)

2 - 관리되는 시그니처

int N2MDualComponentImp.IN2MDualInterface::GetInt(N2MDualComponentImp.IN2MDualInterface This);

3 - 네이티브 시그니처

HRESULT GetInt(IN2MDualInterface *(INTF_VAL) this, [retval] int (I4_VAL) retval);

강력 마샬링

.NET Compact Framework 버전 3.5에서는 interop 로깅에 대한 강력 마샬링도 지원합니다. 강력 마샬링에서는 구조체 또는 참조 형식에 포함된 마샬링된 개체에 대한 정보가 기록됩니다.

다음 로그 출력에서는 구조체에 포함된 마샬링된 개체를 사용하는 P/Invoke 호출의 예를 보여 줍니다. 강력 마샬링 섹션의 첫 번째 줄에서는 전체 마샬러가 호출된 이유를 지정합니다. 이 예제에서는 구조체의 크기를 계산하기 위해 전체 마샬러가 호출되었습니다. 로그는 각 개체의 데이터 형식과 크기(바이트 단위)를 보여 줍니다. 0004와 같은 인덱스 값은 지정된 변수에 대한 바이트 오프셋을 나타냅니다.

DEEP MARSHAL: Get size
struct interoplogging.MyStruct
{
0000: Int32 myVar as Int32 (4 bytes)
0004: Int32 myVar2 as Int32 (4 bytes)
0008: String myString as WCHAR[10] (20 bytes)
}
DEEP MARSHAL: Total size = 28 bytes

[pinvokeimpl][preservesig]
void  interoplogging.Form1::MyAPI(interoplogging.MyStruct );
void MyAPI(MyStruct (NONBLIT_VALUETYPE_VAL) );

DEEP MARSHAL: Managed -> Native
struct interoplogging.MyStruct
{
0000: Int32 myVar as Int32 (4 bytes)
0004: Int32 myVar2 as Int32 (4 bytes)
0008: String myString as WCHAR[10] (20 bytes)
}
DEEP MARSHAL: Total size = 28 bytes

오류 메시지

특정 상황 및 예외가 발생하면 로그 파일에 오류 메시지가 기록될 수 있습니다. 이러한 메시지는 해당 네이티브 소스 코드를 사용할 수 없는 네이티브 구성 요소 및 DLL과의 상호 운용 작업에서 발생하는 문제점을 조사할 때 특히 유용합니다. 이러한 오류 메시지는 다음 문제를 해결하는 데 도움이 될 수 있습니다.

  • 네이티브에서 관리로의 함수 호출

  • 런타임 COM 인터페이스 호출. 런타임에 의해 구현되는 COM 인터페이스 함수가 호출될 때 네이티브 코드로 HRESULT 오류가 반환될 수 있습니다. 네이티브 코드에서 COM 인터페이스로 마샬링된 관리되는 개체를 사용하여 호출할 수 있는 런타임 구현 인터페이스는 IUnknown, IDispatch, IConnectionPointContainer, IEnumConnectionPointsIConnectionPoint를 비롯하여 몇 가지가 있습니다. 함수 호출이 이러한 인터페이스 중 하나에 있는 네이티브 코드로 오류를 반환하면 런타임은 HRESULT 및 추가 관련 정보를 포함하는 적절한 오류 메시지를 표시합니다.

  • IDispatch::GetTypeInfo와 같은 지원되지 않는 기능을 사용해야 하는 네이티브 코드

  • 구현되지 않은 인터페이스. 네이티브 코드는 관리되는 COM 개체가 추가 인터페이스를 구현해야 할 경우 IUnknown::QueryInterface에서 E_NOINTERFACE 오류를 수신할 수 있습니다. 이 경우 구현되지 않은 인터페이스의 GUID도 제공됩니다.

  • 관리되는 예외. 관리되는 예외는 관리되는 함수 호출 내에서 발생할 수 있으며 해당 호출을 중간에 반환할 수 있습니다. COM 호출을 수행할 때 런타임은 예외를 실패 HRESULT 값으로 변환하고 이 값을 네이티브 코드로 반환합니다. 그러나 대리자 콜백 또는 COM 호출에서 HRESULT 반환 값을 예상하지 않는 경우 네이티브 코드가 오류를 인식하게 만들 방법이 없으며 예상치 못한 결과가 발생할 수있습니다. 네이티브에서 관리로의 interop 함수 호출 도중에 예외가 발생할 경우 interop 로그에 오류 메시지가 포함됩니다. 이러한 메시지는 네이티브 코드에서 제대로 작동하기 위해 추가 오류 처리 논리를 필요로 하는 관리되는 함수를 식별하는 데 도움이 됩니다. 관리되는 예외는 다음과 같은 요인으로 발생할 수 있습니다.

    • COM 인터페이스 정의 또는 DllImportAttribute 시그니처에 .NET Compact Framework에서 지원하지 않는 형식을 사용하면 JIT 컴파일 프로세스 중에 예외가 발생합니다. IntPtr 사용과 같은 대체 옵션을 사용할 수 있습니다.

    • 실제 개체를 시그니처에 지정된 형식으로 강제 변환할 수 없거나 개체 데이터를 요청된 형식으로 변환할 수 없을 때 함수가 호출되는 런타임에 예외가 throw됩니다. 이러한 상황은 네이티브 개체를 관리되는 개체로 변환할 때 주로 발생합니다.

    • RCW(런타임 호출 가능 래퍼) 또는 CCW(COM 호출 가능 래퍼)를 만들 때 예외를 발생시키는 원인을 확인하기는 어렵습니다. interop 로그 파일은 관리되는 예외에 대해 상세한 오류 메시지가 제공되지 않을 때 이러한 문제의 원인을 파악하는 데 도움이 됩니다.

.NET Framework와의 차이점

.NET Compact Framework와 전체 .NET Framework의 COM 상호 운용성 구현 간에는 차이점이 있습니다. .NET Compact Framework는 다음을 지원하지 않습니다.

  • 지정된 GUID 없이 인터페이스가 들어 있는 CCW 만들기

  • interop 어셈블리 클래스에서 상속되는 클래스에 대한 RCW 만들기

  • 제네릭 메서드를 사용하여 비제네릭 인터페이스가 들어 있는 CCW 만들기

RCW(런타임 호출 가능 래퍼)는 일반적으로 종료 중에 정리되지만 ReleaseComObject 또는 FinalReleaseComObject 메서드를 사용하여 개체와 연결된 RCW를 해제할 수도 있습니다. 이러한 고급 옵션을 사용하여 개체의 수명을 관리하고, 네이티브 COM 호출을 수행할 수 있도록 개체가 해제된 후에 해당 개체를 사용하려고 하면 예외가 throw되며 로그 파일에 예외의 원인에 대한 오류 메시지가 포함됩니다.

로더 로그 파일

로더 로그 파일은 머리글과 본문의 두 섹션으로 구성됩니다. 로그 파일의 머리글에는 다음 데이터가 포함되어 있습니다.

  • 응용 프로그램 주 실행 파일의 이름

  • 운영 체제에서 할당한 프로세스 ID

  • 로그 파일이 만들어진 날짜와 시간

  • 응용 프로그램 실행에 사용된 .NET Compact Framework의 버전

  • 응용 프로그램이 실행되는 플랫폼에 대한 정보

각 어셈블리가 응용 프로그램에 의해 로드될 때 로그 파일의 본문에 각 어셈블리에 대한 진단 정보가 포함됩니다. 이러한 정보는 응응 프로그램을 시작할 때 클래스 로더에 의해 발생한 오류를 찾는 데 도움이 됩니다.

로그 파일의 본문에는 다음 데이터가 포함되어 있습니다.

  • 응용 프로그램이 이전 버전과의 호환 모드로 실행되었는지 여부를 나타내는 강제 변환 상태

  • 어셈블리를 로드한 위치 및 로드된 버전을 비롯한 각 어셈블리 로드에 대한 추적 정보

  • 모듈 로드 시 각 모듈에 할당된 신뢰 수준

  • 응용 프로그램에 연결된 구성 파일

  • 메서드, 형식, 어셈블리 및 모듈 검색 실패

  • P/Invoke 호출을 위한 네이티브 DLL 또는 함수 검색 실패

다음 표에서는 로더 로그 파일의 예를 보여 줍니다. 줄 번호는 대략적인 것입니다.

줄 번호 및 설명

로그 엔트리

1 - 프로세스

Process [\Program Files\VW\VW.exe]

2 - 프로세스 ID

Process ID [0x4d9585d2]

3 - 날짜

Date [2005/02/25]

4 - 시간

Time [18:33:14]

5 - .NET Compact Framework 버전

NETCF [2.0.5035.00]

6 - 플랫폼

Platform [Windows CE v4.20.1081 (PocketPC) WinCE4ARMV4 release Beta2 ARMV4 IJITv2]

7–14 - 전역 어셈블리 캐시 작업

GAC: Updating GAC [0x0]

GAC: Checking .gac files inside [\Windows\]

GAC: Found [Microsoft .NET CF 2.0.GAC] .gac file.

GAC: Done with the file system check. Checking the registry.

GAC: Found [Microsoft .NET CF 2.0.GAC] registry entry.

GAC: Done with the registry check. Let's compare.

GAC: Entry [Microsoft .NET CF 2.0.GAC] is up to date.

GAC: GAC is up to date.

15 - 호환 모드(0.0.0.0은 호환 모드가 아님을 나타냄)

Compatibility mode [0.0.0.0]

16 - 로드 중인 모듈

Loading module [\Windows\GAC_mscorlib_v2_0_0_0_cneutral_1.dll]

17 - 로드된 모듈

Loaded [mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=969DB8053D3322AC] from [\Windows\GAC_mscorlib_v2_0_0_0_cneutral_1.dll]

각 모듈에 대해 로드 중인 엔트리 및 로드된 엔트리가 마지막으로 기록됩니다. 이를 통해 어셈블리와 해당 위치를 식별합니다. 모듈 로드 시 발생하는 오류는 로더 로그에 기록됩니다.

오류 예제

이 단원의 두 예제에서는 로더 로그 파일을 사용하여 오류 발생 시기를 확인하는 방법을 보여 줍니다.

다음 예제에서는 로더가 어셈블리를 찾지 못할 때 기록되는 로그 엔트리를 보여 줍니다.

Loading module [\Program Files\VW\Golf.dll]
Attempt to load [\Program Files\VW\Golf.dll] has failed (err 0x80001000).
Loading module [\Program Files\VW\Golf.exe]
Attempt to load [\Program Files\VW\Golf.exe] has failed (err 0x80001000).
Failed to load [Golf, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]

다음 예제에서는 로더가 특정 형식을 찾지 못할 때 기록되는 로그 엔트리를 보여 줍니다.

Missing Type. Type [Cars.Jetta], Assembly [Cars].
Missing Type. Class [Cars.Jetta], Assembly [Cars, Version=5.0.0.0, 
Culture=neutral, PublicKeyToken=null].

참고 항목

작업

방법: 로그 파일 만들기

방법: 런타임 버전 구성

개념

.NET Compact Framework 방법 항목

기타 리소스

.NET Compact Framework의 상호 운용성

.NET Compact Framework의 성능 및 진단