메모리 풀 모니터(Poolmon.exe)를 사용하여 커널 모드 메모리 누수 문제를 해결하는 방법

Posted by 빵빵빵
2014/02/21 14:38 전산(컴퓨터)/PC-Windows



메모리 풀 모니터(Poolmon.exe)를 사용하여 커널 모드 메모리 누수 문제를 해결하는 방법

출처 : http://support.microsoft.com/kb/177415/ko

알림 Windows XP 사용자를 위한 중요 알림: Windows에 대한 보안 업데이트를 계속 받으려면 Windows XP SP3(서비스 팩 3)을 실행해야 합니다. 서비스 팩 3을 포함하는 Windows XP에 대한 지원이 2014년 4월 8일 중단됩니다. 지원이 중단된 이후에 SP3(서비스 팩 3)을 포함하는 Windows XP를 실행하는 경우, Windows에 대한 모든 중요한 보안 업데이트를 받으려면 Windows 8과 같은 최신 버전으로 업그레이드해야 합니다.

자세한 내용은 Windows 일부 버전에 대한 지원 중단을 참조하십시오.

태그 모드 설정

PoolMon을 실행하기 전에 풀 태그를 설정한 다음 컴퓨터를 다시 시작해야 합니다. 풀 태그 기능은 메모리 할당의 태그 값에 따라 정렬된 풀 메모리에 대한 통계를 수집하고 계산합니다.

참고 Windows Server 2003에서는 풀 태그 기능이 기본적으로 설정되므로 따로 설정할 필요가 없습니다.

Windows NT 4.0 기반, Windows 2000 기반 또는 Windows XP 기반 컴퓨터에서 풀 태그 기능을 설정하려면 다음 방법 중 하나를 사용하십시오.

방법 1: 레지스트리 편집

경고: 레지스트리 편집기를 잘못 사용하면 심각한 문제가 발생할 수 있으며 문제를 해결하기 위해 운영 체제를 다시 설치해야 할 수도 있습니다. Microsoft는 레지스트리 편집기를 잘못 사용함으로써 발생하는 문제에 대해 해결을 보증하지 않습니다. 레지스트리 편집기의 사용에 따른 모든 책임은 사용자에게 있습니다.

Poolmon.exe의 태그 모드를 설정하는 레지스트리 값을 변경하려면 다음과 같이 하십시오.
  1. 레지스트리 편집기를 실행합니다.
  2. 다음 레지스트리 키를 찾습니다.
    HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager
  3. GlobalFlag의 값을 적어 두거나
    Session Manager
    키를 저장합니다.
  4. 오른쪽 창에 있는 GlobalFlag 값을 두 번 누릅니다.
  5. 값을 16진수 0x00000400으로 변경합니다.

    참고 글로벌 플래그 값 0x00000400을 추가하는 경우 값이 추가된 후에는 0x400만 표시됩니다. 선행 0을 모두 추가해야 합니다. 그렇지 않으면 일부 Poolmon 정보가 출력 화면에 표시되지 않습니다.
  6. 컴퓨터를 다시 시작합니다.
참고 디버깅이 완료되었으면 GlobalFlag 값을 3단계에서 적어 둔 원래 값으로 다시 변경합니다.

방법 2: Gflags.exe 유틸리티 사용

글 로벌 플래그 편집기(Gflags.exe) 유틸리티를 사용하여 풀 태그 기능을 설정할 수도 있습니다. Gflags.exe는 Windows NT 4.0 Resource Kit 및 Windows 2000, Windows XP, Windows Server 2003 CD-ROM의 \Support\Tools 폴더에서 사용할 수 있습니다.

참고 Windows Server 2003에서는 풀 태그 기능이 영구적으로 설정되어 있기 때문에 Global Flags 대화 상자의 Enable Pool Tagging 확인란이 흐리게 나타나며 풀 태그 기능을 설정하거나 해제하는 명령이 실패합니다.

