본문 바로가기

프로그래밍/미분류

First chance exception 0X406D1388

반응형

크롬과 엣지에서 Exception 0X406D1388 덤프가 많이 발생했다.  

덤프파일을 windbg 로 열어 analyze -v 를 실행한 스택내용은 다음과 같았다. (크롬 심볼서버 세팅함.)

STACK_TEXT:  
KERNELBASE!RaiseException+0x6a
chrome!base::PlatformThreadBase::SetName+0x1ae
chrome!base::internal::ThreadGroupImpl::WorkerThreadDelegateImpl::OnMainEntry+0x74
chrome!base::internal::WorkerThread::RunWorker+0x81
chrome!base::internal::WorkerThread::RunPooledWorker+0x18
chrome!base::`anonymous namespace'::ThreadFunc+0x11c
kernel32!BaseThreadInitThunk+0x14
ntdll!RtlUserThreadStart+0x21

크롬은 오픈소스 기반이니까 PlatformThreadBase::SetName 함수를 검색해 봤다.

https://source.chromium.org/chromium/chromium/src/+/main:base/threading/platform_thread_win.cc

여기에서 SetName 함수를 찾아보면 내용이 이렇다.

// This function has try handling, so it is separated out of its caller.
void SetNameInternal(PlatformThreadId thread_id, const char* name) {
  THREADNAME_INFO info;
  info.dwType = 0x1000;
  info.szName = name;
  info.dwThreadID = thread_id;
  info.dwFlags = 0;

  __try {
    RaiseException(kVCThreadNameException, 0, sizeof(info) / sizeof(ULONG_PTR),
                   reinterpret_cast<ULONG_PTR*>(&info));
  } __except (EXCEPTION_EXECUTE_HANDLER) {
  }
}

THREADNAME_INFO 구조체에 값들을 채우고서 뜬금없이 kVCThreadNameException 예외를 발생시킨다 (RaiseException).

// The information on how to set the thread name comes from
// a MSDN article: http://msdn2.microsoft.com/en-us/library/xcb2z8hs.aspx
const DWORD kVCThreadNameException = 0x406D1388;

kVCThreadNameException 이 바로 덤프 제목에 포함되어 있는 0X406D1388 .

검색해 보니 디버거에서 디버깅시에 편리하도록 쓰레드 이름을 설정하는 코드라고 한다.

 

네이티브 코드에 스레드 이름 설정 - Visual Studio (Windows)

Visual Studio에서 다중 스레드 앱 디버깅 중에 네이티브 코드에서 스레드 이름을 설정합니다. 스레드 이름 지정은 스레드 창에서 스레드를 추적하는 데 사용됩니다.

learn.microsoft.com

예외를 일부러 발생시켜서 이런 것도 하는구나.

예외덤프가 많이 발생해서 무슨 문제인가 했는데, 문제가 아니었다.

728x90