프로세스 모니터는 Sysinternals에서 만든 수 많은 도구들 중 애플리케이션의 분석과 디버깅을 위한 가장 멋진 도구 중 하나이다.

나는 처음에 이 툴을 켜는 것을 무진장 싫어했다.
일단 실행하면 이상한 메세지들이 미친듯이 많이 내려와서 시스템을 엄청 느리게하는 것이 싫었기 때문이다.

하지만 꾹 참고 얼마 동안만 사용하다 보면 이 툴이 얼마나 훌륭한지, 사용자를 충분히 배려해서 만들었음을 깨닫게 된다.

프로세스 모니터를 통해 그동안 너무 많은 문제를 해결했기 때문에, 나는 이제 이 툴의 신봉자가 되어버렸다.

마크 루시노비치는 그의 블로그의 한 포스트에서 스승이었던 데이비드 솔로몬이,

“야 임마, 뭔가 의심가면 먼저 프로세스 모니터로 확인해 봐”

라고 말하곤 했었다 했다.
우습게도 마크는 이제 자신의 딸에게 똑같은 말을 한다고 한다.

“아빠, 이거 학교 숙제인데 잘 모르겠어요.”
“그럼 프로세스 모니터로 확인해보거라.”

ㅡ.ㅡㅋ

농담처럼 이야기 했지만, 정말로 이 말을 믿고 따라야한다.

  • 응용 프로그램이 내 컴퓨터에서만 오동작 할 때.
  • 프로그램 성능의 발목을 잡는 병목점이 어딘지 찾고 싶을 때.
  • 특정 프로그램이 도대체 내부에서 무슨 짓을 하는지 분석하고 싶을 때.
  • DLL이 로드되고 언로드 되는 것을 확인하고 싶을 때.

그리고 이 외 모든 이상하고 골치 아픈 문제들에 대해서 프로세스 모니터가 기꺼이 친구가 되어줄 것이다.

프로세스 모니터의 주요 5가지 기능은 다음과 같다.

pm

좌측의 아이콘부터,

  • 레지스트리 활동 모니터링
  • 파일 시스템 활동 모니터링
  • 네트워크 활동 모니터링
  • 프로세스와 쓰레드 활동 모니터링
  • 이벤트 프로파일링

다섯가지 아이콘을 모두 클릭해서 프로세스의 모든 활동을 살펴 볼 수도 있지만, 로그가 너무 많아지면 문제에 집중하기 힘들기 때문에 원하는 특정 기능만을 활성화 시키면 된다.

하지만 레지스트리나 파일 시스템 둘 중 하나만 클릭해보더라도 얼마나 많은 로그가 쌓이는지 보고는 깜짝 놀라게 될 것이다.
아무 프로그램도 안 띄워놓고 있더라도 파일 시스템과 레지스트리는 눈에 안보이는 서비스나 백그라운드 애플리케이션들에 의해 항상 바쁘다.

이를 좀 더 편하게 추려내기 위해 프로세스 모니터는 강력한 필터링 기능을 또한 제공한다.

pm

처음 프로세스 모니터를 켜면 위와 같이 필터링 대화상자나 나타난다.
초록색 아이템은 관심있어 하는 내용이고, 빨강색 아이템들은 관심이 없으니 캡쳐 하지 말라는 뜻이다.
위 그림에서 처럼 프로세스 이름으로 필터링 할 수도 있고, 파일의 경로나 쓰레드 아이디, 어떤 특정한 동작을 하는지의 여부로도 필터링 할 수가 있다.
알고 싶은 내용에 대해서만 로그가 나오도록 필터링 옵션에 숙달되는 것이 프로세스 모니터를 사용하는데 있어서 가장 중요한 점이다.

또한 위 그림에서 맨 좌측에 있는 체크박스들은 꽤 근래에 생긴 편리한 기능이다.
자신이 자주 쓰는 옵션들로 필터들을 한번 넣어 놓은 뒤, 다음번 실행시에는 체크박스만 껐다 켰다 하면서 쉽게 제어할 수 있다.

메뉴의 필터 부분을 보면 방금 설명한 필터 기능을 제외하고, 주목할 기능이 3가지가 더 있다.

프로세스 모니터

Enable Advanced Output을 켜면 파일 시스템 활동을 관찰할 때 Operation이 아래 그림처럼 나타난다.

프로세스 모니터

커널 쪽에서 프로그래밍 경험이 있는 사람들이라면 각 디스패치 루틴들과 대응된다는 것을 알 수 있을 것이다.

Advanced Output 옵션을 사용하지 않는다면 아래 그림처럼 일반 응용 프로그래머들에게 좀 더 익숙한 Win32 인터페이스 이름으로 출력된다.

프로세스 모니터

