C++ 고급 문법 (21) — 가상 소멸자(Virtual Destructor)

Base* p = new Derived; delete p;는 컴파일도 실행도 문제없어 보인다. 하지만 Base의 소멸자가 가상이 아니면 delete는 정적 타입 Base의 소멸자만 호출한다. Derived가 잡은 자원은 해제되지 않고, 표준상으로는 미정의 동작이다.…

Continue ReadingC++ 고급 문법 (21) — 가상 소멸자(Virtual Destructor)

eBPF 실전 (6) — 페이지 폴트·slab·메모리 누수·OOM 관측하기

메모리 문제는 대부분 사후에 발견된다. OOM으로 프로세스가 죽은 뒤 dmesg 한 줄이 남고, 그 전까지 누가 얼마나 잡아먹고 있었는지는 알 수 없다. /proc/meminfo나 /proc/slabinfo는 지금 이 순간의 스냅샷이라 어떤 작업이…

Continue ReadingeBPF 실전 (6) — 페이지 폴트·slab·메모리 누수·OOM 관측하기

슬랩 할당 백트레이스 추적: alloc_calls에서 alloc_traces로

슬랩 캐시가 계속 커질 때 /proc/slabinfo는 어느 캐시에 오브젝트가 몇 개 있는지만 알려주고, 그 오브젝트를 누가 할당했는지는 알려주지 않는다. SLUB에는 오브젝트마다 마지막 할당·해제 호출 스택을 기록하는 기능이 있어서 이 질문에…

Continue Reading슬랩 할당 백트레이스 추적: alloc_calls에서 alloc_traces로

Valgrind로 메모리 누수 탐지하기

C/C++로 짠 프로그램에서 메모리 누수는 당장 크래시를 내지 않아서 더 골치 아프다. 며칠씩 켜두는 서버 프로세스가 서서히 메모리를 더 먹다가 결국 OOM으로 죽어야 그제서야 문제를 알아차리는 경우가 흔하다. 이 블로그에서는…

Continue ReadingValgrind로 메모리 누수 탐지하기