멀티프로그래밍 위키로 바로가기 → http://www.devnote.net/wiki
Visual C 2005에는 많은 Intrinsic 함수가 추가 되어 있습니다. 그 중 Lock-Free를 위해 많이 사용되는 Atomic Operation이 대부분 Intrinsic 함수로 지원되는데, 이것은 inline assembly를 사용하는 것과 동일한 효과를 발휘합니다.

아래 32비트 디스어셈블리 코드를 보면 Intrinsic 함수인 _InterlockedExchangeAdd 사용함으로써 함수 호출 없이 바로 에셈블리 코드가 삽입되는 것을 볼 수 있습니다.

   InterlockedExchangeAdd(&inc2, 0xffff);
00401001  push   0FFFFh
00401006  lea    eax,[esp+4]
0040100A  push   eax 
0040100B  mov    dword ptr [esp+8],1234h
00401013  call   dword ptr [__imp__InterlockedExchangeAdd@8 (402000h)]
   _InterlockedExchangeAdd(&inc2, 0xffff);
00401019  mov         ecx,0FFFFh 0040101E  lea         edx,[esp]
00401021  lock xadd   dword ptr [edx],ecx


Intrinsic 함수는 특히 inline assembly가 지원되지 않는 64비트 프로그램 제작에 매우 유용한데 아래 x64 디스어셈블리 코드를 보면, Intrinsic 함수가 아닌 윈도우즈 API함수도 Intrinsic과 동일하게 최적화 되고 있는 것을 알 수 있습니다.

   InterlockedExchangeAdd(&inc2, 0xffff);
0000000140001008  mov         eax,0FFFFh
000000014000100D  lock xadd   dword ptr [inc2],eax
   _InterlockedExchangeAdd(&inc2, 0xeeee);
0000000140001013  mov         ecx,0EEEEh
0000000140001018  lock xadd   dword ptr [inc2],ecx

크리에이티브 커먼즈 라이센스
Creative Commons License

어제 VS의 디버그 심볼 서버를 사용하다가 VS가 다시 실행되지 않는 심각한 문제가 발생하였습니다.  VS를 실행하면 다음과 같은 다이얼로그 박스만 덩그러니 나타나고 끝나버려, 정말 황당할 수 밖에 없었는데, 오늘 겨우 그 원인과 해결 방법을 찾았습니다.


어제부터 VS를 두번이나 재설치하고 레지스트리를 변경하고 여러 가지 해보았지만 소용 없었습니다. 그런데, 심볼 서버의 캐시 폴더 설정이 제대로 동작하지 않더군요(Tools->Option->Debugging->Symbols 메뉴에서 설정). 즉, c:\websymbols로 캐시 폴더를 설정 하였으나, 실제로는 DevEnv.exe가 있는 폴더에 디버그 심볼 캐시를 만드는 것이었습니다. 이중에 "version.dll" 이라는 폴더도 생성되었는데, 이것이 바로 문제의 원인이었습니다. DevEnv.exe가 현재 디렉토리에서 version.dll을 로드하려다가 실패하고 그대로 종료하는 것이었습니다. 이 디렉토리를 삭제하니 모든 것이 정상 작동하였습니다.

호기심에 이번에는 "c:\Program Files\Microsoft Office\OFFICE11" 폴더에 "version.dll"폴더를 만들어 보았습니다. 그러니 이제 MS Word(winword.exe)를 실행하니 바로 크래시 되는군요. 다른 몇개의 프로그램도 같은 증상이 나타나고 있습니다.

이 문제는 Vista에서만 발생하는 것으로 보이며 생각보다 심각한 것 같습니다. 이를 악용하여 프로그램을 일부러 크래시 시킨다면 시스템 보안에도  문제가 생길 수 있어 보입니다.

크리에이티브 커먼즈 라이센스
Creative Commons License