본문 바로가기
Study/Etc

Windbg Memory leak detect

by 뿡뿡대마왕 2021. 5. 21.
반응형

발취: https://www.programmersought.com/article/16174103580/

 

Windbg debug c++ memory leak - Programmer Sought

C++ memory leak problem location Memory leak refers to the leak problem caused by directly operating the memory allocation constructor (such as new, malloc, HeapAlloc) to obtain heap memory, but not releasing it. Our market server is an application that ru

www.programmersought.com

windbg를 통해 memory leak을 찾아볼 수 있는 포스터가 있어 이를 가져왔다.

간략하게 영문을 번역하면 아래 내용과 같다.

C ++ 메모리 누수 문제 위치

메모리 누수는 메모리 할당 생성자 (예 : new, malloc, HeapAlloc)를 직접 작동하여 힙 메모리를 얻지 만 해제하지 않아 발생하는 누수 문제를 의미합니다. 우리 마켓 서버는 클라이언트 서버에서 오랫동안 실행되는 애플리케이션입니다. 메모리 누수가 발생하면 메모리가 특정 값까지 커지면 메모리 부족으로 인해 프로그램이 중단 되었더라도 시장 서비스 프로그램에 영향을 미칠 때까지 현재 시스템의 성능에 큰 영향을 미칩니다. 따라서 메모리 누수 문제에 대한 기본적인 디버깅 기술을 습득해야합니다. 이 기사에서는 windbg의 디버그 메모리 누수 문제에 대해 간략하게 소개합니다.
다음 코드를 예로 들어 보겠습니다.
 

먼저 windbg 환경을 구성합니다.
1) Windows 심볼 서버 SRVd : \ symbolshttp : //msdl.microsoft.com/download/symbols 구성
2) 현재 프로그램의 pdb 파일 경로를 Windbg의 심볼 파일 경로 경로에 추가합니다.
3) 구성 메모리 누수 프로세스에 대한 사용자 스택 추적을 활성화하는 운영 체제 플래그 Windbg와 함께 제공되는 gflags.exe 프로그램을 "gflags.exe -i 20190718.exe + ust"명령을 통해 설치하면됩니다. 20190718.exe는 프로그램 이름입니다 (경로없이 프로그램 이름 만 입력하면됩니다).

 

준비가 완료되면 단계별로 디버깅을 시작합니다. 1. 20190718.exe 프로그램을 시작하고 Windbg의 Attach To Process를 사용하여 첨부합니다 (또는 Open Excutable을 통해 직접 엽니 다)
. 2. 프로세스를 첨부 한 후 "! heap – s "명령. -s는 통계 정보를 나타내며 현재 프로세스의 모든 힙 할당 정보를 볼 수 있습니다.

 

현재는 힙 02d40000이 하나만 있습니다 (이 힙은 CRT 힙임).
 

 

3. F5 키를 누르면 프로그램이 잠시 동안 계속 실행 된 다음 인터럽트 (Windbg-Debug-Break 메뉴)하고 " ! heap –s "명령을 입력합니다.

 

02d40000 힙에 할당 된 메모리가 증가한 것을 볼 수 있습니다.
 

 

4. " ! heap -stat -h 02d40000 "명령을 입력 하여 증가하는 힙의 힙 통계를보십시오.

 

-stat 명령은 할당 된 메모리의 크기,이 크기의 힙 블록 수 및 총 크기, 마지막으로 현재 "사용 중"에있는 힙 블록을 포함하여 하나 이상의 힙 사용량에 대한 통계를 제공 할 수 있습니다. state 백분율. 기본적으로 -stat는 전체 크기에 따라 정렬됩니다.

위의 스냅 샷은 할당중인 400 (16 진수) 크기의 0x5acf 힙 블록이 있고 힙 블록의 백분율이 99.77 %에 도달했음을 보여줍니다. 이러한 데이터는 메모리 크기가 400 (16 진수) 바이트라고 추측하게합니다. 누출 가능성이 있습니다 (코드에 1024 바이트가 할당 됨).


5. "! heap –flt s 400"을 입력하여 힙에서 크기가 400 인 모든 블록을 봅니다.

 


6. " ! heap –p –a UserPtr "명령을 입력합니다. UserPtr은! heap -p -a 047b8e70과 같은 위 주소 중 하나이며 주소 047b8e70에 호출 스택 정보를 표시합니다.

호출 스택에서 볼 수 있듯이! main + 0x0000001a 주소의 코드로 인해 메모리 누수가 발생할 수 있습니다.

 

 

7. " lsa! main + 0x0000001a "를 입력하여 특정 코드로 이동 :

 

 

정보는 공유되어야 한다 쭈욱~

반응형

댓글