실행중인 프로세스의 메모리 누수를 찾을 수있는 방법이 있습니까? 프로세스 시작 전에 메모리 누수를 찾기 위해 Valgrind를 사용할 수 있습니다. GDB를 사용하여 실행중인 프로세스에 연결할 수 있습니다. 실행중인 프로세스의 메모리 누수를 어떻게 디버깅 할 수 있습니까?
실행중인 프로세스의 메모리 누수를 찾을 수있는 방법이 있습니까? 프로세스 시작 전에 메모리 누수를 찾기 위해 Valgrind를 사용할 수 있습니다. GDB를 사용하여 실행중인 프로세스에 연결할 수 있습니다. 실행중인 프로세스의 메모리 누수를 어떻게 디버깅 할 수 있습니까?
답변:
메모리 누수를 일으키는 프로세스의 PID를 찾으십시오.
ps -aux
를 캡처하고 /proc/PID/smaps
같은 파일에 저장하십시오 BeforeMemInc.txt
.
/proc/PID/smaps
하고 저장하십시오afterMemInc.txt
첫 번째 차이점 찾기 smaps
, 2 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
해당 문자열을 소스 코드에서 찾을 수있는 읽을 수있는 양식이 제공됩니다.
소스를 분석하여 누출을 찾으십시오.
나는 memleax 가 당신이 원하는 것이라고 생각 합니다.
프로그램을 다시 컴파일하거나 대상 프로세스를 다시 시작하지 않고 연결하여 실행중인 프로세스의 메모리 누수를 디버그합니다. 생산 환경에 매우 편리하고 적합합니다.
GNU / Linux 및 FreeBSD에서 작동합니다.
참고 : 나는 저자입니다, 어떤 제안이라도 환영합니다
== 편집 ==
LD_PRELOAD에 의해 메모리 함수를 연결하는 또 다른 도구 libleak을 작성 합니다.
대상 프로그램을 수정할 필요도 없습니다. LD_PRELOAD로 진행 상황을 다시 시작해야하지만 실행 중에 탐지를 활성화 / 비활성화 할 수 있습니다.
신호 트랩이 없기 때문에 성능에 미치는 영향이 훨씬 적습니다.
mtrace와 같은 유사한 도구와 비교하여 의심스러운 메모리 누수 지점에서 전체 호출 스택을 인쇄합니다.
Linux에서는 프로그램에서 mtrace 를 사용할 수 있지만 코드 변경입니다.
OpenBSD에서는 malloc stats를 시도 할 수 있습니다.
Google의 누출 검사기 는 살펴볼 가치가 있으며 mtrace와 달리 LD_PRELOAD
재 컴파일을 피하는 데 사용할 수 있습니다 .
소스 코드에서 직접 프로그램을 시작한 후 할당 모니터링을 지원하지 않으면 운이 없다고 생각합니다. 내가 생각할 수있는 두 가지 이유는 다음과 같습니다.
그러나 프로그램이 가상 머신 내에서 실행중인 경우 해당 환경에서 할당 모니터링을 지원할 수 있습니다. Java에는 실행중인 프로그램이나 VM에 연결되는 여러 할당 및 가비지 수집 모니터링 도구 ( visualVM 과 같은 )가 있습니다.