2009-06-27 2 views
11

누구나 C++ 용 메모리 누수 탐지 도구를 찾을 수 있습니다.이 도구는 명령 줄에서 실행하거나 Windows 및 Linux에서 Eclipse 플러그인으로 실행할 수 있습니다. 사용하기 쉽도록하고 싶습니다. 가급적이면 new(), delete(), malloc() 또는 free()를 덮어 쓰지 않는 것이 좋습니다. 커맨드 라인에 GDB와 같은 것이 있지만 메모리 누수를 탐지하는데 사용된다는 것을 기억하지 못합니다. 이 작업을 자동으로 수행하는 단위 테스팅 프레임 워크가 있다면, 그렇게 좋을 것입니다.G ++ 다중 플랫폼 메모리 누수 감지 도구

이 질문은 다른 질문 (예 : Memory leak detection under Windows for GNU C/C++)과 비슷하지만, 특정 질문에 답변하지 않았거나 해결 방법이 필요하기 때문에 다른 질문이라고 생각합니다. 나는 여기서 좀 더 구체적인 것을 찾고 있다고 느낍니다. 제안은 모든 요구 사항을 충족시킬 필요는 없지만되도록 많은 사람들이 좋을 것입니다.

감사합니다.

EDIT : "덮어 쓰기"때문에 라이브러리를 #include해야하거나 그렇지 않으면 런타임시 코드를 컴파일하는 방법을 변경해야하는 모든 것을 의미합니다. 다른 환경은 큰 일에 영향을 미치지 않습니다. 또한 유감스럽게도 저는 Mac이 없기 때문에 그 어떤 제안도 도움이되지 않지만 시도해 주셔서 감사합니다. 내 데스크톱은 Windows를 실행 (Linux를 설치했지만 듀얼 모니터가 작동하지 않음)하고 VM에서 Linux를 실행하지는 않지만 확실한 옵션입니다. 내 랩톱은 리눅스를 사용하기 때문에 데스크탑에서 너무 많이 움직이지 않아도 모든 디자인 문서와 요구 사항을 유지하는 데 탁월한 화면 공간을 제공하므로 필자의 데스크톱을 고집하는 것을 선호하지만 필자는이 도구를 사용할 수 있습니다. .

참고 : 답변을 시도 할 수도 있지만 제안을 시도하고 만족스럽지 않으면 받아 들일 수 없습니다.

EDIT2 : 내 코드의 플랫폼 간 호환성에 대해 걱정할 필요가 없습니다. C++ 라이브러리 만 사용하는 명령 줄 응용 프로그램입니다.

답변

10

Valgrindbest friend입니다. Valgrind는 일식에 plugin을 가지고 있습니다. "슬프게도"Valgrind는 Windows에서 실행되지 않지만 Mac OSX, * BSD 및 Linux에서 실행되므로 "다중 플랫폼"이라고 생각합니다. :)

Valgrind는 새/삭제/malloc/free를 "덮어 씁니다"하지만 컴파일 중에는 덮어 쓰지 않습니다 (따라서 사용자가 의미하는 바를 다시 컴파일 할 필요가 없습니다). 바이너리를 해석하여 테스트하는 동안 성능이 약간 저하됩니다.

0

MacOS X에는 leaks 도구가 있습니다 (다른 곳에 존재하는지는 모르겠다). 그리고 나는 리눅스에서 memprof라는 도구를 사용했다. 또한 리눅스에서 작동하는 valgrind가 있으며 엄청나게 뛰어나지 만 상당한 성능 저하가 있으며 표면 상으로는 macos가 있지만 시도하지는 않았습니다.

그러나 이러한 도구는 Windows에서 인식하지 못합니다.

1

32 비트 응용 프로그램의 경우 valgrind + wine은 Windows 응용 프로그램에서도 사용할 수 있습니다. 앱을 변경하지 않고 와인에서 실행할 수 있다면 valgrind + 와인을 사용하여 실행하면 매우 제한된 경험을 할 수 있습니다. 귀하의 애플 리케이션은 리눅스에서 작동하기 때문에, 귀하의 애플 리케이션은 와인 (아직 와인에서 아직 지원되지 않는 Windows 특정 코드를 피할 것입니다)에서 실행될 가능성이 높습니다.

+0

Wine을 API 구현으로 사용하여 * nix에서 Windows 응용 프로그램을 다시 컴파일한다는 뜻입니까? (난 그냥 궁금해서) – olliej

+0

valgrind는 x86_64뿐만 아니라 PowerPC, MIPS, ARM 및 다른 아키텍처에서도 작동합니다. – LiraNuna

+0

아니, 나는 당신의 윈도우 바이너리를 수정되지 않은 상태로 리눅스에서 valgrind 아래의 와인 자체로 실행한다는 것을 의미한다. 이것이 바로 32 비트 만 언급 한 이유입니다. valgrind는 64 비트를 지원하는 와인에서는 앱을 실행할 수 없으며 64 비트를 지원하는 와인은 실험적입니다 (64 비트는 64 비트 Windows 앱을 실행 함) –

1

바람직하지 않다고 언급했지만 Boehm Garbage Collector을 사용하여 메모리 누수를 감지 할 수 있습니다. 간단히 말해, 가비지 컬렉터가 실제로 실행 중이면 일반적으로 메모리 누수가 발생합니다. Firefox에서 메모리 누수를 감지하기 위해 Mozilla에서이 방법으로 사용합니다.

1

DUMA은 많은 프로젝트에서 사용하는 교차 플랫폼 누출 감지 라이브러리입니다. #include DUMA 특정 헤더가 필요하지 않기 때문에 좋지만, 메모리 할당 루틴을 포함하고있는 시스템의 libc에 링크하기 전에 그리고 libstdC++에서 링크 한 후에 라이브러리에 링크하기 만하면됩니다.

특히 C++ 프로젝트와 함께 사용하는 경우 설정이 까다로울 수 있지만, 투자 가치가 있다고 생각합니다. 내가 다른 방법으로 발견하지 못했을 때까지 약간의 메모리 누출을 발견하고, 할당을 두 번 삭제 한 사례를 찾는데 도움이되었습니다.

참고 : 누설 런타임으로 인해 실제로 발생하는 "오 탐지 (false positives)"를 줄이는 데 도움이되므로 정적 아카이브 (Windows에서 기본적으로 빌드 됨)를 만드는 것이 훨씬 쉽습니다.

0

최신 버전의 gcc에는 누출 방지 장치이라는 것이 있습니다. 컴파일 명령에 -fsanitize=leak을 추가하기 만하면됩니다. 그런 다음 프로그램을 정상적으로 실행하고 마지막에 누출이있는 경우 요약을 받게됩니다 (물론 터미널에서).