프로세스별로 memory leak이 발생하는 것을 실시간으로 Byte단위로까지 보고 싶습니다.
처음 생각은 /proc//status 를 통해 vmRSS의 정보를 보면 되겠다 생각했는데, 보니깐. KB단위이고, 특히 업데이트가 4KB 배수로 나가는 것 같네요..
좀더 정밀하게 알 수는 없을까요?
해당 내용이 memory leak인지는 어떻게 판단 가능할까요?
/proc/status 의 VmRss 도 virtual memory 할당량을 만을 나타내는 지표일테구요.
/proc/status 의 VmRSS의 문제는 메모리 할당 시에는 정확하게 할당된 것을 나타내주긴 하는데
1. KB 단위라 정밀하게는 알수가 없네요 2. 그리고 메모리 해제시 값이 즉시즉시 변화하지 않고요..
이를 해결할 수 있는 방법은 없을까요?
---------------------------------http://blog.naver.com/munhoney ---------------------------------
커널 입장에서는 1. 4KB 단위로 메모리를 할당하고 2. User 영역에서 free() 할때도 곧바로 메모리를 해제 하지는 않기 때문이지요.
valgrind, mpatrol, memwatch, 같은 메모리 leak 툴을 써보시는게 어떨지요.
mtrace(3)는 어떠신가요?
memory leak이 의심되는 부분을 mtrace()와 muntrace() 블럭으로 묶으면 실시간으로 memory leak을 체크할 수 있습니다. MALLOC_TRACE 환경변수를 이용하면 파일로 로그를 남길수도 있구요.
쓰고보니.. 소스코드가 없으면 안되겠네요. 프로그래밍 QnA 게시판인지라.. 소스코드와 연관지어 생각이 났네요.
---- jai guru deva om...
mtrace와 muntrace란게 있었군요
그런데 manual봐보니 둘다 void mtrace(void) 이던데요
제가 원하는 것은 제 프로그램 내에서 특정 프로세스의 사용한 메모리 영역을 보고 싶거덩요.
이렇게는 안될까요?
런타임도중에 어떤 Address 가 Leak 다 아니다를 판단할수는 없습니다.
프로그램이 종료가 되야 Heap에 어느 부분이 free 되지 않았다는걸 알 수 있을테니깐요.
Looping이 프로그램의 핵심이라서 다른 툴을 찾으시는거라면
간단하게 Malloc을 다른 함수로 대체해서 메모리 할당 해제 기록을 파일로 기록하는 방법도 있을 수 있습니다.
__FILE__, __LINE__ 메크로를 이용해서요
sprintf(str,"[MEMLOG]Allocating memory: 0x%x, filename: %s, line: %d, size: %d, time %lu\n" , malloc받은 Address, __FILE__, __LINE__, size, time);
이런 자료 구조를 linked list 나 array로 가지고 있다가 free쪽에서 address를 보고 빼주는 식으로 해주고
대략 5분 주기로 파일로 쓰게끔 해주고 읽어보면,
Leak 이 발생할 경우 패턴이 보입니다...
그리고 debugging ..........
저는 ARM용으로 쓸만한 leak-tracer 가 없어서 이방법을 사용해 봤습니다.
Dig it.
텍스트 포맷에 대한 자세한 정보
<code>
<blockcode>
<apache>
<applescript>
<autoconf>
<awk>
<bash>
<c>
<cpp>
<css>
<diff>
<drupal5>
<drupal6>
<gdb>
<html>
<html5>
<java>
<javascript>
<ldif>
<lua>
<make>
<mysql>
<perl>
<perl6>
<php>
<pgsql>
<proftpd>
<python>
<reg>
<spec>
<ruby>
<foo>
[foo]
글쎄요..
해당 내용이 memory leak인지는 어떻게 판단 가능할까요?
/proc/status 의 VmRss 도 virtual memory 할당량을 만을 나타내는 지표일테구요.
VmRSS의 문제는....
/proc/status 의 VmRSS의 문제는 메모리 할당 시에는 정확하게 할당된 것을 나타내주긴 하는데
1. KB 단위라 정밀하게는 알수가 없네요
2. 그리고 메모리 해제시 값이 즉시즉시 변화하지 않고요..
이를 해결할 수 있는 방법은 없을까요?
---------------------------------
http://blog.naver.com/munhoney
---------------------------------
/proc/status는 답이 아닌거 같습니다.
커널 입장에서는
1. 4KB 단위로 메모리를 할당하고
2. User 영역에서 free() 할때도 곧바로 메모리를 해제 하지는 않기 때문이지요.
valgrind, mpatrol, memwatch, 같은 메모리 leak 툴을 써보시는게 어떨지요.
mtrace(3)는
mtrace(3)는 어떠신가요?
memory leak이 의심되는 부분을 mtrace()와 muntrace() 블럭으로 묶으면
실시간으로 memory leak을 체크할 수 있습니다.
MALLOC_TRACE 환경변수를 이용하면 파일로 로그를 남길수도 있구요.
쓰고보니.. 소스코드가 없으면 안되겠네요.
프로그래밍 QnA 게시판인지라.. 소스코드와 연관지어 생각이 났네요.
----
jai guru deva om...
----
jai guru deva om...
아 이런 방법이 있었군요!! 그런데...
mtrace와 muntrace란게 있었군요
그런데 manual봐보니 둘다
void mtrace(void)
이던데요
제가 원하는 것은 제 프로그램 내에서 특정 프로세스의 사용한 메모리 영역을 보고 싶거덩요.
이렇게는 안될까요?
---------------------------------
http://blog.naver.com/munhoney
---------------------------------
첫번째 답변하신 분이 맞을겁니다.
런타임도중에 어떤 Address 가 Leak 다 아니다를 판단할수는 없습니다.
프로그램이 종료가 되야 Heap에 어느 부분이 free 되지 않았다는걸 알 수 있을테니깐요.
Looping이 프로그램의 핵심이라서 다른 툴을 찾으시는거라면
간단하게 Malloc을 다른 함수로 대체해서 메모리 할당 해제 기록을 파일로 기록하는 방법도 있을 수 있습니다.
__FILE__, __LINE__ 메크로를 이용해서요
sprintf(str,"[MEMLOG]Allocating memory: 0x%x, filename: %s, line: %d, size: %d, time %lu\n"
, malloc받은 Address, __FILE__, __LINE__, size, time);
이런 자료 구조를 linked list 나 array로 가지고 있다가 free쪽에서 address를 보고 빼주는 식으로 해주고
대략 5분 주기로 파일로 쓰게끔 해주고 읽어보면,
Leak 이 발생할 경우 패턴이 보입니다...
그리고 debugging ..........
저는 ARM용으로 쓸만한 leak-tracer 가 없어서 이방법을 사용해 봤습니다.
Dig it.
댓글 달기