프로세스의 핸들 수가 많이 증가 되었거나 시스템에 커널 메모리 사용량이 많이 올라가면 어떤 핸들이 많이 사용되었는지 확인해야 합니다.

일반적으로 우리가 핸들 수를 확인하는 방식은 아래와 같습니다.


1. 작업 관리자를 열어서 세부정보나 프로세스 탭에서 "열 선택"을 한 후 핸들을 선택해서 각 프로세스의 핸들 수를 확인

2. Process Explorer를 실행해서 해당 프로세스를 선택한 후 View - Lower Pane View - Handles 를 선택해서 어떤 핸들이 있는지 확인.


그런데 이 방법을 사용하면 해당 프로세스에 핸들이 많다는 것은 확인할 수 있는데 어떤 종류의 핸들이 많이 있는지는 확인하기 힘듭니다.

이 경우에 사용할 수 있는 것이 명령 줄에서 사용할 수 있는 handle.exe 입니다.

Handle v4.11

https://docs.microsoft.com/ko-kr/sysinternals/downloads/handle


사용 방법은 아래와 같습니다.

1. 시스템 전체의 핸들 수를 종류별로 알고 싶을 때

C:\Users\clust>handle -s

Nthandle v4.11 - Handle viewer
Copyright (C) 1997-2017 Mark Russinovich
Sysinternals - www.sysinternals.com

Handle type summary:
  <Unknown type>  : 272
  <Unknown type>  : 3
  <Unknown type>  : 2
  <Unknown type>  : 686
  <Unknown type>  : 24
  <Unknown type>  : 8
  <Unknown type>  : 11
  <Unknown type>  : 23
  <Unknown type>  : 17
  <Unknown type>  : 2
  <Unknown type>  : 7
  <Unknown type>  : 21730
  <Unknown type>  : 12
  <Unknown type>  : 1
  <Unknown type>  : 60
  <Unknown type>  : 8
  <Unknown type>  : 7
  ALPC Port       : 4317
  Desktop         : 209
  Directory       : 593
  DxgkSharedResource: 80
  DxgkSharedSyncObject: 3
  Event           : 24745
  File            : 6150
  IoCompletion    : 2893
  IoCompletionReserve: 206
  IRTimer         : 1452
  Job             : 264
  Key             : 8033
  Mutant          : 2661
  Process         : 2565
  Section         : 4447
  Semaphore       : 5817
  Thread          : 4827
  Timer           : 816
  Token           : 1423
  TpWorkerFactory : 715
  UserApcReserve  : 12
  WaitCompletionPacket: 6216
  WindowStation   : 386
  WmiGuid         : 44
Total handles: 101747


2. Process 의 핸들 수를 종류 별로 알고 싶을 때

C:\Users\clust>handle -s -p notepad

Nthandle v4.11 - Handle viewer
Copyright (C) 1997-2017 Mark Russinovich
Sysinternals - www.sysinternals.com

Handle type summary:
  <Unknown type>  : 110
  ALPC Port       : 10
  Desktop         : 1
  Directory       : 2
  Event           : 32
  File            : 10
  IoCompletion    : 3
  IoCompletionReserve: 1
  IRTimer         : 4
  Key             : 22
  Mutant          : 4
  Section         : 8
  Semaphore       : 18
  Thread          : 6
  Timer           : 2
  TpWorkerFactory : 2
  WaitCompletionPacket: 12
  WindowStation   : 2
Total handles: 249


3. 프로세스 별로 핸들의 자세한 정보를 알고자 할때

C:\Users\clust>handle -u

Nthandle v4.11 - Handle viewer
Copyright (C) 1997-2017 Mark Russinovich
Sysinternals - www.sysinternals.com

------------------------------------------------------------------------------
System pid: 4 \<unable to open process>
------------------------------------------------------------------------------
smss.exe pid: 536 \<unable to open process>
------------------------------------------------------------------------------
csrss.exe pid: 796 \<unable to open process>
------------------------------------------------------------------------------

...

...

------------------------------------------------------------------------------
sihost.exe pid: 1092 CLUSTALEEY700\clust
   40: File          C:\Windows\System32
  16C: File          C:\Windows\Registration\R00000000000d.clb
------------------------------------------------------------------------------
svchost.exe pid: 13964 CLUSTALEEY700\clust
   44: File          C:\Windows\System32
  280: File          C:\Windows\Registration\R00000000000d.clb
  4E8: File          C:\Windows\System32\ko-KR\winnlsres.dll.mui
  634: File          C:\Users\clust\AppData\Local\ConnectedDevicesPlatform\908b443ce4ed0b0c\ActivitiesCache.db
  638: File          C:\Users\clust\AppData\Local\ConnectedDevicesPlatform\908b443ce4ed0b0c\ActivitiesCache.db-wal
  63C: File          C:\Users\clust\AppData\Local\ConnectedDevicesPlatform\908b443ce4ed0b0c\ActivitiesCache.db-shm






