서버를 개발하던 중 갑자기 kernalbase.dll에서 애러가 떴다. 필자는 분명 커널에서 애러가 났고, 커널이 관리하는 IOCP에서 비동기 Accept동작을 걸었으니 여기서 애러가 난 것이라 생각했다. 하지만 이것은 반은 맞았고 반은 틀린 생각이였다. 놀랍게도 애러는 바로 getchar에서 일어난 것이였다. 비동기 작업을 걸기 전 io처리 스레드(GQSC; GetQueuedCompletionStatus()가 있는 스레드)가 커널모드에서 활성화 되지 않은 상태에서 주 스레드가 terminated되었을 땐 문제가 발생하지 않았다. 문제가 발생하는 상황은 비동기 작업을 걸어 io처리 스레드가 활성화 되고, 아무 문자를 입력해 main스레드에서 getchar를 실행하게 되었다. 하지만 getchar는 thr..
WinAPI
Format을 왜 해야 할까 winapi나 다른 운영체제의 api를 사용하다 보면 애러가 날 때 애러 메시지가 아니라 에러코드를 리턴한다. 따라서 이 애러가 무슨 애러인지 알기 위해서는 구글링으로 애러코드를 검색해야 한다. 애러코드를 메시지로 구글링으로 메시지를 알아내도 되지만 매번 검색하기는 귀찮다는 문제가 있다. FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, errCode, /* 애러 코드 */ 0, (LPTSTR)&errorMessage, /* 애러 메세지 */ 0, NULL); winapi에서는 애러코드를 메시지로 변환해 주는 FormatMessage라는 함수가 있다. 하지만 이 함수를 호출하기 위해..