2011-11-07 3 views
3

우리는 기본적으로 Linux 응용 프로그램을 사용하고 PowerPC 프로세서에서 실행되는 매우 큰 프로젝트를 가지고 있습니다. 이 프로젝트는 처음에는 다른 회사에서 개발했습니다. 우리는 회사에서 프로젝트를 인수했으며 현재 프로젝트를 유지 관리 중입니다.Linux에서 메모리 누수 감지 및 제거

응용 프로그램에 많은 memory leak 문제가있는 것으로보고되었습니다. 이것은 대규모 프로젝트이므로 각 소스 코드 파일로 이동하여 메모리 누수를 찾을 수 없습니다. 우리는 Valgrid, mpatrol 및 기타 메모리 누수 탐지 도구를 사용했습니다. 이러한 도구는별로 도움이되지 않았으며 메모리 누수가 크게 줄어들지 않았습니다.

메모리 누수를 줄이기 위해 이동하는 방법. 위에서 언급 한 메모리 누수 탐지 도구 이외의 다른 메모리 누수를 줄이기 위해 general method이 있습니다.

+2

내가 사용한 가장 강력한 메모리 누수 감지기는 [Valgrind with Memchecker] (http://www.valgrind.org/docs/manual/mc-manual.html#mc-manual.leaks)입니다. 놀랐다는 것은 당신을 도왔다. –

답변

1

모든 메모리 할당 호출을 고유 한 할당 메소드 호출로 대체 할 수 있습니다. 할당 메소드는 원래의 메소드를 호출해야하며 동시에 메모리 사용량과 메모리 할당 위치를 계산해야합니다. 이렇게하면 누출을 찾아 손으로 제거 할 수 있습니다.

이 작업을 수행 할 수있는 자동화 도구가있을 수 있습니다. 확실하지는 않으며 사용하지 않았습니다. 그러나이 방법이 효과적입니다.

+0

나는 그 대답에 만족하지 않는다고 말 하여서 유감이다. –

+0

나는 그것에 아무런 문제가 없다 ... :-D 더 나은 것을 찾길 바래. (LiKao의 대답은 유망 해 보인다.) – johndodo

2

일반적으로 Valgrind는이 작업을위한 최상의 도구에 속합니다. 제대로 작동하지 않으면 여전히 할 수있는 몇 가지 일만있을 수 있습니다.

  • 첫 번째 질문 : 응용 프로그램의 언어는 무엇입니까? Valgrind는 C 및 C++에 매우 유용하지만 가비지 수집 또는 스크립팅 언어로는 도움이되지 않습니다. 먼저 언어를 확인하십시오. 자바와 비슷한 것이 있을지 모르지만 그 많은 자바를 사용하지 않았기 때문에 다른 사람에게 물어봐야 할 것입니다.

  • valgrind의 설정으로 많이 돌아보세요. 이 일을 도울 수있는 몇 가지 플러그인이 있습니다. 한 예는 --leak-check=full 또는 이와 유사한 옵션을 사용할 수 있습니다. 또한 valgrind 용 플러그인이있어 탐지 기능을 향상시킬 수 있습니다.

  • 당신은 응용 프로그램이 메모리 누수가 있다고보고했습니다. 어떻게 감지 되었습니까? 응용 프로그램이이 기능을 자체적으로 감지 했습니까? 그것은 외부 도구없이 자신의 응용 프로그램에 의해 발견되면, 이것은 아마도 누군가가 자신의 메모리 추적기를 응용 프로그램 내에 추가했다는 것을 의미합니다. 사용자 정의 메모리 추적기, 메모리 풀 등 valgrind 및 다른 누출 감지 시스템이 매우 엉망입니다. 따라서 응용 프로그램에 임의의 사용자 정의 메모리 처리가있는 경우 사용자가 선택할 수있는 유일한 방법은 가능한 경우 비활성화하거나이 사용자 정의 메커니즘에 연결하는 것입니다. 이 작업을 수행하는 방법은 응용 프로그램에 따라 다릅니다.

  • 나만의 메모리 추적기를 추가하십시오. 예를 들어 C++에서는 새로운/삭제 호출에 연결하여 메모리를 추적 할 수 있습니다. 이 라이브러리에는 두 가지 라이브러리가 있습니다. 약 500 LOC에서 자신의 새/삭제 대체를 작성할 수도 있습니다. 이 방법을 사용하기로 결정했다면,이 작업을 시도 할 때 C++ 세계에서 특이한 여러 가지가 있으므로 new/delete 대체에 대한 많은 자습서를 읽으십시오.

  • 애플리케이션에서 메모리 누수가 발생합니다 (즉, 어떻게 감지 되었습니까?). 도구가 막대한 양의 할당 메모리를보고 한 경우 실제 메모리 누수가 있음을 의미하지는 않습니다. 메모리 누수가 발생하면 메모리 핸들이 손실되므로 모든 메모리를 확보하고 다시 사용할 수 없게됩니다.응용 프로그램이 많은 메모리를 차지하고 액세스 할 수있게 유지하는 경우에는 완전히 다른 문제가있을 것입니다. 예를 들어 한 점 또는 다른 점에서 공간 복잡성이 나쁜 알고리즘을 사용하여 많은 할당을 유도 할 수 있습니다. 이 경우 누출 감지기는 필요 없지만 코드 프로파일의 메모리 풋 프린트에 대한 자세한 개요를 제공하는 메모리 프로파일 러가 필요합니다. 그러나 이전에 이런 종류의 작업에 프로파일 러를 사용 해본 적이 없으므로 더 이상 힌트를 드릴 수는 없습니다.

0

아마도 당신은 또한 (그 대신 malloc 등의 GC_malloc을 사용하고 있습니다 ... 약 free -ing 데이터를 귀찮게하지) Boehm's garbage collector를 사용하는 것이 좋습니다.