멀티프로그래밍 위키로 바로가기 → http://www.devnote.net/wiki

코맨드라인 디버거인 NTSD, KDB 등을 사용하다보면 전체 스레드의 스택을 살펴 보는 (~*kb) 일을 자주하게 됩니다. 이럴 때면 여러 스레드 콜스택 중에서 특정 함수 호출 부분을 모두 찾는 다거나 특정 모듈을 찾을 경우가 많은데, 커맨드 콘솔의 텍스트 출력을 눈으로 훑어 나가기가 쉽지는 않습니다.


아래와 같은 레지스트리를 설정하면, 콘솔 창에서 "마우스로 원하는 스트링을 선택한 후" 1, 2, 3, 4 중 하나의 방법을 사용하여 색깔을 변경할 수 있습니다. 특히 3과 4가 디버깅 중에 매우 유용합니다.


[HKEY_CURRENT_USER\Console]

"QuickEdit"=dword:00000001

"EnableColorSelection"=dword:00000001     


1.       Alt + [0..9] : 텍스트 색깔 설정

2.       Ctrl + [0..9] : 배경색 설정

3.       Alt + Shift + [0..9] : 선택된 스트링과 같은 모든 스트링의 텍스트 색깔 설정

4.       Ctrl + Shift + [0..9] : 선택된 스트링과 같은 모든 스트링의 배경 색깔 설정

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

윈도우즈 디버깅의 기초에관한 블로그 문서가 처음 디버깅에 입문하려는 사람들에게 매우 유익한 자료가 될 것 같습니다. 물론 비주얼스튜디오의 디버깅 기능에 충분히 만족하는 사람에겐 큰 도움이 되지 못하겠습니다만, 커널레벨의 디버깅을 하려는 사람이나 보다 강력한 기능의 디버거를 원하는 사람에겐 좋은 문서가될 것 입니다.
크리에이티브 커먼즈 라이센스
Creative Commons License

전에 언급한 디버깅 책이 출간되어 주문을 하였는데 어제 도착했습니다. 아마존에서도 판매 중인 이 책은 이른바 (POD: Print On Demand) 방식으로 출판되어 상당히 흥미롭습니다. 이제 개인이나 초보 저자들이 책을 출간하는 것이 정말 쉽게될 것 같습니다.

이 책은 700여 페이지에 달할 만큼 두꺼운 편이나, 많은 부분이 디버깅이나 덤프 파일 분석 과정의  아웃풋을 리스팅해 놓아서 실제 내용은 그렇게 많지 않습니다. 복잡한 문제를 디버깅하는 동안 좋은 레퍼런스가  될 것 같습니다. (물론 대부분 블로그에 있는 내용을 책으로 옮겨 놓은 것입니다). 저자는 메모리 덤프파일을 비트맵 이미지와 wav파일로 변환하여 보고 듣기까지 하는 등 상당히 재미있는 부분도 많이 있습니다.

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

요즘 관심을 가지고 계속 보고 있는 디버깅 관련 블로그가 있습니다. Dmitry Vostokov라는 사람이 쓰고 있는 블로그인데 상당히 괜찮은 내용이 많습니다. 이 사람은 요즘 디버깅 관련 책을 쓰고 있는데, 오늘 아래와 같이 샘플 챕터를 공개하였군요.

http://www.dumpanalysis.org/WCDA/WCDA-Sample-Chapter.pdf
크리에이티브 커먼즈 라이센스
Creative Commons License

Advanced Windows Debugging 책이 어제 도착했습니다. 대충 훑어 보았는데, 예상대로 괜찮은 내용들이 많았습니다. 커맨드라인 디버깅툴을 사용하여 커널 디버깅을 하거나 크래시 덤프를 분석하거나 하는데 아주 많은 도움이 될듯합니다. Debugger Extension, PostMortem debugger, Win64에 관한 내용도 추가되어 있습니다. 그동안 디버거를 사용하면서 유용하게 사용할 수 있는 명령이라고 생각하던 것들이 잘 정리되어 있습니다.

보통 일반 개발자들이 커맨드라인 디버거를 사용해야할 경우는 별로 없을 것 입니다. 그리고 사용방법도 까다롭고 어셈블리를 어느 정도 이해하여야만 합니다. 하지만, 기능이 아주 막강하며 OS 시스템 내부를 이해할 수 있다는 점에서 아주 흠미롭습니다.
크리에이티브 커먼즈 라이센스
Creative Commons License

"Advanced Windows Debugging"이란 책이 곧 발간될 예정입니다. 아래 링크에 샘플 챕터가 있는데, 윈도우즈 힙 메모리 내부 구조에 관해 상세히 다루고 있습니다. 언젠가 쓴 적이 있는데 Visual C의 동적 메모리 할당 함수인 malloc/free 는 결국 HeapAlloc/HeapFree를 기본적으로 호출합니다. 그리고 이 힙메모리는 상당히 효율적으로 만들어져 있습니다. 그 내부 구조가 알고 싶다면, 아래 챕터가 큰 도움이 될 것입니다.

http://advancedwindowsdebugging.com/ch06.pdf
크리에이티브 커먼즈 라이센스
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

앞서 말쓸드린 윈도우즈 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