Gflags.exe를 사용하여 변경하려면 다음 단계를 수행하십시오.
  1. 시작, 실행을 차례로 누르고 gflags.exe를 입력한 다음 확인을 누릅니다.
  2. Enable Pool Tagging을 선택합니다.
  3. Apply를 누른 다음 OK를 누릅니다.
  4. 컴퓨터를 다시 시작합니다.
참고 디버깅이 완료되면 위의 단계를 반복하여 풀 태그 기능을 해제하십시오.

Poolmon을 사용하여 정보 수집

PoolMon은 명령 창 내에 풀 태그 정보를 표시합니다. 도구에서 반환된 모든 태그 정보를 표시하려면 화살표 키나 PAGE UP 및 PAGE DOWN 키를 사용하십시오.

Poolmon.exe 는 Windows NT 4.0 Resource Kit 및 Windows 2000, Windows XP, Windows Server 2003 CD-ROM의 \Support\Tools 폴더에서 사용할 수 있습니다.

다음 단계를 사용하여 태그 정보를 복사하고 저장합니다. 15분 간격으로 2시간 동안 이 단계를 반복합니다. 각 업데이트를 메모장 파일 끝에 추가합니다.
  1. 시작을 누르고 설정을 가리키고 제어판을 누른 다음 콘솔을 두 번 누릅니다.

    참고 Windows 2000의 경우 다음 단계를 수행해야 합니다.
    1. 시작, 실행을 차례로 누르고 cmd를 입력한 다음 확인을 누릅니다.
    2. 제목 표시줄을 마우스 오른쪽 단추로 누른 다음 등록 정보를 누릅니다.
  2. 옵션 탭을 누르고 빠른 편집 모드를 누른 다음 삽입 모드를 누릅니다.
  3. 레이아웃 탭을 누르고 화면 버퍼 크기 값을 99로 변경한 다음 확인을 누릅니다.
  4. 시작을 누르고 프로그램을 가리킨 다음 명령 프롬프트를 누릅니다.
  5. Windows NT 4.0 CD의 Support\Debug\platform 폴더에서 Poolmon.exe를 찾습니다. Poolmon.exe가 있는 드라이브와 폴더로 변경합니다. Windows 2000 CD에서는 Poolmon.exe가 Support.CAB 파일에 있습니다. Support.CAB은 \Support\Tools 폴더 아래 있습니다.
  6. Poolmon.exe를 입력합니다.
  7. Poolmon에 두 번째 열 "type"이 표시되고 값 paged가 표시될 때까지 P 키를 누릅니다.
  8. B 키를 눌러 열을 높은 값에서 낮은 값으로 정렬합니다.
  9. 전체 화면 내용을 선택한 다음 Enter 키를 누릅니다.
  10. 시작을 누르고 프로그램, 보조프로그램을 가리킨 다음 메모장을 누릅니다.
  11. 편집 메뉴에서 붙여넣기를 누릅니다.
  12. 7단계를 반복하여 값 nonpaged를 찾습니다.
  13. 8단계 - 11단계를 반복하여 붙여넣습니다.
Poolmon.exe에는 출력을 정렬하는 몇 가지 명령 키도 있습니다. 아래에서 설명하는 문자를 눌러 작업을 수행합니다. 각 명령이 작동하는 데 몇 초 정도 걸립니다. 다음은 몇 가지 명령 목록입니다.
P - 태그 목록을 페이징, 비페이징 또는 혼합 순으로 정렬합니다. P 키를 누르면 각 옵션이 순환됩니다.
B - 최대 바이트 사용 순으로 태그를 정렬합니다.
M - 최대 바이트 할당 순으로 태그를 정렬합니다.
T - 영문 태그 이름 순으로 태그를 정렬합니다.
E - 페이징, 비페이징 합계를 맨 아래에 표시합니다. 순환합니다.
A - 할당 크기 순으로 태그를 정렬합니다.
F - "frees" 순으로 태그를 정렬합니다.
S - allocs와 frees의 차이 순으로 태그를 정렬합니다.
E - 페이징, 비페이징 합계를 맨 아래에 표시합니다. 순환합니다.
Q - 종료합니다.
자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
298102 다른 공급업체 드라이버가 사용하는 풀 태그를 찾는 방법




