실행중인 프로세스의 메모리 누수를 어떻게 찾을 수 있습니까?


19

실행중인 프로세스의 메모리 누수를 찾을 수있는 방법이 있습니까? 프로세스 시작 전에 메모리 누수를 찾기 위해 Valgrind를 사용할 수 있습니다. GDB를 사용하여 실행중인 프로세스에 연결할 수 있습니다. 실행중인 프로세스의 메모리 누수를 어떻게 디버깅 할 수 있습니까?


Valgrind는 매우 유용하며 직관적이라고 부릅니다.
user400344

답변:


13

누가 메모리 누수를 찾는 지 거의 보증 단계입니다.

  1. 메모리 누수를 일으키는 프로세스의 PID를 찾으십시오.

    ps -aux
  2. 를 캡처하고 /proc/PID/smaps같은 파일에 저장하십시오 BeforeMemInc.txt.

  3. 메모리가 증가 할 때까지 기다리십시오.
  4. 다시 캡처 /proc/PID/smaps하고 저장하십시오afterMemInc.txt
  5. 첫 번째 차이점 찾기 smaps, 2 smaps예와를,

    diff -u beforeMemInc.txt afterMemInc.txt

  6. 메모리가 증가한 주소 범위를 기록해 두십시오 (예 :

       beforeMemInc.txt            afterMemInc.txt
    ---------------------------------------------------
    2b3289290000-2b3289343000   2b3289290000-2b3289343000  #ADDRESS
    Shared_Clean:    0 kB       Shared_Clean:    0 kB          
    Shared_Dirty:    0 kB       Shared_Dirty:    0 kB
    Private_Clean:   0 kB       Private_Clean:   0 kB
    Private_Dirty:  28 kB       Private_Dirty:  36 kB  
    Referenced:     28 kB       Referenced:     36 kB
    Anonymous:      28 kB       Anonymous:      36 kB  #INCREASE MEM
    AnonHugePages:   0 kB       AnonHugePages:   0 kB
    Swap:            0 kB       Swap:            0 kB
    KernelPageSize:  4 kB       KernelPageSize:  4 kB
    MMUPageSize:     4 kB       MMUPageSize:     4 kB
    Locked:          0 kB       Locked:          0 kB
    VmFlags: rd wr mr mw me ac  VmFlags: rd wr mr mw me ac
    
  7. GDB를 사용하여 실행중인 프로세스에서 메모리를 덤프하거나 코어 덤프를 사용하십시오. gcore -o process

  8. 프로세스를 실행할 때 gdb를 사용하여 메모리를 일부 파일로 덤프했습니다.

    gdb -p PID
    dump memory ./dump_outputfile.dump 0x2b3289290000 0x2b3289343000
    
  9. 현재 사용 strings명령 또는 hexdump -C를 인쇄dump_outputfile.dump

    strings outputfile.dump
  10. 해당 문자열을 소스 코드에서 찾을 수있는 읽을 수있는 양식이 제공됩니다.

  11. 소스를 분석하여 누출을 찾으십시오.


12

나는 memleax 가 당신이 원하는 것이라고 생각 합니다.

프로그램을 다시 컴파일하거나 대상 프로세스를 다시 시작하지 않고 연결하여 실행중인 프로세스의 메모리 누수를 디버그합니다. 생산 환경에 매우 편리하고 적합합니다.

GNU / Linux 및 FreeBSD에서 작동합니다.

참고 : 나는 저자입니다, 어떤 제안이라도 환영합니다

== 편집 ==

LD_PRELOAD에 의해 메모리 함수를 연결하는 또 다른 도구 libleak을 작성 합니다.

대상 프로그램을 수정할 필요도 없습니다. LD_PRELOAD로 진행 상황을 다시 시작해야하지만 실행 중에 탐지를 활성화 / 비활성화 할 수 있습니다.

신호 트랩이 없기 때문에 성능에 미치는 영향이 훨씬 적습니다.

mtrace와 같은 유사한 도구와 비교하여 의심스러운 메모리 누수 지점에서 전체 호출 스택을 인쇄합니다.


1
나는 명백한 누출을 모니터링하는 매우 유용한 도구로 memleax를 보증합니다. 출력 요약 놀랍게도 효과적이다 . 수동으로 처리 할 수있는 처리 능력이 있다면 거의 쓸 것입니다. 감사합니다
sehe

6

Linux에서는 프로그램에서 mtrace 를 사용할 수 있지만 코드 변경입니다.

OpenBSD에서는 malloc stats를 시도 할 수 있습니다.

Google의 누출 검사기 는 살펴볼 가치가 있으며 mtrace와 달리 LD_PRELOAD재 컴파일을 피하는 데 사용할 수 있습니다 .


0

소스 코드에서 직접 프로그램을 시작한 후 할당 모니터링을 지원하지 않으면 운이 없다고 생각합니다. 내가 생각할 수있는 두 가지 이유는 다음과 같습니다.

  • 힙 체커는 프로그램이 시작될 때 초기화됩니다. 일부는 정확한 타이밍을 조정할 수있는 기능을 제공하지만 프로그램을 실행할 때이를 시작하는 환경 변수를 설정해야합니다. 각 할당에 해당 할당이 할당되어 있는지 확인하기 때문에 그렇지 않은 경우가 있습니다.
  • 힙 검사는 일반적으로 운영 체제에서 높은 권한 또는 후크를 제공해야합니다. 프로그램 시작시 이러한 후크가 제공되지 않으면 힙 체커가이를 이용할 수 없습니다. 문제의 프로그램이 시작된 후 OS가 이러한 권한을 제공한다고 생각하지 않습니다.

그러나 프로그램이 가상 머신 내에서 실행중인 경우 해당 환경에서 할당 모니터링을 지원할 수 있습니다. Java에는 실행중인 프로그램이나 VM에 연결되는 여러 할당 및 가비지 수집 모니터링 도구 ( visualVM 과 같은 )가 있습니다.


0

IBM의 Purify 는 아마도 가장 오래되고 가장 정교한 도구 일 것입니다. 코드에서 줄 번호를 표시하여 메모리 누수가 발생합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.