- 오픈 소스 특성 상 리눅스 커널은 여러 개발자가 작성한 코드로 구성됨
- 다른 개발자의 코드를 훨씬 더 많이 분석해야 함
- 리눅스 디바이스 드라이버는 리눅스 커널이 제공하고 있는 함수를 호출
- 버그를 수정
- 커널 소스 코드나 해당 드라이버나 기능을 이해
- 바이너리, 소스, 디자인
- Narrow Down(문제의 범위를 좁혀가는 것)
- Brain
- printk, dump_stack
- debugfs
- ftrace
- QEMU
- TRACE32
- Crash utility
- GDB
- printf 와 같은 커널 프린트 함수
- 어느 커널 코드에도 사용 가능
- 설정도니 로그 래벨에 따라 메시지를 출력하는 범위가 달라짐
- 낮은 로그 레벨, 더 적은 메시지
- 높은 로그 레벨, 더 많은 메시지
- KERN_WARNING 이 디폴트 로그 레벨
로그 레벨 확인
터미널로 설정
디바이스 트리로 로그 레벨 설정
- printk를 추가한 함수가 자주 호출될 때(ex. schedule())
- 인터럽트 컨텍스트
printk는 오버헤드가 걸리는 동작이기 때문!
- 콘솔 드라이버는 프린트 버퍼를 플러시 함
- 커널 로그가 도배되면 시스템에 오버헤드 유발
- 성능이 낮은 시스템은 Hang에 걸릴 수 있음
- 부팅 실패
printk_ratelimit() 함수 사용
- 콘솔에 메시지가 쌓이면 printk_ratelimit() failure 상태 리턴
- 1초에 5번 출력 됨
- 스택 트레이스를 커널 로그로 출력
- 예외 처리나 심각한 오류가 있는 조건에서 사용
- #include <linux/kernal.h> 헤더 추가 후 함수 호출
CONFIG_MAGIC_SYSRG
echo -<magic keys> > /proc/sysrq-trigger
magic keys
- s: sync(더티 페이지를 디스크로 플러시)
- u: read_only로 리마운트
- t: 현재 태스크를 출력
- b: reboot