Windows Server 2003이 EOS 된 후 Technet 과 MSDN에 유지되던 이전 Windows 관련 문서들이 언젠가부터 사이트에서 사라지고 PDF 파일로 받게 변경되었었습니다. 문제는 PDF 파일이 엄청 커서 웹에서 보는 것 만큼 편하게 보기 힘들다는 것이었고 마이크로소프트의 정책 변경에 아쉬워했던 것이 사실 입니다.

Windows 문서의 경우 Windows 2000, 2003 에서 개발되어 해당 버전의 문서에서 내부 인터널한 내용을 많이 다룬 모듈들은 더 이상 새로운 버전의 문서에서 인터널한 내용을 다루지 않고 새로 추가된 기능만 설명하기 때문에 이전 버전의 문서를 손쉽게 검색해서 볼 수 없다는 것에 아쉬움이 많았습니다.


하지만 어제 마이크로소프트 PM인 Ned 의 트위터 좋은 소식이 들려 왔습니다.

Windows previous versions documentation

https://docs.microsoft.com/en-us/previous-versions/windows/


자그마치 Windows 2000 부터 문서가 등록되어 있습니다. 



WinDbg를 사용한 디버깅을 강의할 일이 있었는데 Release 한 제품에 대한 디버깅을 위해서 Symbol 서버를 구축해야 한다는 말씀들 드렸더니 SymStore 사용법이나 IIS 를 이용한 HTTP 기반의 Symbol server 구축에 대한 가이드가 있으면 좋겠다는 의견이 있어 이 블로그를 작성 하였습니다.

물론 저는 한번 구현해보는 수준으로 해본 것으로 실제 상용 제품의 Symbol Server를 구축 하시려고 하면 좀 더 고려할 것이 많을 것으로 보입니다.


SymStore 란?

SymStore는 심볼 저장소를 만드는 도구로 Debugging Tools for Windows 패키지에 포함되어 있습니다.
SymStore는 이미지의 타임 스탬프와 이미지 크기 또는 서명과 PDB 파일을 기간에 따라서 심볼을 찾을 수 있도록 심볼 파일을 보관 합니다.
SymStore를 사용하면 모든 심볼을 하나의 서버에 보관할 수 있으며 해당 제품이나 모듈에 대한 지식이 없이도 디버거가 심볼을 검색할 수 있습니다.
하지만 public 심볼과 private 실볼은 동일한 서명과 파일의 기간이 동일하기 때문에 동일한 서버에 보관할 수 없습니다.


SymStore 트랜잭션
SymStore은 add와 delete 라는 두 개의 트랜잭션이 있습니다.
심볼 저장소가 만들어지만 심볼 저장소로 사용되는 파일 서버의 파일 공유 루트에 000admin 이라는 폴더가 만들어지고 트랜잭션을 기록하는 파일이 트랜잭션당 하나 만들어 지고 Server.txt와 History.txt 파일이 만들어 집니다. Server.txt에는 현재 서버에 있는 모든 트랜잭션 목록이 들어 있고 History.txt에는 모든 트랜잭션의 기록이 시간순으로 있습니다.

add와 del 옵션을 사용해서 트랜잭션을 수행 합니다. /p 옵션을 사용하면 실제 파일이 추가되는 것이 아니고 파일에 대한 포인터가 추가된다고 하는데 별도의 심볼 서버를 운영하는 것이 더 간편하다고 생각되어 /p는 사용하지 않는게 나을 것으로 보입니다.

심볼 저장소를 만들 때 인덱스 파일과 실제 저장소를 나누어서 만들 수 있다고 되어 있으나 관리에 문제가 있으니 하나로 관리 하는 것이 더 좋다고 생각 됩니다. 대신 심볼 서버를 주기적으로 백업해주는 것이 좋을 것으로 생각 됩니다.

그리고 SymStore는 여러 사용자가 동시에 트랜잭션을 실행하는 것을 지원하지 않으므로 일일 빌드 또는 제품 출시를 위한 빌드에서 한 번만 수행하는 것이 좋습니다.


트랜잭션 예제
심볼 파일을 심볼 스토어에 추가하는 것은 아래와 같은 명령을 사용 합니다. MyApp 이라는 빌드 서버의 공유 폴더에서 심볼을 가져오는 것으로 되어 있는데 심볼 파일이 있는 경로에서 Symstore를 실행한다면 .\ 와 같은 경로를 지정할 수도 있습니다.
symstore add /r /f \\Myapp\appserver\x64\Release /s \\MySymServer\symsrv /t "My Application" /v "Build 001" /c "New Build"

트랜잭션을 삭제하는 것은 아래와 같이 트랜잭션 번호를 주어서 삭제할 수 있습니다.
symstore del /i 0000000001 /s \\MySymServer\symsrv

