2017년 11월 2일 목요일

Dr. Memory

메모리가 새는 곳을 찾아라.


C/C++ 개발을 하다가 보면 동반자와 같은 memory leak ...


1. Valgrind.


   좋은 툴이지만 10년 넘게 사용하다 보니 지겹다.
   좋은 툴이 아니라서 사용 안한게 아니니 오해하기 없기.


2. Dr. Memory.


   새로운 툴을 찾아 열심히 돌아다니던 중 valgrind처럼 오픈 소스인데 윈도우, 리눅스,
   맥, 그리고 안드로이드까지 지원한단다. 거기에다 맙소사 심지어 빠르다.
   Rational Purify를 사용해 보았다면 이게 얼마나 중요한 문제인지 알 수 있는데 ...


3. 설치.


   그냥 Download 에서 사용할 플랫폼에 맞춰 다운로드 후 압축만 풀면 된다.
   적어도 리눅스에선 그렇다.
  


4. 예제 코드.


    굉장히 단순화 되어 있지만 의외로 복잡한 코드에 섞여 있을 때 찾기가 어려웠던 문제.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <map>
 
struct DS {
    int DS_1;
    int DS_2;
};
 
class Base {
    public:
        Base(void) {}
        ~Base(void) {}
};
 
class Derived {
    public:
        Derived(void) {}
        ~Derived(void) {}
        
        std::map<int, DS> m_map;
};
 
int main(int argc, char* args[])
{
    Derived* pD = new Derived();
    pD -> m_map[0= DS();
    Base* pB = static_cast<Base*> (pD);
    delete pB;
}
cs

1
g++ -g ./memoryleaktest.cpp
cs

    그리고 drmemory -- ./a.out 형태로 테스트 가능하다.



5. 결론.


    소멸자를 가상 함수로 만들지 않아 Derived::~Derived 소멸자가 호출되지 않는 문제를
    정확하게 진단해 준다.

6. 그 밖의 옵션들.


    보통 서버는 왠만하면 계속 그냥 떠 있게 된다. 그래서 중간 중간 확인할 수 있는
    방법도 이미 만들어져 있다.

1
drmemory -nudge <PID>
cs

    유용한 옵션으로 로그 저장 경로를 변경 가능하다
1
drmemory -logdir /var/log/DrMemoryLog/ -- ./a.out
cs


댓글 없음:

댓글 쓰기