2007년 12월 18일 화요일

AIX에서 Memory Leak 찾는 기법

환경변수를 이용하여 malloc, free 를 추적할 수 있다.

MALLOCDEBUG=report_allocations,output:/tmp/alloc_output.txt

프로그램이 실행되는 동안 위의 환경변수가 설정되어 있는 경우 /tmp/alloc_output.txt
파일로 alloc, free 되는 정보가 출력된다. 프로그램이 실행되는 동안은 alloc,
free 할때마다 그 기록을 메모리상에 가지고 있다가 종료가 되면 해제되지
않은 alloc 정보만 /tmp/alloc_output.txt 로 출력된다.

더 자세한 사항은 AIX 5L Version 5.3 General Programming Concepts: Writing
and Debugging Programs 에 나와 있다.

2007년 10월 30일 화요일

오라클 인스턴스 클라이언트(Oracle Instance Client) 설치

무엇,왜 : 만약 Pro*c으로 프로그램을 개발 하였다면 그것을 실행하기 위해서는 설치 플랫폼에 최소한 Oracle Client가 설치되어 있어야 한다. 하지만 번거롭다. 오라클 설치는 CD을 필요로 하고 용량이 많이 차지하며 X-terminal, root 권한을 필요로 한다. 이런 설치없이 독립적으로 동작하게 한다. 단지 필요한건 copy와 editor 뿐. (하지만 10g 이후 버전만 지원??)

어떻게: oracle instance client 을 오라클 홈페이지에서 받자.
여기서
Basic, SQL*Plus, SDK(개발자라면) 을 우선으로 다운받고 압축을 해제한다. (공통적으로 instanceclient_xx_y 폴더를 포함하고 있다)

환경 변수를 설정한다. 로그인 쉘 스크립트에 아래 환경 변수들을 각기 설정하자.

ORACLE_HOME,PATH, TNS_ADMIN : instanceclient_xx_y 경로로
NLS_LANG : AMERICAN_AMERICA.KO16KSC5601 혹은 적당한 값

다음은 tnsnames.ora 생성, 서버의 tnsnames.ora 을 복사해 와도 된다. 주의할 것은 tnsnams.ora 내용을 확인 할것.

주의: Pro*c 용 헤더파일은 없다. 만약 Pro*C 용 헤더파일들이 필요하다면 이 설치로는 부족하다. 오라클 패키지를 다운로드 받은 다음 선택설치로 선택하고 개발 및 Runtime, SQLPLUS 항목을 선택하고 설치하면 된다.

2007년 7월 25일 수요일

fork와 thread 조합에서 만난 버그

개발 플랫폼 정보: AIX 5.3, xlc,oracle Pr*C

프로그램은 conf 파일을 읽고 패스워드를 입력받는다.
DB 접속 테스트. daemon으로 동작하기 위해 terminal 종속을 끝는다.
fork를 호출하여 Process M, A, W 로 분기한다.

M - Master Process
A - Admin Process
W - Work Process

W 프로세스는 다시 pthread_create 을 호출하여 thread R, I, M 로 분리된다.

r - recv thread
i - Issue thread
m - monitor thread

thread 생성후 pthread_key을 사용하여 hsm세션을 정보를 thread별로 만든다.
(thread specific data)

버그는 W 가 임의 동작으로 죽은후 M이 W을 다시 fork 한 후 W가 pthread_key 로
저장하는 세션 정보에서 발생한다. W 가 만드는 r, i, m 스레드가 자신들이 각자
만든 값으로 설정되는 것이 아니라(즉, 각 스레드가 최소 한번은 pthread_setspecific()
함수를 호출해야 하나 그렇지 못한다). pthread_setspecific()은 한번만 이루어지고
pthread_getspecific()이 3번 호출되면 2번째 호출부터는 NULL이 리턴되는 것이 아니다.
정상적인 시나리오는 getspecific() 호출에 NULL이 리턴되고 setspecific() 호출로 값을
설정한다.

버그가 발생한 이유는 M이 W을 초기화할 당시 hsm 을 완전히 지우지 않았다.
M이 fork로 생성한 W는 M의 hsm 정보를 가지고 있다(이 말은 hsm에 대한 pthread_key
을 가지고 있다는 것과 같다).

W의 1번째 hsm 정보는 M의 hsm정보를 가져오고 이후 pthread_create는 동일한 pthread_key
로부터 어떤 가비지 값을 가져오는 듯 하다.

--> fork(), pthread_create()의 혼합사용에서 있어서, pthread_key(), pthread_get,setspecific()
사용시 대단히 fork() 이전에 pthread_key_t은 삭제되어야 한다.