몰래카메라 조용한카메라 무음카메라 닌자카메라 블랙박스카메라
© 2025 Shelled Nuts Blog. All rights reserved.
Capture your moments quietly and securely
Stripe의 혁신적인 개발자 경험과 Kinde가 이끄는 인증 시스템의 미래를 살펴보고, 개발자 친화적 솔루션 도입 인사이트를 제공합니다.
Shelled AI (한국)
복잡한 환경에서 에이전트 협업 시뮬레이션 실습을 통해 멀티 에이전트 시스템의 실제 적용과 사례를 단계별로 체험해보세요.
Shelled AI (한국)
지식 기반 프롬프트와 RAG 개념을 통해 대형 언어 모델의 한계를 극복하고, 최신 정보와 조직 지식을 효과적으로 통합하는 방법을 소개합니다.
Shelled AI (한국)
어, 또 만났네요! 지난번 "Linux 커널 소스코드 빌드 및 모듈 작성 실습" 글, 어떠셨나요? 댓글 보니까 많은 분들이 KGDB랑 ftrace를 더 깊이 알고 싶다고 하시더라고요. 그래서 오늘은 이 두 가지, 진짜 실무에서 어떻게 쓰는지, 한 번 제대로 파헤쳐볼까 해요.
커널 개발하다 보면, 진짜 예상치 못한 버그나 성능 저하에 딱! 부딪힐 때가 있죠. 로그만 들여다보다가 머리 싸매본 적, 저만 그런 거 아니죠? 저도 수없이 겪었어요. 그럴 때마다 "아, 이래서 다들 KGDB랑 ftrace를 쓰라고 하는구나!" 하고 무릎을 탁 치게 되더라고요.
이 글에서는 KGDB로 커널을 원격 디버깅하는 방법, ftrace로 함수 호출과 이벤트를 추적하는 실제 노하우, 그리고 실전에서 바로 써먹을 수 있는 팁까지 단계별로 정리해봤어요. 솔직히 저도 처음엔 삽질 많이 했거든요. 완벽하지 않아도 괜찮으니까, 같이 한 걸음씩 성장해봐요! 읽고 나면 커널 디버깅이 덜 두렵고, 실질적인 문제 해결 능력이 한 단계 업그레이드될 거예요.
커널 디버깅, 이름만 들어도 뭔가 어렵고 위험해 보이죠? 저도 처음엔 "이거 잘못 건드리면 컴퓨터 터지는 거 아냐?" 싶었어요. 그런데 막상 하다 보면, 왜 중요한지, 왜 복잡한지 몸소 느끼게 됩니다.
커널 디버깅이란, 쉽게 말해 운영체제의 심장부인 '커널' 내부에서 생기는 문제를 직접 들여다보고 원인을 찾아내는 과정이에요. 사용자 애플리케이션은 에러 나면 로그도 남고, 디버거로 한 줄씩 실행도 해볼 수 있잖아요? 커널은 다릅니다. 시스템 자원(메모리, CPU, 하드웨어)과 가장 가까운 곳에서 돌아가니까, 잘못 건드리면 시스템 전체가 다운될 수도 있어요. 부담감, 장난 아니죠.
예전에 리눅스 디바이스 드라이버 개발하다가 시스템이 갑자기 멈춘 적이 있었어요. 로그만 봐서는 도저히 원인을 못 찾겠더라고요. 이럴 때 필요한 게 바로 커널 내부 상태를 직접 들여다볼 수 있는 디버깅 도구입니다. 함수 호출 흐름, 레지스터 상태, 메모리 덤프… 이런 정보 없으면 데드락이나 메모리 누수 같은 치명적인 버그는 찾기 정말 힘들어요.
실제로 많이 쓰는 도구가 KGDB와 ftrace입니다. KGDB는 GDB랑 연결해서 커널을 원격에서 멈추고, 변수 값을 직접 확인하거나 함수 하나씩 따라가 볼 수 있어서 정말 강력해요. 단, 설정이 좀 복잡하고, 디버깅하고 싶은 시스템에 미리 세팅을 잘 해놔야 해요. 저도 세팅하다가 시스템이 부팅도 안 돼서 진땀 뺀 적이 한두 번이 아니에요… ftrace는 함수 호출 추적에 특화된 도구인데, 성능 이슈나 병목 현상 잡을 때 정말 유용하더라고요. 하지만 ftrace만으로 모든 문제를 해결하긴 어렵고, 복잡한 버그라면 두 도구를 조합해서 써야 해요.
정리하자면, 커널 디버깅은 시스템의 안정성과 성능을 지키는 데 반드시 필요한 과정이고, 혼자 다 하려다 보면 막막할 수도 있지만, 적절한 도구를 써가면서 하나씩 경험 쌓으면 점점 익숙해집니다. 저도 아직 배우는 중이에요!
KGDB를 쓰려면, 커널을 직접 빌드해야 해요. "벌써부터 머리 아프다" 싶으시죠? 저도 처음엔 옵션이 너무 많아서 한참 헤맸어요. 그래도 한 번만 해보면, 그다음부터는 금방 익숙해집니다.
make menuconfig
Kernel hacking
→
KGDB: kernel debugger
KGDB: use kgdb over the serial console
KGDB: kernel debugger internals
KGDB_KDB: KGDB KDB frontend
도 체크!예시: 직렬 포트 사용 시
kgdboc=ttyS0,115200 kgdbwait
kgdboc
는 KGDB over console(여기선 ttyS0, 115200 baudrate)kgdbwait
는 부팅 때 바로 대기 상태로 진입호스트 PC에 GDB가 설치되어 있어야 해요.
sudo apt install gdb
실전팁:
개발 초기엔 직렬 포트로, 나중엔 이더넷으로 넘어가는 게 안전하더라고요.
두 방법 다 안 되면, 커널 메시지와 부트 파라미터부터 다시 체크!
호스트 PC에서 커널 심볼 파일(vmlinux)로 GDB 실행:
gdb vmlinux
(gdb) target remote /dev/ttyUSB0
(gdb) target remote udp:192.168.0.100:1234
(gdb) b do_fork # 브레이크포인트 설정
(gdb) c # 계속 실행
(gdb) bt # 백트레이스
(gdb) p some_kernel_var # 변수 값 출력
ftrace는 리눅스 커널에 내장된 트레이싱 툴이에요. 별도 설치나 커널 패치 없이 바로 쓸 수 있다는 점, 진짜 큰 장점이죠. 단, /sys/kernel/debug/tracing 디렉터리에 접근하려면 root 권한이 필요합니다.
sudo su
mount -t debugfs none /sys/kernel/debug
echo function > /sys/kernel/debug/tracing/current_tracer
echo do_sys_open > /sys/kernel/debug/tracing/set_ftrace_filter
echo 1 > /sys/kernel/debug/tracing/tracing_on
# ... 원하는 작업 수행 ...
echo 0 > /sys/kernel/debug/tracing/tracing_on
cat /sys/kernel/debug/tracing/trace
echo 1234 > /sys/kernel/debug/tracing/set_ftrace_pid
cat /sys/kernel/debug/tracing/trace_pipe
echo sched_switch > /sys/kernel/debug/tracing/current_tracer
처음엔 set_ftrace_filter 파일 이름이 직관적이지 않아서 좀 헷갈렸는데, 몇 번 써보니 금방 익숙해지더라고요. 그리고 trace-cmd, KernelShark 같은 도구로 시각화하면 패턴이 한눈에 보여서 진짜 신기해요.
실제로 네이버 클라우드 SRE팀에서 VM의 커널 레벨 이슈를 ftrace만으로 빠르게 추적했던 사례도 있었어요. "아, 이거 커널 재부팅 없이 볼 수 있어서 진짜 편하다"는 얘기 많이 들었습니다.
이제 진짜 실전! KGDB와 ftrace를 활용해서 커널 문제를 어떻게 해결하고, 성능을 어떻게 최적화할 수 있는지 이야기해볼게요. 솔직히 저도 처음엔 "이거 어디서부터 손대지?" 싶었어요. 근데 하나씩 써보면서 "아, 이래서 사람들이 이 도구를 칭찬하는구나!"라는 생각이 들었죠.
커널 패닉이 발생했을 때 KGDB를 써보면… 진짜 신세계! 예전엔 로그만 보고 추측해야 해서 시간도 오래 걸리고, 재현도 힘들었는데, KGDB는 커널이 멈춘 그 상태에서 직접 들여다볼 수 있어요.
# 타겟 커널 부팅 파라미터에 추가
kgdboc=ttyS0,115200 kgdbwait
# 호스트에서 gdb 실행
gdb vmlinux
(gdb) target remote /dev/ttyUSB0
이렇게 연결하면 커널이 멈춘 상태에서 현재 스택, 레지스터 값을 바로 확인할 수 있죠. 실제로 커널 패닉 직후 함수 호출 스택을 추적해서, 버그가 있던 지점을 정확히 찾았던 적이 있어요.
(gdb) bt
#0 do_page_fault
#1 error_exit
#2 ...
재현이 힘든 문제도 원격 디버깅으로 금방 원인을 찾을 수 있더라고요. 단, KGDB 연결 안정성을 위해 시리얼 케이블이나 네트워크 환경을 미리 점검하는 건 필수! 실수로 포트 세팅 잘못해서 한 시간 날린 적도 있습니다.
커널 모듈 개발할 때, "왜 이렇게 느리지?" 싶어서 ftrace를 써봤던 경험이 있어요. ftrace는 함수 호출 흐름을 그대로 보여주고, 각 함수의 실행 시간까지 측정할 수 있어서 병목 지점 찾기에 정말 유용합니다.
echo function > /sys/kernel/debug/tracing/current_tracer
echo my_func_name > /sys/kernel/debug/tracing/set_ftrace_filter
cat /sys/kernel/debug/tracing/trace_pipe
이렇게 했더니, 예상 못 했던 함수에서 시간이 오래 걸리는 걸 발견해서 코드 구조를 다시 짜고 실행 시간을 30% 줄였던 적이 있어요. trace-cmd 같은 도구와 같이 쓰면 기록 관리나 분석이 훨씬 편합니다.
시스템 전체 성능이 애매하게 떨어질 때는 ftrace뿐 아니라 perf, eBPF 도구도 같이 써보세요. CPU 사용률은 낮은데 인터럽트 지연이 너무 커서 문제가 되는 걸 발견한 적이 있어요. 그때는 perf로 프로파일링하고, ftrace로 함수별 지연을 확인했죠.
최적화할 때는 락(lock) 경합을 줄이거나, 비동기 방식으로 전환하거나, 캐시 사용 패턴을 바꿔보는 게 효과 있었습니다. 저도 락을 남발해서 성능이 뚝 떨어졌던 적이 있었어요. 하나씩 개선해가면서 KGDB와 ftrace를 병행해서 측정하면, 개선 효과가 눈에 보이더라고요.
휴, 복잡하죠? 천천히 다시 볼게요. 직접 부딪혀보고, 실수하면서 배우는 게 진짜 남는 경험이에요. 여러분도 꼭 한번 도전해보세요!
KGDB와 ftrace를 실제로 쓰다 보면, 예상치 못한 함정이 많아요. 저도 "이런 도구 있으면 무적이겠지!" 싶었는데, 막상 해보니 그렇지만도 않더라고요.
처음 KGDB 시도했을 때 가장 당황스러웠던 게 바로 연결 문제였어요. 시리얼 포트나 네트워크(kgdboe)로 타겟 커널에 연결하는데, 부팅 매개변수 설정이 잘못됐거나, 부트로더 단계에서 시리얼 포트가 활성화되어 있지 않으면 아예 연결이 안 됩니다.
실제로 한 번은 시리얼 포트가 죽어 있어서 계속 타임아웃만 떴던 적이 있어요. 이럴 땐 BIOS(혹은 u-boot 등 부트로더) 설정에서 포트를 확실히 켜주고, 커널 커맨드라인에도 올바른 장치를 지정해줘야 해요. 그리고, KGDB가 브레이크포인트를 잡는 타이밍이랑 인터럽트 발생 시점이 어긋나서, 디버거가 멈췄는데 시스템은 이미 한 발 앞서가고 있는 경우도 있었어요. 중요한 함수 초입에 kgdb_breakpoint()
를 직접 넣어서 타이밍을 맞추는 팁도 유용합니다.
ftrace는 정말 강력한데, 활성화만 해도 시스템이 "버벅"거릴 때가 많아요. 특히 function_graph 트레이싱처럼 모든 함수 호출을 다 추적하면, CPU 사용률이 확 치솟는 걸 바로 체감할 수 있죠. 실시간 미들웨어에서 ftrace 켰다가, 타이밍이 다 꼬여서 "왜 이렇게 느리지?" 고민했던 적도 있어요.
꼭 필요한 함수만 set_ftrace_filter로 골라서 추적하세요. buffer_size_kb 조절해서 버퍼를 너무 크게 잡지 않는 것도 한 방법이고, trace_pipe로 실시간 데이터만 뽑으면 디스크 I/O 부담을 줄일 수 있습니다.
ftrace 돌리다 보면 로그가 금방 수십~수백 MB를 넘겨버려요. "이거 다 어떻게 분석하지?" 저도 처음엔 막막했어요. 그래서 주기적으로 trace-cmd extract로 필요한 구간만 추출하거나, grep, awk 같은 명령어로 필요한 정보만 필터링했죠. trace-cmd, KernelShark 같은 도구로 시각화하면 패턴이 한눈에 보여서 "아, 이 함수가 여기서 느려졌구나!" 하는 게 딱 보입니다.
디버깅 세션 전에 "내가 뭘 보고 싶은지" 목표를 명확히 정하세요. 무작정 다 찍다간 로그만 산더미처럼 쌓이고, 정작 중요한 건 못 찾을 수 있거든요. 그리고 KGDB랑 ftrace를 동시에 쓸 때는, 서로 인터럽트나 자원 잡아먹는 부분이 겹치지 않도록 트레이스 범위와 브레이크포인트 위치를 잘 조절해야 해요. 저도 실수로 ftrace 돌리면서 KGDB 브레이크 걸었더니 커널이 멈춰버려서 리셋 버튼 누른 적 있습니다.
정리하자면, KGDB는 연결과 타이밍, ftrace는 성능과 데이터 관리, 그리고 둘 다 쓸 땐 "목표와 범위"에 집중! 아직 저도 배우는 중이지만, 실수하면서 하나씩 깨닫게 되더라고요. 여러분도 시행착오 겪으면서 자신만의 노하우를 쌓으셨으면 좋겠어요.
오늘은 KGDB와 ftrace를 활용한 커널 디버깅의 원리, 실제 적용 사례, 주요 이슈와 대응 방안까지 쭉 살펴봤어요. 이제 여러분도 커널 내부 동작을 깊이 이해하고, 문제 해결과 성능 최적화에 효과적으로 접근할 수 있는 실질적인 노하우를 얻으셨을 거라 믿어요. 직접 커널 소스코드 빌드하고, 모듈 작성하며, KGDB와 ftrace 실습해보세요. 현장의 문제를 해결하는 경험이 여러분의 기술력을 한 단계 끌어올릴 거예요. 도전을 두려워하지 말고, 커널의 세계에 한 걸음 더 가까이 다가가 보세요!
여기까지 읽으셨다면, 이제 커널 디버깅이 조금은 덜 두렵게 느껴지지 않으세요? 저도 아직도 실수하고, 새로운 문제에 부딪히지만, 그게 바로 성장의 과정이더라고요. 여러분도 꼭 직접 해보시고, 궁금한 점이나 실패담(!) 있으면 댓글로 나눠주세요. 우리 같이 성장해요!