Advanced Output 이라고 해서 항상 좋은 것은 아니며, 자신이 어떤 부분에 관심이 있는지에 따라서 양쪽을 번갈아가면서 사용하면 된다.

Drop Filtered Events 라는 것은 역시 최근에 생긴 너무 반가운 기능이다.
기본적으로 프로세스 모니터를 켜고 나면, 필터를 아주 정교하게 설정해서 원하는 로그만 출력되게 했다고 할지라도, 화면에만 안 나올 뿐이지 다른 모든 내용들이 캡쳐된다.
이는 메모리를 몹시 많이 잡아먹고 시스템을 느려지게 하는데, 위 기능을 사용하면 관심없는 이벤트들은 캡쳐하지 않고 바로 버리게 된다.
하지만, 시스템이 조금 느려지더라도 모든 내용을 버리지 않고 간직하고 있는 것이 유용할 때가 종종 있다.
로그를 보는 도중 다른 아이디어가 생각나서 필터를 변경했을 때 예전 내용들을 다 가지고 있다면 곧바로 확인해 볼 수 있지만, Drop해버리면 프로세스 모니터를 껐다 켜서 다시 캡쳐해야한다.
기능을 잘 이해한 채 적절히 사용하면 된다.

Highlight 기능 역시 로그를 쉽게 보는데 도움을 준다.

프로세스 모니터

위 그림은 윈도 탐색기가 수행하는 파일 오퍼레이션 중, 파일 생성/오픈 요청이 성공한 경우만을 하이라이팅 하는 것을 보여준다.
이 정도로 간단한 경우에는 프로세스 모니터의 하이라이팅도 편리하지만 조금 더 복잡해지면 설정하는 것이 꽤나 귀찮고 색깔도 하나라서 눈도 아프다.
그래서 그런 경우에 나는 로그를 통째로 vim에 붙여넣은 뒤 vim을 통해 여러 색깔로 하이라이팅해서 보고는 한다.
이 방법에 관심이 있다면 아래 글을 참고하면 된다.
로그 뷰어로써의 Vim, 멀티 하이라이팅

프로세스 모니터로 캡쳐한 내용을 파일로 저장할 수도 있다.
보통 PML이나 CSV 형식 중 하나로 저장하는데, 나는 PML 포맷으로 저장해서 프로세스 모니터로 열어보는 것을 선호한다.
CSV로 저장한 뒤 엑셀 같은 프로그램으로 열어볼 수도 있다.

이 로그들을 처음부터 바로 파일로 저장할 수는 없을까 하는 생각이 들 수도 있다.
자신이 작성하고 있는 커널 쪽 코드에 오류가 있으면 블루스크린을 만나게 되거나, 시스템 전체가 멈춰버리는 경우가 생길 수 있는데 이런 경우 프로세스 모니터를 켜놓고 있어도 시스템이 꺼져버리는 등 로그가 날라가기 때문에 내가 지정한 파일로 저장한다면 유용할 수 있다.
이것은 File 메뉴의 Backing Files 옵션에서 설정 가능하다. 바로 밑에서 설명할 프로세스 모니터에 커스텀 로그 출력하는 방법과 함께 사용하면 더욱 도움이 될 것이다.

응용 프로그램이나 드라이버가 프로세스 모니터를 통해 자신들만의 로그 메세지를 출력하는 것도 가능하다.
이렇게 할 때의 장점은 여러가지가 있다.

  • 프로세스 모니터가 캡쳐하는 파일이나 레지스트리 작업들과 함께 내 커스텀 로그 메세지를 한 눈에 볼 수 있다.
    • 순서가 뒤죽박죽 되지 않도록 프로세스 모니터가 동기화까지 해준다.
    • 프로세스 모니터가 시간, 프로세스 이름, 쓰레드 번호 등의 부가 정보를 다 기록해주기 때문에 자신의 Logger에서 이런 것들을 구현할 필요가 없다.
  • 프로세스 모니터의 강력한 필터링과 하이라이팅 기능도 공짜로 이용할 수 있다.

프로세스 모니터로 커스텀 로그를 출력하는 자세한 방법은 아래 글에서 확인해볼 수 있다.
프로세스 모니터에 커스텀 로그를 쓰기

얼마전에 소개했던 filetest 프로그램과 프로세스 모니터는 환상의 짝궁이기도 하다.
filetest.exe 프로세스만을 캡쳐하도록 필터링해 놓은 뒤 원하는 I/O를 시도해보고 프로세스 모니터의 반응을 살펴보면 파일 시스템이 어떻게 동작하는지 쉽게 배울 수 있다.

프로세스 모니터 사용이 익숙해질수록 어떤 문제든지 밝혀낼 수 있다는 자신감이 생기게 된다.

함께 읽으면 좋은 글: