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

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

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

답변1

메모리 누수 현상을 거의 확실하게 찾아내는 단계는 다음과 같습니다.

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

    ps -aux
    
  2. 를 캡처 /proc/PID/smaps하여 BeforeMemInc.txt.

  3. 메모리가 늘어날 때까지 기다리십시오.
  4. 다시 캡쳐 /proc/PID/smaps해서 저장하세요afterMemInc.txt
  5. smapsfirst 와 2nd 의 차이점을 찾으세요 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에서 작동합니다.

메모:저는 저자입니다. 어떤 제안이라도 환영합니다.

== 편집 ==

나는 또한 다른 도구를 썼다libleak, LD_PRELOAD로 메모리 기능을 연결합니다.

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

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

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

답변3

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

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

구글의누출 검사기LD_PRELOAD한 번 살펴볼 가치가 있을 수도 있으며 mtrace와 달리 재컴파일을 피하기 위해 사용할 수도 있습니다 .

답변4

IBM의정화하다아마도 가장 오래되고 가장 정교한 도구일 것입니다. 메모리 누수를 일으키는 코드의 줄 번호에 플래그를 지정합니다.

관련 정보