실행 중인 프로세스의 메모리 누수를 찾는 방법은 무엇입니까?

실행 중인 프로세스의 메모리 누수를 찾는 방법은 무엇입니까?

실행 중인 프로세스에서 메모리 누수를 찾을 수 있는 방법이 있습니까? Valgrind를 사용하여 프로세스가 시작되기 전에 메모리 누수를 찾을 수 있습니다. GDB를 사용하여 실행 중인 프로세스에 연결할 수 있습니다. 실행 중인 프로세스에서 메모리 누수를 디버깅하는 방법은 무엇입니까?

답변1

메모리 누수를 찾기 위해 거의 보장되는 단계는 다음과 같습니다.

  1. 메모리 누수를 일으키는 프로세스의 PID를 알아보세요.

    ps -aux
    
  2. /proc/PID/smaps일부 파일을 캡처 하여 저장합니다 BeforeMemInc.txt.

  3. 메모리가 늘어날 때까지 기다리십시오.
  4. 다시 캡쳐 /proc/PID/smaps해서 저장하세요afterMemInc.txt
  5. smaps첫 번째와 두 번째 사이의 차이점을 찾으세요 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. 누출 원인을 분석하세요.

답변2

제 생각에는메모리당신이 원하는 것.

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

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

노트:저는 저자입니다. 제안사항이 있으면 메시지를 남겨주세요.

==편집==

나는 또한 다른 도구를 썼다리브락, LD_PRELOAD를 통해 메모리 기능을 연결합니다.

대상 프로그램을 수정할 필요가 없습니다. 프로세스를 다시 시작하려면 LD_PRELOAD를 사용해야 하지만 런타임 중에 감지를 활성화/비활성화할 수 있습니다.

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

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

답변3

Linux에서는 활성화할 수 있습니다.프로그램에서는 코드 변경입니다.

OpenBSD에서는 시도해 볼 수 있습니다malloc 통계.

구글의누출 검사기mtrace와 달리 이를 사용하면 재컴파일을 피할 수 있으므로 살펴볼 가치가 있습니다 LD_PRELOAD.

답변4

IBM정화하다아마도 가장 오래되고 가장 복잡한 도구일 것입니다. 메모리 누수를 일으킨 코드의 줄 번호를 표시합니다.

관련 정보