실행 중인 프로세스에서 메모리 누수를 찾을 수 있는 방법이 있습니까? Valgrind를 사용하여 프로세스가 시작되기 전에 메모리 누수를 찾을 수 있습니다. GDB를 사용하여 실행 중인 프로세스에 연결할 수 있습니다. 실행 중인 프로세스에서 메모리 누수를 디버깅하는 방법은 무엇입니까?
답변1
메모리 누수를 찾기 위해 거의 보장되는 단계는 다음과 같습니다.
메모리 누수를 일으키는 프로세스의 PID를 알아보세요.
ps -aux
/proc/PID/smaps
일부 파일을 캡처 하여 저장합니다BeforeMemInc.txt
.- 메모리가 늘어날 때까지 기다리십시오.
- 다시 캡쳐
/proc/PID/smaps
해서 저장하세요afterMemInc.txt
smaps
첫 번째와 두 번째 사이의 차이점을 찾으세요smaps
.diff -u beforeMemInc.txt afterMemInc.txt
메모리가 증가하는 주소 범위를 기록해 두십시오. 예를 들면 다음과 같습니다.
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
GDB를 사용하여 실행 중인 프로세스의 메모리를 덤프하거나 다음 명령을 사용하여 코어 덤프를 가져옵니다.
gcore -o process
프로세스를 실행하는 동안 일부 파일에 메모리를 덤프하기 위해 gdb를 사용하고 있습니다.
gdb -p PID dump memory ./dump_outputfile.dump 0x2b3289290000 0x2b3289343000
이제
strings
명령을 사용하거나hexdump -C
인쇄하십시오.dump_outputfile.dump
strings outputfile.dump
소스 코드에서 이러한 문자열을 찾을 수 있는 읽기 가능한 형식을 얻게 됩니다.
누출 원인을 분석하세요.
답변2
제 생각에는메모리당신이 원하는 것.
프로그램을 다시 컴파일하거나 대상 프로세스를 다시 시작하지 않고 실행 중인 프로세스에 연결하여 메모리 누수를 디버깅합니다. 매우 편리하며 생산 환경에 적합합니다.
GNU/Linux 및 FreeBSD에서 작동합니다.
노트:저는 저자입니다. 제안사항이 있으면 메시지를 남겨주세요.
==편집==
나는 또한 다른 도구를 썼다리브락, LD_PRELOAD를 통해 메모리 기능을 연결합니다.
대상 프로그램을 수정할 필요가 없습니다. 프로세스를 다시 시작하려면 LD_PRELOAD를 사용해야 하지만 런타임 중에 감지를 활성화/비활성화할 수 있습니다.
신호 트랩이 없기 때문에 성능에 미치는 영향은 훨씬 적습니다.
mtrace와 같은 유사한 도구와 비교하여 메모리 누수가 의심되는 시점에 전체 호출 스택을 인쇄합니다.
답변3
답변4
IBM정화하다아마도 가장 오래되고 가장 복잡한 도구일 것입니다. 메모리 누수를 일으킨 코드의 줄 번호를 표시합니다.