멀티프로그래밍 위키로 바로가기 → http://www.devnote.net/wiki
윈도우즈 횐경에서 서버나 시스템과 밀접한 프로그램을 개발할 때 가장 자주 사용되는 유틸리티  모음이 Sysinternals tool 입니다. 다름 아닌 Windows Internals 의 저자인  Mark Russinovich 가 대부분 개발한 것인데, 보통 Microsoft 자체에서 개발된 것 보다 훨씬 낫습니다. Mark는 결국 현재 Microsoft에서 일하고 있습니다.

아래 링크를 보면 모든 Sysinternals tool이 업로드 되어 있어 쉽게 다운로드 받을 수 있습니다.
http://live.sysinternals.com/tools/

최근 추가된 Coreinfo.exe는 멀티코어 CPU 정보를 보기 쉽게 텍스로 출력해 주기도 하더군요.
크리에이티브 커먼즈 라이센스
Creative Commons License

TSF가 새로운 윈도우즈의 입력기라는 것을 잠시 언급한 적이 있습니다. 아래 함수호출 스택은 비스타에서 한글 입력기 상에서 하나의 키를 눌러 "ㄱ"이 입력되는 입력되는 과정을 보여 줍니다. 모든 키 입력은 어플리케이션의 "InsertTextAtSelection"가 최종으로 호출되어 입력기로부터 어플리케이션으로 실제 글자가 전달되게 됩니다.

TSF와 기존의 IME에 해당하는 Text Service 혹은 TIP (Text Input Processor)은 어플리케이션이 가진 텍스트 버퍼를 직접 액세스할 뿐만아니라 여러개의 TIP이 동시에 동작하고 있을 가능성도 있습니다. 따라서 텍스트 버퍼 액세스는 Lock이 필요합니다. 어플리케이션도 예외는 아닙니다. 당연히 구조는 기존 IME/IMM보다 복잡합니다.

하지만, 아래의 콜스택을 자세히 보면, 어플리케이션의 메인 메시지 함수인 WinMain으로 부터 InsertTextAtSelection 호출될 때까지 무려 47개의 함수 호출이 있으며, MSCTF.DLL로부터 다른 DLL함수를 호출하고, 외부 DLL이 다시 MSCTF 함수를 호출(reentrance)하는 것을 무려 3번이나 반복하고 있습니다. IMETIP.DLL도 마찬가지로 세번 보이고 있습니다.

결론적으로 "ㄱ"하나를 입력하기 위해 상당히 많은 CPU시간과 메모리가 소비되고 있는데, 이것은 Windows XP의 경우보다 더욱 복잡해진 것입니다. 물론, 요즘같이 빠른 CPU에서 사용자의 눈에 띌 정도의 속도 저하를 가져오는 것은 아닙니다. 그러나, 이러한 복잡한 구조로 인해 버그 발생의 가능성은 오히려 증가되고 유지보수는 어려워질 것이라는 것은 쉽게 추측할 수 있습니다. (여러개의 DLL 사이를 재귀적(recursively)으로 오가는 것은 좋은 구조라고 생각되지 않습니다)

입력기는 거의 모든 프로그램에서 로드되어사용된다는 점을 감안할 때, 최적화를 최우선으로 생각했다면 아래와 같은 함수호출은 피하지 않았을까 생각해 봅니다.


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

앞서 말쓸드린 윈도우즈 command line  디버거인 NTSD는 실행 중인 프로세스에 Attach하는 기능뿐만 아니라 Detach하는 기능도 포함되어 있습니다. 아래는 이 기능을 이용하여 덤프 파일을 만드는 예제입니다. "CrashProgrm"이라는 프로그램이 버그로 인해 간혹 크래시되고 있다면 아래와 같은 배치파일로 NTSD를 attach 시켜놓으면, 크래시가 일어나는 순간 "c:\crash.dmp"라는 파일을 만들고 종료합니다.

혹은 아래 배치를 실행한 후 나타나는 디버거 command 윈도우창에서 Ctrl+C를 누르면 현재 CrashProgram의 메모리와 스레드 (콜스택 포함) 정보를 덤프파일로 만들고, 디버거는 바로 detach되며, CrashProgram는 종료되지 않고 계속 실행하게 됩니다.  만들어진 덤프파일은 나중에 "ntsd -z crash.dmp"로 로드하여 분석할 수 있습니다. 가끔 hang되어 응답이 없는 프로그램을 디버그 하려고 할 때 편리합니다.

특히, 내 컴퓨터가 아니고 다른 사람의 컴퓨터에서 일어나는 문제를 살펴볼 때, 비주얼 스튜디오를 설치하지 않고도 디버깅 할 수 있습니다.  (NTSD는 XP에 포함되어 있으며, OS에 없다고 해도 디버거 파일 몇개를 플래시 메모리에 넣어 가지고 다니다가 사용하면 됩니다.)

for /f %%i in ('tlist CrashProgram') do set PID=%%i
if "%PID%"=="" goto :EndScript
ntsd -g -c ".logopen /d;.dump /o /mFuth c:\crash.dmp;.detach;q" -p %PID%

:EndScript
goto :EOF

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

Windows XP에는 command line debugger인 NTSD.EXE가 내장되어 있습니다. 그런데 NTSD는 계속 업그레이드되고 있으며 최신 버전은 아래 링크에서 다운로드 할 수 있습니다.

http://www.microsoft.com/whdc/devtools/debugging/default.mspx

이 디버거 패키지에는 WinDbg라는 UI지원 디버거도 같이 있으나 역시 사용하기는 어렵습니다. 하지만, OS 시스템 레벨의 디버깅을 원할 경우 아주 막강한 기능들을 제공합니다. 또, 윈도우즈 시스템 파일들의 디버그 심볼을 디버깅 도중 자동으로 다운로드해서 시스템 함수들의 이름을 보여주는 기능이 있습니다. 아래와 환경변수를 셋팅하면 됩니다. 자세한 것은 디버거에 포함된 도움말을 참고 하시기 바랍니다.

set _NT_SYMBOL_PATH=SRV*c:\websymbols*http://msdl.microsoft.com/download/symbols
크리에이티브 커먼즈 라이센스
Creative Commons License