kgdb로 원격 시스템 라이브 디버깅하기
커널이 패닉 없이 그냥 멈추거나, 특정 syscall 경로에서만 간헐적으로 이상 동작을 보이는 경우 printk만으로는 원인을 좁히기 어렵다. dmesg에 로그를 더 찍고 재현하고 다시 빌드하는 사이클은 타이밍에 민감한 버그일수록 무력해진다. 이럴…
커널이 패닉 없이 그냥 멈추거나, 특정 syscall 경로에서만 간헐적으로 이상 동작을 보이는 경우 printk만으로는 원인을 좁히기 어렵다. dmesg에 로그를 더 찍고 재현하고 다시 빌드하는 사이클은 타이밍에 민감한 버그일수록 무력해진다. 이럴…
strace nginx나 strace sh script.sh로 걸어보면 부모 프로세스의 fork/execve까지만 잡히고, 실제 작업을 하는 워커/자식 프로세스 내부는 안 보인다. -f(--follow-forks)가 이 문제를 해결한다. 이 글에서는 -f/-ff/-e trace=로 멀티프로세스·멀티스레드 프로그램을 추적하는 방법을…
워치포인트로 "이 변수가 언제 바뀌는지"는 잡을 수 있어도, 그 값이 왜 그렇게 됐는지 되짚어 올라가려면 결국 브레이크포인트를 다시 걸고 처음부터 재실행하기를 반복하게 된다. Mozilla의 rr 같은 record-and-replay 디버거는 실행을 통째로…
락 경합(lock contention)은 멀티코어 시스템에서 흔한 성능 병목 원인이다. CPU 사용률은 높은데 실제 작업 처리량은 그대로거나 오히려 떨어진다면, 스레드들이 실제 일을 하는 대신 서로 락을 기다리며 시간을 보내고 있을 가능성이…
코드가 느린 게 캐시 미스 때문인지, 분기 예측 실패 때문인지, 아니면 그냥 명령어 수가 많아서인지는 로그나 타이머만으로는 알기 어렵다. wall clock 시간은 "얼마나 걸렸는지"만 알려줄 뿐, "왜 걸렸는지"는 알려주지 않는다.…
아래 GDB 사용법 글에서 breakpoint·step·backtrace·print 같은 기본기는 이미 다뤘다. 하지만 실무에서, 특히 임베디드/크로스컴파일 환경에서 GDB를 쓰다 보면 로컬 바이너리에 breakpoint 거는 것만으로는 부족한 상황이 자주 생긴다. 타깃 보드에는 GUI도 없고…
메모리 Leak 문제는 프로그램이 동적으로 할당한 메모리를 해제하지 않고 계속해서 사용하는 상태를 나타난다. 이로 인해 메모리 사용량이 계속 증가하며, 장기적으로는 시스템의 성능에 부정적인 영향을 미치게 된다. gperftools은 메모리 Leak을 체크하고…
프로그래머들은 SW개발 중에 버그를 찾고 해결하기 위해 디버깅 작업을 수행한다. 리눅스 환경에서는 PTRACE라는 강력한 도구를 사용할 수 있는데, 개발자들은 이를 직접 이용하거나, 이를 이용하는 툴들을 사용하여 프로세스 디버깅을 할…
PTRACE 시작하기 PTRACE를 사용하기 위해서는 <sys/ptrace.h> 헤더 파일을 포함해야 하며 ptrace() 시스템 콜을 사용한다. PTRACE를 사용하기 전에 대상 프로세스를 생성하거나 이미 실행 중인 프로세스를 선택해야 한다. 프로세스 추적 제어 PTRACE_ATTACH…