몇번 트랜잭션을 추가, 삭제 하였더니 아래와 같은 기록이 남았습니다.

Server.txt
0000000006,add,file,03/04/2018,16:34:40,"CreateProcess","1.0","The first build",

History.txt
0000000001,add,file,03/03/2018,15:46:26,"title","version","comment",
0000000002,add,file,03/03/2018,15:51:02,"title","version","comment",
0000000003,add,file,03/04/2018,16:15:24,"title","version info","comment",
0000000004,del,0000000001
0000000005,del,0000000002
0000000006,add,file,03/04/2018,16:34:40,"My Application","Build 001","New build",
0000000007,del,0000000003

그리고 0000000001 트랜잭션 파일에는 아래와 같이 기록이 남아 있습니다.
"appserver.exe\5A5ADF8B4f000","D:\MyApp\appserver\Release\appserver.exe"
"appserver.pdb\DAE2D118C40348C4981D98DF6D249C046","D:\MyApp\appserver\Release\appserver.pdb"


심볼 스토리지 포맷
Symstore는 파일 시스템 자체를 데이터베이스로 사용합니다. 심볼 파일 타임 스탬프, 서명, 파일 기간 그리고 다른 데이터를 사용하여 폴더 이름을 만들어서 관리 합니다.
아래 예는 SymStore 설명에 있는 예제 입니다.
Directory of \\mybuilds\symsrv\acpi.dbg
10/06/1999  05:46p      <DIR>          .
10/06/1999  05:46p      <DIR>          ..
10/04/1999  01:54p      <DIR>          37cdb03962040
10/04/1999  01:49p      <DIR>          37cdb04027740
10/04/1999  12:56p      <DIR>          37e3eb1c62060
10/04/1999  12:51p      <DIR>          37e3ebcc27760


심볼 파일은 SRV*c:\symbols*\\mybuilds\symsrv 와 같이 설정해주면 됩니다.


Web 기반 Symbol 서버 구축
1. Windows Server 2012 Standard 설치
2. IIS 설치
  2.1 Server Manager를 실행 한 후 우측 상단의 Manage - Add Roles and Features - Next - Next - Next - Web Server (IIS) - Web Server 선택 후
      Management Tools 에서 IIS Management Script and Tools 선택 하여 설치
  2.2 Web Server (IIS) - Web Server - Security - Windows Authentication 선택하여 설치
3. Server Manager에서 Tools 를 선택 후 Innetnet Information service (IIS) Manager 실행
4. C:\Symbols 폴더 만들기
5. 서버명 - sites - Default Web Site에서 오른쪽 마우스 클릭하여 Add Virtual Directory 선택 후 Alias 에 Symbols 입력하고 Path에 c:\Symbols 입력하고 OK
6. 서버명을 클릭한 후 가운데 Management 아래에 있는 Configuration Editor 더블 클릭
7. Section 에서 system.applicationHost - sites 선택 후 virtualDirectoryDefaults - allowSubDirConfig 를 False 로 변경
8. 서버명 - Sites - Default Web Site - Symbols 를 클릭한 후 IIS 아래에 있는 Directory Browsing 을 더블 클릭 한 후 Enable 선택
9. Default Web Site 를 클릭한 후 MIME Types 를 더블 클릭한 후 add 를 클릭하고 File name extension에 .* 룰 입력하고 MIME type에 application/octet-stream 입력하고
10. 서버명 - Sites - Default Web Site - Symbols 로 이동한 후 Authentication 더블 클릭후 Windows Authentication 만 Enable 하고 나머지는 Disable 함
   (만약 Windows Authentication이 없으면 2.2 과정에서 추가가 안 된 것임)
  10.1 Authentication - Windows Authentication 선택 후 우측의 Providers 선택한 후 Negotiate 를 선택 후 Remove 선택


WinDbg 설정
1. 인증을 처리할 수 있도록 prompts 설정합니다.
   !sym prompts on
2. 심볼 서버를 설정합니다.
  .sympath srv*c:\Mysymbols*http://192.168.1.51/sym;srv*c:\OSsymbols*https://msdl.microsoft.com/download/symbols


참고
Using SymStore
https://msdn.microsoft.com/en-us/library/windows/desktop/ms681417(v=vs.85).aspx

SymStore Command-Line Options
https://msdn.microsoft.com/en-us/library/windows/desktop/ms681378(v=vs.85).aspx

HTTP Symbol Stores
https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/http-symbol-stores

'Debugging' 카테고리의 다른 글

Windows Server 2003 BugCheck 0x7E  (0) 2019.01.26
System Hang 분석  (0) 2018.11.24
[디버거 명령]!Mex.p  (0) 2017.09.25
[디버깅 명령]!mex.help  (0) 2017.09.24

+ Recent posts