커널 3.14의 릴리즈를 보다 보니 또 재미있는게 하나 있습니다.

  바로 이것...


1.4. Trigger support for tracing events

The tracing infastructure in the Linux kernel allows to easily register probe functions as events (for more details, see Documentation/trace/events.txt. This release allows these events to conditionally trigger "commands". These commands can take various forms, examples would be enabling or disabling other trace events or invoking a stack trace whenever the trace event is hit. Any given trigger can additionally have an event filter, the command will only be invoked if the event being invoked passes the associated filter.

For example, the following trigger dumps a stacktrace the first 5 times a kmalloc request happens with a size >= 64K:

  

쉽게 말해서 커널에 디버깅을 하고 싶은데 특정한 이벤트 발생시에만 트리거가 되도록 실시간으로 설정할수 있는 기능입니다.

생각보다 많은 것들에 이러한 설정을 할수 있다는 데에 놀라긴 했습니다.


 혹시 리눅스를 사용하고 계시다면 

cat /sys/kernel/debug/tracing/available_events

의 파일을 보시면 네트워크, 시스템 콜, 블록드라이버, 전원, 모듈등에 트리거를 걸수 있는 옵션들이 있습니다.


그럼 이걸 어떻게 쓰느냐?

위의 파일에 가능한 리스트가 쭉 나옵니다.

예제를 보면 


  # echo 'stacktrace:5 if bytes_req >= 65536' > \

/sys/kernel/debug/tracing/events/kmem/kmalloc/trigger


위의 내용은 kmalloc 에서 요청받은 크기가 65536 보다 같거나 크면 

stacktrace 를 5번 실행한다는 것입니다.

기존의 위의 디렉토리에 보시면 사용가능한 포맷이 있습니다.


# cat /sys/kernel/debug/tracing/events/kmem/kmalloc/format

쭈욱 나오는데 그중에 bytes_req 가 있습니다

그 값이 65536 보다 같거나 크면 메모리 할당시에 stacktrace 를 실행하게 되는 형태입니다.


트레이스와 관련된 event 에 대해서 궁금하시면 아래의 문서에 자세히 나와 있습니다.

커널 소스 > Documentation/trace/events.txt