Microsoft 제품 관련 기술 전문가들과 온라인으로 정보를 교환하시려면 Microsoft 뉴스 그룹에 참여하시기 바랍니다.

기술 자료: 177415 - 마지막 검토: 2011년 5월 14일 토요일 - 수정: 6.0
2014/02/21 14:38 2014/02/21 14:38

메모리 릭 체크 프로그램

Posted by 빵빵빵
2014/02/19 12:56 전산(컴퓨터)/PC-Windows



출처 : http://skmagic.tistory.com/entry/%EB%A9%94%EB%AA%A8%EB%A6%AC%EB%A6%AD-%EC%B0%BE%EA%B8%B0Visual-Leak-Detector 1.메모리릭(memory leak) == 메모리 누수 초기화되어있지 않고 사용되지 않는 메모리 즉 메모리가 새는 현상. 메모리가 낭비되는 현상을 말합니다. 프로그래머가 메모리 할당을 해둔채 해지를 하지않을경우 발생을하게됩니다. 이러한 메모리 조각들은 ram의 영역을 차지하게되어 시스템의 전반적인 성능을 감소시킵니다. 메모리가 새는 현상. 메모리가 낭비되는 현상을 말합니다. 메모리는 한정적인데 프로그램적인 실수로 어떤 동작을 할때 메모리가 낭비가 된다면, 그리고 그 동작이 반복된다면 나중에는 성능적인 손실이 오겠죠. -------------------------------------------------------------------------------- 2.비쥬얼 2008에서 메모리릭 검출하는법 프로그램개발을 시작할때, 메모리릭을 검출할수있는 상태로 만들어 두는것이 좋다. 그중 여기에서는 Visual Leak Detector를 사용한다. 무료이고, VS2008에서 WinApi나 MFC환경에서 잘동작한다. XP32환경에서는 1.9h(Beta), 1.0은 잘동작했지만, Vista64환경에서는 1.0만 잘동작하였다. XP32환경이라면, 1.9h를 권한다. #XP32비트 사용자 1. 1.9h 다운로드 2. 1.9h 설치 3. 1.9h 라이브러리 등록 #XP32비트, Vista64비트등 모든 사용자 4. 1.0 다운로드 5. 1.0 압축풀기 6. 1.0 라이브러리 등록 #공통 7. 영문경로로 옮기기 8. 코드에 포함시키기 9. 메모리릭 찾기 10. 현실적인 제안 #XP32비트 사용자 1. 1.9h 다운로드 http://dmoulding.googlepages.com/vld-1.9h-setup.exe 2. 1.9h 설치 Next, Next, Next 3. 1.9h 라이브러리 등록 도구:옵션프로젝트 및 솔루션:VC++ 디렉터리:다음 파일의 디렉터리 표시 포함파일에 C:\Program Files\Visual Leak Detector\include 라이브러리 파일에 C:\Program Files\Visual Leak Detector\lib 를 등록하고 확인을 누른다. #XP32비트, Vista64비트등 모든 사용자 4. 1.0 다운로드 http://dmoulding.googlepages.com/vld-10.zip 5. 1.0 압축풀기 C:\Program Files\Visual Leak Detector에 압축을 푼다. 6. 1.0 라이브러리 등록 도구:옵션프로젝트 및 솔루션:VC++ 디렉터리:다음 파일의 디렉터리 표시 포함파일에 C:\Program Files\Visual Leak Detector 라이브러리 파일에 C:\Program Files\Visual Leak Detector 를 등록하고 확인을 누른다. #공통 7. 영문경로로 옮기기 프로그램소스경로에 한글이 포함되어있으면, 메모리릭이 난 파일을 표시하지 못한다. 경로를 영문으로 수정하던지, 옮긴다. 8. 코드에 포함시키기 stdafx.h파일의 가장 하단에 #include "vld.h"를 넣는다. 다른것을 추가시키더라도, #include "vld.h"위에 위에 놓아야 한다. 9. 메모리릭 찾기 F5를 누르고, 프로그램을 종료하면, 출력창에 메모리릭을 보여준다. 그것을 클릭하면, 메모리릭이 발생한 지점으로 이동해준다. 그리고, 정상적으로 해제해주는 코드를 넣는다. 만약, 메모리릭이 일어났다고 나오지만, 릭이 일어난지점을 표시해주지 못할경우 dbghelp.dll파일을 디버그의 실행파일이 있는곳에 둔다. 10. 현실적인 제안 Visual Leak Detector를 사용하면 디버그모드가 많이 느려진다. _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); 사용시에는, 이것만 켜놓고, 메모리릭발생이 뜨면, 그때 Visual Leak Detector를 활성화한다.
2014/02/19 12:56 2014/02/19 12:56

