ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Minidump
    프로그래밍/프로그래밍 관련 2011. 4. 6. 18:59

    - 작성자:고리(goli81@naver.com) -

     

    Minidump

    개요:
    프로그램을 실행하다 보면 예상하지 못한 곳에서 충돌이 발생해 프로그램이
    다운되는 현상이 발생한다.
    이런 충돌을 해결하는 방법에는 여러가지가 있겠지만 이번에는 손쉽게 이를
    해결 할 수있는 Minidump라는 기능에 대해서 알아 보려고 한다.
    이 Minidump에 대해서 잘 모르는 사람이 있다면 무조건 끝까지 읽어라.
    내가 아는 한도에서 최고의 프로그램 충돌을 잡을수 있는 기능이다.


    장점:
    1. 정확한 충돌 위치를 확인 할 수 있다.
       Minidump기능을 우리가 만든 응용프로그램에 넣어두면 프로그램이 충돌로 인해서
       죽을경우 정확한 충돌 위치를 찾을 수 있다. 추가적으로 Callstack정보 까지
       알아 볼 수 있다.

    2. 충돌시 변수 값들이 확인 가능하다.
       프로그램이 충돌로 인해 죽었을 경우 보통 무엇으로 인해서 죽었는지 매우 궁금
       해 할 것이다. 보통 충돌 위치만 알고 어떤 값으로 인해서 죽었는지 궁금한 경우
       가 많은데 이럴 경우 Minidump를 사용하면 모든메모리 정보를 저장할 수도 있고
       그 함수 안에 있는 로컬 변수에 값들을 확인 할 수 있다.

    3. 소스가 간결해진다.
       보통 충돌위치를 알아내기 위해서 try catch를 사용하는데 이것또한 여러소스에
       코딩을 해 둘려면 여간 귀찮은 일이 아니다. Minidump는 제일 처음에 한번만
       등록을 하면 더이상 소스코드 부분에 신경을 쓸 필요가 없다.

     

    단계진행방향:
    1. SetUnhandledExceptionFilter로 충돌 위치 정보얻기
    2. MiniDumpWirteDump로 덤프파일(dmp)생성
    3. 덤프파일의 종류
    4. 생성된 덤프파일 디버깅
    5. Minidump기능 확장
       1) FTP로 덤프파일 관리
       2) Memory Snapshot
       3) 추가 내용 기록

     

    단계세부설명:


    1. SetUnhandledExceptionFilter로 충돌 위치 정보얻기
       SetUnhandledExceptionFilter함수는 처리되지 않은 예외가 발생할때 
       호출되는 처리되지 않은 예외 필터 함수를 지정할 수 있게 해준다.
       쉽게말해 예외처리를 하지 않은 부분에서 예외가 발생했을 경우 
       이함수가 지정한 곳으로 충돌정보들이 들어오게 되는 것을 의미한다.
       사용법은 아래와 같습니다.
       SetUnhandledExceptionFilter(TopLevelFilter);

       자세한 내용은 MSDN참고:
       http://msdn.microsoft.com/library/default.asp?url=/library/en-us/debug/base/setunhandledexceptionfilter.asp

     

    2. MiniDumpWirteDump로 덤프파일(dmp)생성
       먼저 MiniDump의 기능을 사용하기 위해서는 DBGHELP.DLL 파일이 필요합니다.
       Debugging Tools for Windows에 포함되어 있습니다. MiniDumpWriteDump기능을
       사용하기 위해서는 DBGHELP.DLL이 5.1이후 버젼부터 지원을 받을 수 있습니다.
       MiniDumpWirteDump를 실행시키면 MiniDump파일을 생성하게 됩니다.
       사용법은 아래와 같습니다.
       HANDLE hProcess = GetCurrentProcess();
       DWORD dwProcessID = GetCurrentProcessId();
       DWORD dwThreadID = GetCurrentThreadId();
       MINIDUMP_EXCEPTION_INFORMATION sExceptionInfo;
       sExceptionInfo.ThreadId = dwThreadID;
       sExceptionInfo.ExceptionPointers = pException;
       sExceptionInfo.ClientPointers = FALSE;
       if( pMiniDumpWriteDump( hProcess, dwProcessID, hFile, MiniDumpNormal, 
          &sExceptionInfo, NULL, NULL) )
       {
          lResult = EXCEPTION_EXECUTE_HANDLER;
       }


       Download the Debugging Tools for Windows:
       http://www.microsoft.com/whdc/devtools/debugging/installx86.mspx

     

    3. 덤프파일의 종류
       덤프파일을 만들때에도 여러가지 종류로 나누어져 생성 할 수 있다. 위의
       사용법에서 4번째 인자에 그 종류가 들어가게 된다. 나는 2가지를 자주 사용을
       하는데 MiniDumpNormal와 MiniDumpWithFullMemory 덤프이다.
       MiniDumpNormal은 함수의 로컬레지스터 값을 포함해서 덤프를 하고
       MiniDumpWithFullMemory는 전체 메모리 값을 포함하여 덤프를 하게 된다.
       나머지 옵션에 대해서는 MSDN에 자세히 나와있다.
       http://msdn.microsoft.com/library/default.asp?url=/library/en-us/debug/base/minidump_type.asp

     

    4. 생성된 덤프파일 디버깅
       덤프파일(dmp)이 생성이되면 VS .NET이 설치되어 있다면 더블클릭만으로 덤프파일을
       열수 있습니다. 덤프파일을 열고 실행(F5)을 시키면 정확한 충돌위치의 소스코드로
       이동하여 충돌한 위치를 알 수 있다. 아래 그림 참조



    조사식에 죽었을 때 당시 i값을 찍어 볼수도 있고 nTemp의 값도 확인 할 수 있다.
       하지만 m_nTemp값은 여기서는 확인 할 수 없는데 그건 minidump를 Normal형식으로 
       덤프를 했기 때문에 로컬 변수에 대해서만 값을 저장하기 때문입니다. FullMemory 
       방식으로 메모리를 저장했다면 덤프 용량은 커지지만 예외처리가 발생했을 때 당시의
       메모리 값들을 전부 저장하게 됩니다.그리고 오른쪽에 호출스택에서 어떤 경로를 
       통해서 프로그램이 죽게 되었는지 확인 할 수 있습니다.
     
    5. Minidump기능 확장
       1) FTP로 덤프파일 관리
          덤프파일이 생성이 되면 보통 사용자 컴퓨터에 정보가 남게 된다. 이 정보를
          서비스를 하는 회사에서 받아야지 디버그를 할 수 있기때문에 어떤 수단을
          통해서든 받아야 할 것이다. 메일을 통해서든 이동식 디크스를 통해서든 받을 수
          있지만 가장 사용자들에게 쉬운 방법은 Window에서 사용 하는 방식처럼 사용자의
          동의를 구하고 파일을 FTP로 전송을 하면 되겠다.
          
       2) Memory Snapshot
          가짜 충돌상황을 발생시켜 덤프파일을 생성시키는 기능이다. 예를들어
          서버 프로그램 서비스 도중 메모리 값에 문제가 생겼을 경우 디버깅을 하고 싶은
          충동을 많이 느끼게 되는데 이럴 때 서버에 VS .NET을 깔고 디버그 모드로
          돌리는 경우를 보았다. ㅡ,.ㅡ 어디 소개시켜주기도 힘든 디버그 방식이다 ^^
          이럴때 Memory Snapshot을 활용하여 가짜 예외처리 상황을 만들어
          덤프파일을 생성하게 한다. 그러면 서버는 브레이크를 걸지 않고 서버 상태를
          점검 할 수 있게 된다. 단점은 서버가 사용하는 메모리 용량이 300M인 경우 
          300M를 파일 행태로 다 복사를 해야 하기 때문에 5~10초 정도에 시간이 소요되게
          될 것이다.
     
       3) 추가 내용 기록
          pMiniDumpWriteDump의 6번째 인자를 보면 MINIDUMP_USER_STREAM_INFORMATION
          이라는 정보를 입력 할 수 있다. 구조체 이름 그대로 유저정보를 입력 할 수 있는
          공이다. 여기에 사용자 동의를 구하고 사용자 컴퓨터의 메모리 상태라던지
          그래픽카드 정보를 추가적으로 입력하면 하드웨어에 따른 컴퓨터 오류를 보다
          쉽게 해결 할 수 있을 것이다. 나 같은 경우에는 여기에 화면 리스토어로 리소스
          복구가 일어났을 경우와 사용자의 각각의 이동경로를 히스토리로 기억해서 어떤 경로
          를 통해서 이동하다가 프로그램 오류를 일으켰는지와 마지막 받은 패킷 메세지 번호를
          기억하여 어떤 패킷을 받고 그 패킷 처리 후 죽었다는 정보를 추가적으로 남겨서
          사용자이 여러 정황에 대해서 상세하게 파악하는데 많은 도움을 받았다.
     
    충돌발생시 화면:



    위에 Editbox는 사용자가 생각하는 버그 발생경로를 적는 곳이다. 대부분 적지 않겠지만 100명
    중 한명이라도 적어준다면 버그를 잡는데 훨씬 도움이 될것이다.
    아래에 정보는 사용자 컴퓨터정보를 추가적으로 기록한 데이타이다. 저런 내용을 보여주지 않고
    보내도 되겠지만 혹시나 잘못걸리면 분명 불법적인 일인것은 확실한것 같으니...^^

    차후에 소스도 함께 올리도록 하겠다.



    출처 - http://blog.naver.com/goli81

    댓글