23.11.22 최초 작성
23.11.24 crash utility 추가
23.11.28 ftrace message 추가
printf
와 같은 커널 출력 함수kernel 로그
를 출력 / 중요 동작을 출력하는 데 사용printk
추가#include <linux/module.h>
#include <linux/kernel.h>
int init_module(void){
printk(KERN_INFO "Hello world 1.\n");
return 0;
}
void cleanup_module(void){
printk(KERN_INFO "Goodbye world 1.\n);
}
printk
에 의해 출력하는 범위가 달라짐낮음/적음
↔ 높음/많음
)KERN_WARNING
#define KERN_EMERG "<0>" /* system is unusable */
#define KERN_ALERT "<1>" /* action must be taken immediately */
#define KERN_CRIT "<2>" /* critical conditions */
#define KERN_ERR "<3>" /* error conditions */
#define KERN_WARNING "<4>" /* warning conditions */
#define KERN_NOTICE "<5>" /* normal but significant condition */
#define KERN_INFO "<6>" /* informational */
#define KERN_DEBUG "<7>" /* debug-level messages */
echo 7 > /proc/sys/kernel/printk //로그레벨 설정
cat /proc/sys/kernel/printk
>7 4 1 3
//current, default, minimum, boot-time-default
dmesg -n 5 //터미널을 통해 로그레벨 설정
#include <linux/kernel.h>
dump_stack();
SysRq
키를 입력하면 특정 동작을 작동시킴echo -<키> > /proc/sysrq-trigger
-s : sync
-u : read-only로 리마운트
-t : 현재 태스크 출력
-c : 커널 크래시 유발
-b : 재부팅
Interrupt
, Scheduling
, Workqueue
와 같은 커널의 세부 동작 트레이싱Context
, CPU 번호
, 프로세스 정보
확인 가능printk
에 비해 오버헤드가 적은 편CONFIG_FTRACE=y
CONFIG_DYNAMIC_FTRACE=y
CONFIG_FUNCTION_TRACER=y
CONFIG_FUNCTION_GRAPH_TRACER=y
CONFIG_IRQSOFF_TRACER=y
CONFIG_SCHED_TRACER=y
CONFIG_FUNCTION_PROFILER=y
set_ftrace_filter
에서 트레이싱 하려는 함수 이름 지정 (function
, function_graph
일 경우만 지정)
avaiable_filter_functions
파일에 포함된 함수만 지정 가능echo schedule > /sys/kernel/debug/tracing/set_ftrace_filter
tracing_on
활성화echo 0 > /sys/kernel/debug/tracing/tracing_on //비활성화
//함수 지정
echo 1 > /sys/kernel/debug/tracing/events/irq/irq_handler_exit/enable
echo 1 > /sys/kernel/debug/tracing/tracing_on //활성화
nop
: ftrace 이벤트만 출력function
: set_ftrace_filter
로 지정한 함수를 누가 호출했는지 출력function_graph
: 함수 실행 시간과 세부 호출 정보를 그래프 모맷으로 출력kworker/u8:2-122 [000] d.h. 16248.689423: irq_handler_entry: irq=86 name=mmc1
kworker/u8:2-122 [000] d.h. 16248.689511: irq_handler_exit: irq=86 ret=handled
kworker/u8:2-122
: pid가 122인 kworker/u8:2가 실행하는 중 인터럽트 발생[000] d.h.
: 0번 cpu의 컨텍스트 정보로 각각 다음과 같은 정보를 나타냄d
: cpu의 인터럽트를 비활성화한 상태n
: 현재 프로세스가 선점 스케줄링 될 수 있는 상태h
/ s
: h이면 인터럽트 컨텍스트, s면 Soft IRQ 컨텍스트16248.689423
~ 16248.689511
: 인터럽트가 16248.689423초에 시작해 16248.689511초에 끝남irq=86
: 86번 인터럽트 핸들러 실행gdb
로 디버깅할 수 있는 프로그램sudo apt install linux-crashdump
sudo apt install kexec-tools
sudo apt install linux-crashdump
sudo apt install kdump-tools
crash -v
$crash //crash 모드 진입
crash> help //명령어 확인
crash> log -m //커널 로그 확인
crash> ps //실행중인 프로세스 상태 출력
crash> bt //실행중인 프로세스 정보 출력
crash> task //(실행중인) 프로세스관련 구조체 정보 확인
crash> vm //(실행중인) 프로세스관련 구조체의 메모리 정보 확인
crash> kmem //(실행중인) 커널 메모리와 관련된 정보 출력
crash> task //실행중인 프로세스관련 구조체 정보 확인
crash> sym //커널의 심볼 정보 출력