Ubuntu + Marven + Sonar + MySQL + Jenkins 로 협업환경 구축

Posted by 빵빵빵
2014/02/14 13:59 전산(컴퓨터)



Sonar 설치 + Jenkins 연동(2013/06/09) : http://www.sjune.net/archives/1577 

지속적인 소스코드 품질 관리에 필요한 오픈 소스 플랫폼 Sonar를 설치해보고, Sonar를 Jenkins와 연동하여 Maven 프로젝트를 분석해본다. 설치 테스트 환경은 아래와 같다.

  • ubuntu v12.04 LTS
  • maven v3.0.4
  • jenkins v1.517
  • mysql v5.5.31
  • sonar v3.5.1

1. Sonar 설치

직접 소스를 다운로드 받아 설치해도 되지만 본 글에서는 우분투의 apt-get 명령어를 이용하여 설치한다.
Sonar 패키지는 기본적으로 데비안 저장소에 포함되어있지 않으므로 /etc/apt/sources.list 파일에 아래 내용을 추가한다.

$ sudo vi /etc/apt/sources.list
deb http://downloads.sourceforge.net/project/sonar-pkg/deb binary/


그리고 apt-get을 이용하여 sonar 패키지를 설치한다.

 
$ sudo apt-get update
$ sudo apt-get install sonar

/opt/sonar 경로에 설치되며 init.d에도 등록된다. sonar 를 구동한다.

 
$ sudo service sonar start

http://localhost:9000 에 접근해서 sonar 서버가 구동하는지 확인한다. 설치 후 기본 계정 정보는 admin/admin 이다.

sonar

2. MySQL 연동

Sonar을 사용하기 위한 mysql 설정을 한다. database를 생성하고 사용자 권한을 부여한다.

 
CREATE DATABASE sonar DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
GRANT ALL PRIVILEGES on  sonar.*  to 'sonar'@'localhost' IDENTIFIED BY 'sonar' WITH GRANT OPTION;
flush privileges;

다음은 sonar.properties 에서 sonar 호스트 서버 정보와 mysql접속에 필요한 정보를 수정한다.

 
$ sudo vi /opt/sonar/conf/sonar.properties

아래 내용처럼 Mysql연동에 필요한 주석을 해제하거나 추가한다.

 
# Listen host/port and context path (for example / or /sonar). Default values are 0.0.0.0:9000/.
sonar.web.host:                           0.0.0.0
sonar.web.port:                           9000
sonar.web.context:                        /
 
 
# Permissions to create tables and indexes must be granted to JDBC user.
# The schema must be created first.
sonar.jdbc.username:                       sonar
sonar.jdbc.password:                       sonar
 
 
#----- MySQL 5.x
# Comment the embedded database and uncomment the following line to use MySQL
 
# Optional properties
sonar.jdbc.driverClassName:                com.mysql.jdbc.Driver
sonar.jdbc.validationQuery:                select 1


