2014-10-01 3 views
3

일부 프로그램에서는 할당 된 메모리 중 일부가 전혀 삭제되지 않지만 프로그램의 전체 런타임에 필요합니다. 따라서 일반적으로 안전하다고 간주됩니다.Valgrind를 사용하여 런타임 중에 실제 메모리 누수를 확인하는 방법은 무엇입니까?

그러나 프로그램의 전체 런타임에는 적합하지 않지만 개발자가 누락되어 파괴되지 않는 다른 개체가 있습니다. 이것은 실제 메모리 누수이며 해결되어야합니다.

다음 Valgrind 명령을 실행하면 프로그램 실행이 끝난 후 총 누수 만 표시됩니다. 따라서 누군가 Valgrind 누출 검사 출력에서 ​​두 가지 시나리오를 구별하는 방법을 명확히 할 수 있습니까?

명령 메모리 누수를 감지하는 데 사용되었습니다.

valgrind --log-file=valgrind_output.txt --tool=memcheck --leak-check=yes ./MyTestProgram 

실행 종료시의 일반적인 출력입니다.

==10108== LEAK SUMMARY: 
==10108== definitely lost: 392,323 bytes in 1,164 blocks 
==10108== indirectly lost: 178,120 bytes in 4,283 blocks 
==10108==  possibly lost: 170,155,118 bytes in 3,347,087 blocks 
==10108== still reachable: 263,778,326 bytes in 3,935,669 blocks 

현재 실행 중에 메모리 누수 감지 할 수있는 IBM 퓨리 도구 탭 같은 Valgrind의의 기능은 있습니까?

+0

디버깅 및 누수 찾기 목적으로 기술적으로 쓸모가 없더라도 종료하기 전에 전역 변수를 할당 해제하는 것이 유용 할 수 있습니다. 실제로 이러한 변수가 간접적으로 메모리를 누출하고 있는지 알고 싶습니다 (예 : 메모리 누수 클래스를 캡슐화하는 클래스의 전역 인스턴스가있는 경우) –

+0

은 다음과 같이 보입니다 : http://stackoverflow.com/q/7945885/476681 –

+0

위의 주석에 대한 후속 후속 작업 ... 사소한 소멸자가있는 객체를 고려하십시오. 단지 메모리를 해제하는 것 이상을 수행하는 객체입니다. 소켓을 닫고, 데이터베이스에 위탁하는 것과 같은 것을 .. 그런 객체가 매달려 있다면 (예를 들어'new'을 통해 그것을 할당하고 결코'delete'를 호출하지 마십시오.), 그 소멸자는 결코 호출되지 않습니다 *, 심지어 프로세스가 종료 된 후에 OS가 메모리 공간을 정리합니다. 그렇기 때문에 그러한 밸 로그 린 누출은 심각하게 받아 들여 져야합니다. – DevSolar

답변

2

런타임시 현재 누수 된 메모리를 감지 할 수있는 IBM Purify 도구의 Valgrind와 같은 기능이 있습니까?

아니요, 없습니다. Valgrind는 프로그램이 끝나면 누출 여부를 알 수 없습니다. 왜냐하면 프로그램이 끝나면 출시 될 내용을 알 수 없기 때문입니다.

+0

아니요 사실일지도 모르지만 기술적 인 이의 제기는 조금 비어 있습니다. 적어도 가비지 수집 스타일 휴리스틱을 사용하여 교육받은 추측을 할 수는 있습니다. –

+0

@TonyD 개인적으로, 필자는 내 프로그램이 추측하지 않고 메모리 누출 여부에 대해 확실한 사실을 선호합니다. 그리고 일부 메모리가 공개되지 않는다는 100 % 확실성으로 말할 방법이 없습니다. –

+2

그건 그냥 돼지 머리예요. 메모리 문제를 해결하기 시작하는 경우 일반적으로 원인에 대해 "확실한 사실"로 시작하지 마십시오. 조사를 유도하는 추측 및 확률 론적 지표로 시작합니다. 어쨌든 ... 뭐든간에 ... 가능하다고 생각하는 것에 대해 유감스럽게 생각해서 미안합니다 .... –

3

두 가지 기술을 사용하여 실행 중에 누수 검색을 수행 할 수 있습니다. 쉘 명령에서

  1. , 모니터 명령, 예를 leak_check 다른 선택적 인수가 있습니다 leak_check vgdb 를 시작 프로그램 내부 http://www.valgrind.org/docs/manual/mc-manual.html#mc-manual.monitor-commands

  2. : 에 도달 메모리하거나 증가 된 메모리 나 .... 참조 Valgrind의 사용자 설명서 자세한 내용을 찾을 당신은 누출 검색을 할 수있는 프로그램 클라이언트 요청에 추가 할 수 있습니다. 예. VALGRIND_DO_LEAK_CHECK 또는 VALGRIND_DO_ADDED_LEAK_CHECK 에 "호출"당신은 당신의 프로그램이 의도적으로 당신이 그 시점에서 할당 된 메모리를 검사 할 수 있는지 확인하기 위해 실행하는 동안 충돌 할 수 있습니다 자세한 내용

+0

감사합니다! –

0

에 대한 http://www.valgrind.org/docs/manual/mc-manual.html#mc-manual.clientreqs 를 참조 삽입합니다. SIGUSR1과 같은 일부 사용자 정의 신호에 대한 신호 처리기를 추가하여이 작업을 수행 할 수 있습니다. 당신은 다음과 같이 앱에이 신호를 보낼 수 있습니다

printf("debug exit!\n"); 
int *ptr = 0; 
*ptr = 0xdeadbeef; 

:

kill -s SIGUSR1 `ps -aux| grep myapp | head -n -1 | awk '{print $2}'` 

은 그럼 당신은 숫자의 차이를 검사 할 수 있습니다 핸들러에서

signal(SIGUSR1, myhandler); 

는이 같은 일을 할 할당 된 객체의숫자가 동일하게 유지되어야하거나 숫자가 계속 증가하는 것을 알면 그 곳에서 일어난 일을 조사하여 메모리 누수가 있는지 확인할 수 있습니다.