memory — Tcl 메모리 디버깅 기능 제어하기

memory — Tcl 메모리 디버깅 기능 제어하기

C 확장을 작성하다 보면 "이 메모리는 어디서 새고 있지?" 하고 막막해질 때가 있어요. memory 명령은 Tcl의 메모리 디버깅 기능을 조정해서, 할당 추적이나 가드 존(guard zone) 검증 같은 작업을 직접 해볼 수 있게 해 줍니다.

출처: Tcl Commands — memory

본문

memory option ?arg arg ...?

memory 명령은 Tcl 개발자에게 Tcl의 메모리 디버깅 기능을 제어할 수 있게 해 줘요. memory 명령에는 여러 하위 옵션이 있는데, 아래에서 설명해요. 이 명령은 Tcl이 메모리 디버깅을 활성화한 채 컴파일된 경우에만(컴파일 시 TCL_MEM_DEBUG가 정의된 경우), 그리고 Tcl_InitMemory가 호출된 이후에만 사용할 수 있어요.

memory active file 현재 할당된 모든 메모리의 목록을 지정된 파일에 써요.

memory break_on_malloc count count번째 할당이 수행된 후, ckalloc이 그 사실을 알리는 메시지를 출력하고 이제 C 디버거로 진입하려 한다고 알려줘요. 그러면 Tcl은 자기 자신에게 SIGINT 신호를 보내요. C 디버거 아래에서 Tcl을 실행 중이라면 디버거 명령 모드로 진입하게 돼요.

memory info Tcl이 시작된 이후의 총 할당·해제 수, 현재 할당된 패킷 수(대응하는 ckfree 호출 없이 남아 있는 ckalloc 호출 수), 현재 할당된 바이트 수, 그리고 할당된 최대 패킷 수와 바이트 수를 담은 보고서를 돌려줘요.

memory init [on|off] 할당된 모든 메모리를 가짜 바이트로 사전 초기화할지 켜고 끄는 옵션이에요. 초기화되지 않은 값의 사용을 감지하는 데 유용해요.

memory objs file 할당된 모든 Tcl_Obj 값의 목록을, 할당된 위치와 함께 지정된 파일에 즉시 쓰게 해요. 값의 누수(leak)를 점검하는 데 유용해요.

memory onexit file Tcl의 메모리 하위 시스템이 최종화되는 동안 할당된 모든 메모리의 목록을 지정된 파일에 쓰게 해요. 프로세스 종료 시 메모리가 제대로 정리되는지 점검하는 데 유용해요.

memory tag string ckalloc으로 할당된 각 메모리 패킷은 문자열 값 태그를 연관시킬 수 있어요. memory activememory onexit가 생성하는 할당된 메모리 목록에서, 각 패킷의 태그는 패킷에 대한 다른 정보와 함께 출력돼요. memory tag 명령은 이후의 ckalloc 호출에 대한 태그 값을 string으로 설정해요.

memory trace [on|off] 메모리 추적을 켜거나 꺼요. 추적이 켜져 있으면 ckalloc 호출마다 추적 정보 한 줄이 stderr에 쓰여요. 그 줄은 ckalloc이라는 단어 뒤에 반환된 주소, 할당된 메모리 양, 그리고 할당을 수행하는 코드의 C 파일명과 줄 번호로 구성돼요. 예를 들어:

ckalloc 40e478 98 tclProc.c 1406

ckfree 호출도 같은 방식으로 추적돼요.

memory trace_on_at_malloc count count번째 ckalloc이 수행된 후에 메모리 추적을 활성화해요. 예를 들어 memory trace_on_at_malloc 100을 입력하면, 100번째 ckalloc 호출 이후부터 모든 할당과 해제에 대한 추적 정보가 표시되기 시작해요. 문제가 발생하기 전에 메모리 활동이 많을 수 있으므로, 문제가 시작되기 전에 일어나는 할당 횟수를 안다면 이 옵션을 잘 활용해서 추적에 따른 속도 저하(와 생성되는 추적 정보 양)를 줄일 수 있어요. Tcl이 시작된 이후 발생한 현재 메모리 할당 횟수는 가드 존 실패 시 출력돼요.

memory validate [on|off] 메모리 검증을 켜거나 꺼요. 검증이 활성화되면 ckalloc이나 ckfree 호출마다, 현재 존재하는 ckalloc으로 할당된 모든 메모리의 가드 존을 검사해요. 이는 성능에 큰 영향을 주므로, 덮어쓰기(overwrite) 문제가 강하게 의심될 때만 사용해야 해요. 검증을 활성화하는 장점은, 가드 존 덮어쓰기가 발생한 직후의 첫 ckalloc/ckfree 호출에서 감지할 수 있다는 점이에요. 덮어쓰기된 가드 존을 가진 특정 메모리가 해제될 때(즉 덮어쓰기 후 한참 뒤일 수 있는 시점)까지 기다리지 않아도 되죠.

더 알아보기

  • ckalloc, ckfree — 메모리 할당·해제 C 함수예요
  • Tcl_ValidateAllMemory, Tcl_DumpActiveMemory — 메모리 검증·덤프 C API
  • TCL_MEM_DEBUG — 컴파일 시 메모리 디버깅 활성화 매크로예요