printk() 함수

printk() 함수를 호출하면 커널 로그를 볼 수 있습니다.

printk 자료형에 따른 서식 지정

변수 타입 서식 지정자
int %d, %x
unsigned int %u, %x
long %ld, %lx
unsigned long %lu, %lx
long long %lld, %llx
unsigned long long %llu, %llx
size_t %zu, %zx
ssize+t %zd, %zx
s32 %d, %x
u32 %u, %x
s64 %lld, %llx
u64 %llu, %llx

printk()를 이용한 로그레벨 적용 방법

log level

printk(KERN_INFO "info message...\n");
printk("<4>" "warning message...\n");
printk("<3>" error message...\n);
printk("default loglevel...\n");

printk로 함수 심벌 정보를 보는 방법

sourcecode

static void insert_wq_barrier(struct pool_workqueue *pwq,
                              struct wq_barrier *barr,
                              struct work_struct *target, struct worker *worker)
{
        struct list_head *head;
        unsigned int linked = 0;

        printk("[+] process: %s \n", current->comm);
        printk("[+][debug] message [F: %s, L: %d]: caller:(%pS)\n",
                        __func__, __LINE__, (void*)__builtin_return_address(0));
...
  • __func__: 현재 실행 중인 함수의 이름
  • __LINE__:현재 실행 중인 코드 라인
  • __builtin_return_address(0): 현재 실행중인 함수를 호출한 함수의 주소

%pS는 아규먼트로 지정한 주소를 심벌로 변환해 출력합니다.

result

printk

printk를 쓸 때 주의해야 할 점

printk를 사용할 때는 printk의 호출 빈도를 반드시 체크해야 합니다.
리눅스 커널에서 1초에 수백번 이상 호출되는 함수에 printk를 사용하면 시스템이 락업(Lockup)되거나 커널 패닉으로 오동작할 수 있습니다.