티스토리 뷰

이번 포스팅에는 커널 내부 로직을 디버깅하는 방법에 대해 알아보겠습니다!

하나의 잘 만들어진 라이브러리나 툴을 정확히 이해하기 위해서는 내부 로직을 파악하는 것이 굉장히 중요합니다. 어떤 함수가 어떤 함수를 호출하는지, 어떤 인자를 받아와 처리하는지, 어떤 값을 반환해주는지와 같은 정보를 파악하며 이해한다면 좀 더 수월하게 이해할 수 있습니다.

 

또한, 이미 존재하고 있는 라이브러리나 툴을 필요에 따라 개선시키기 위해서는 내부 로직을 파악하는 것이 필수적입니다. 이번에 리눅스 device mapper를 개선하기 위해 사용했던 방법을 소개하겠습니다.


- printk

커널 내부에서 printk 사용법

먼저 printk입니다. printk는 c언어에서 익숙한 printf와 사용법이 동일합니다. 말 그대로 printk -> kernel에서 사용하는 print 입니다.

사용방법은 굉장히 간단합니다. printf로 출력하는 것과 같이 문자열과 타입에 따른 값도 출력할 수 있습니다.

printk를 이용해 로직 내부에서 출력하고 싶은 곳에 printk 문을 넣은 후 커널을 재컴파일하여 reboot하면 확인할 수 있습니다. 당연히 해당 라이브러리나 툴을 실행시켰을 때 확인할 수 있습니다.

커널 메시지를 확인하는 방법은 dmesg를 이용하면 됩니다. 터미널에 sudo dmesg를 입력하여 보거나 /var/log/syslog 파일을 열어보면  확인할 수 있습니다.

 

dmesg를 입력하면 아래 사진과 같이 확인할 수 있습니다 ! 아래 사진 출력문은 모두 printk로 출력하였습니다.


- ftrace(trace_printk)

리눅스에서는 커널 내부 동작을 파악하기 위해 ftrace라는 기능을 제공합니다. Ftrace 기능을 활용할 때 trace_printk를 함께 이용하면 더 쉽게 이해할 수 있습니다. Ftrace는 function, event, latency, stack 들을 tracing 할 수 있습니다. 사용법은 /sys/kernel/debug/tracing 아래에 특정 값들을 넣어서 사용합니다. 반드시 루트 권한으로 접근해야 합니다 !

/sys/kernel/debug/tracing 디렉토리에 있는 파일입니다. 다양한 tracing setting 값을 확인할 수 있고, 사용하고 싶은 변수에 값을 넣어주면 설정할 수 있습니다. current_tracer에 function을 쓰면 기본적인 function 트레이싱을 하고, function_graph를 쓰면 그래프 형태로 function 트레이싱을 합니다.

echo "function_graph" > current_tracer

echo "function_graph" > current_tracer 로 값을 넣어줄 수 있습니다.

 

echo 1 > tracing_on

echo 0 > tracing_on

echo 1 > tracing_on 명렁어로 tracing을 시작할 수 있고 0을 넣으면 tracing이 종료됩니다. Tracing한 결과는 trace 파일에 저장됩니다. trace파일은 overwrite되기 때문에 적절히 비워서 보는 것이 편리합니다. 저는 function_graph가 함수들간의 호출하는 부분을 잘 보여주는 것 같아서 주로 function_graph를 tracer로 사용하였습니다 ! 위 사진에서 보는 것 특정 pid만 trace할 수도 있고, 특정 이름이 들어간 함수들만 trace할 수도 있으니 다양하게 활용하시면 좋을 것 같습니다. Tracing하며 참고한 게시글 링크를 아래에 달아두겠습니다.

 

Ftrace에서도 printk를 사용할 수 있습니다. 위에서 설명한 printk와 사용법이 같습니다. 원하는 함수 내부 로직에서 출력하고 싶은 곳에 trace_printk("this is a point that i want to show!!\n");와 같이 써줍니다. trace_printk의 결과도 ftrace 결과를 보는 것과 같이 trace 결과 파일내에 존재합니다. Trace 파일에서 trace_printk를 써놓은 함수가 호출되어 실행되는 부분에서 확인할 수 있습니다 !

 

 

 

 

 

 

 

 

 

 

Referenct

https://medium.com/@hyoje420/linux-ftrace-%EC%82%AC%EC%9A%A9%EB%B2%95-31b4dc7ac93c

댓글