Get Last Error(Windows)는 어디에 기록될까


윈도우 API를 사용하다 실패하면 GetLastError()를 먼저 살펴보게 된다.

DWORD WINAPI GetLastError(void);

GetLastError를 사용하면 가장 최근 실패한 에러코드를 반환한다. 따라서 API 실행이 실패한 이후 다른 API를 호출하면 GetLastError 값도 바뀔(덮어 쓸) 수 있기 때문에 실패한 API를 사용한 직후에 GetLastError를 사용해야 정확한 값을 알 수 있다. GetLastError는 현재 스레드의 마지막 에러 코드를 반환한다. 따라서 멀티 스레드로 동작중이라고 해도 GetLastError 값이 덮어 써질 일은 없다.

윈도우의 스레드를 구성하는 세 가지 요소는 스레드 커널 오브젝트, 스택, 스레드 환경 블록(TEB)이 있다. 이 중 TEB는 다른 요소들과 다르게 유저 모드 주소 공간에서 직접 접근 가능한 여러가지 스레드 환경 정보를 가지고 있는 데이터 구조체이며, TEB에는 마지막 에러 코드를 기록하는 LastErrorValue를 포함하고 있다.

TEB.JPG
[JPG image (16.54 KB)]


즉, Win32 API는 실패하면 스레드 환경 블록(TEB)의 LastErrorValue에 에러코드를 기록한다. GetLastError를 호출하면 TEB의 LastErrorValue 값을 반환한다.



이 글에는 0 개의 댓글이 있습니다.