저장 후 sonar 데몬을 재시작한다. 재시작하면 Started sonar.라고 출력되지만 초기화 작업 때문에 sonar 서버에 바로 접근이 안될 수 있다. 진행 상황을 확인하려면 tail -f 로 로그를 살펴본다.

 
$ sudo service sonar restart
Stopping sonar...
Stopped sonar.
Starting sonar...
Started sonar.
 
$ tail –f /opt/sonar/logs/sonar.log
STATUS | wrapper  | 2013/06/04 10:34:18 | --> Wrapper Started as Daemon
STATUS | wrapper  | 2013/06/04 10:34:18 | Launching a JVM...
INFO   | jvm 1    | 2013/06/04 10:34:19 | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org
INFO   | jvm 1    | 2013/06/04 10:34:19 |   Copyright 1999-2006 Tanuki Software, Inc.  All Rights Reserved.
INFO   | jvm 1    | 2013/06/04 10:34:19 |

Sonar가 정상적으로 구동된 후, mysql에서 테이블을 조회해보면 데이터가 입력된 것을 알 수 있다.

 
$ mysql -usonar –Dsonar -p
 
Enter password:
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 58
Server version: 5.5.29-0ubuntu0.12.04.2 (Ubuntu)
 
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
 
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
mysql> show tables;
+---------------------------+
| Tables_in_sonar           |
+---------------------------+
| action_plans              |
| action_plans_reviews      |
| active_dashboards         |
| widgets                   |
+---------------------------+
49 rows in set (0.01 sec)

3. Maven 설정

메이븐 프로젝트를 sonar로 분석하기 위해 환경 설정을 한다.
환경 설정 파일인 ${MAVEN_HOME}/conf/settings.xml 을 열어 아래처럼 profile 정보를 입력한다.

 
<profile>
    <id>sonar</id>
    <activation>
        <activeByDefault>true</activeByDefault>
    </activation>
    <properties>
        <sonar.jdbc.url>
        </sonar.jdbc.url>
        <sonar.jdbc.driver>com.mysql.jdbc.Driver</sonar.jdbc.driver>
        <sonar.jdbc.username>sonar</sonar.jdbc.username>
        <sonar.jdbc.password>sonar</sonar.jdbc.password>
        <sonar.host.url>http://localhost:9000</sonar.host.url>
    </properties>
</profile>

4. Jenkins 연동

이제 Sonar와 jenkins를 연동해본다.

1) Jenkins 관리 > 플러그인 관리에서 Sonar 플러그인을 설치한다.
sonar-jenkin1

2) Jenkins 관리 > 시스템 설정에서 Sonar를 추가한다. 설치 정보는 sonar.properties 파일을 참고해서 작성하면 된다.
sonar-jenkins2

3) 다음은 Jenkins Job에 Sonar를 trigger로 걸어준다.
Maven 프로젝트 > 설정 > Post-build Actions에서 sonar를 추가하고 아래처럼 설정한다.

sonar-jenkins3

4) 모든 설정이 완료 되었다. 마지막으로 해당 프로젝트에 가서 Build now를 해본다.
sonar-jenkis4

Build에 성공하면 sonar 서버에 해당 프로젝트가 분석되어 있는 것을 확인할 수 있다.
sonar-result


Reference

소나 소개 : http://www.swbank.kr/html/tools/toolsFile/Sonar_05_functionIntro.pdf

허드슨 + 소나 연동 : http://blog.naver.com/PostView.nhn?blogId=stonedragony&logNo=50101740211

[프로세스/관리]코드품질관리를 위한 젠킨스+Sonar 연동과 유닛테스트결과 리포팅 : http://bluepoet.me/2013/06/21/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EA%B4%80%EB%A6%AC%EC%BD%94%EB%93%9C%ED%92%88%EC%A7%88%EA%B4%80%EB%A6%AC%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%A0%A0%ED%82%A8%EC%8A%A4sonar-%EC%97%B0%EB%8F%99/

2014/02/14 13:59 2014/02/14 13:59