
실행 중인 프로세스의 메모리 누수를 찾을 수 있는 방법이 있습니까? 프로세스가 시작되기 전에 Valgrind를 사용하여 메모리 누수를 찾을 수 있습니다. GDB를 사용하여 실행 중인 프로세스에 연결할 수 있습니다. 실행 중인 프로세스의 메모리 누수를 어떻게 디버깅할 수 있나요?
답변1
메모리 누수 현상을 거의 확실하게 찾아내는 단계는 다음과 같습니다.
메모리 누수를 일으키는 프로세스의 PID를 알아보세요.
ps -aux
를 캡처
/proc/PID/smaps
하여BeforeMemInc.txt
.- 메모리가 늘어날 때까지 기다리십시오.
- 다시 캡쳐
/proc/PID/smaps
해서 저장하세요afterMemInc.txt
smaps
first 와 2nd 의 차이점을 찾으세요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에서 작동합니다.
메모:저는 저자입니다. 어떤 제안이라도 환영합니다.
== 편집 ==
나는 또한 다른 도구를 썼다libleak, LD_PRELOAD로 메모리 기능을 연결합니다.
대상 프로그램을 수정할 필요가 없습니다. LD_PRELOAD로 진행을 다시 시작해야 하지만 실행 중에 감지를 활성화/비활성화할 수 있습니다.
신호 트랩이 없기 때문에 성능에 미치는 영향이 훨씬 적습니다.
유사한 도구(예: mtrace)와 비교하여 의심스러운 메모리 누수 지점에서 전체 호출 스택을 인쇄합니다.
답변3
답변4
IBM의정화하다아마도 가장 오래되고 가장 정교한 도구일 것입니다. 메모리 누수를 일으키는 코드의 줄 번호에 플래그를 지정합니다.