글 수 12
토요일날 술자리에서 잠깐 말이나온 systemtap 관련해서 tip/tech에 해당내용을 올리겠습니다.
모든분들이 다 아시는 내용일수 있는데, 혹시 보시고 틀린부분있으면 지적바랍니다.
먼저 systemtap을 사용할려먼, kernel-debuginfo패키지와 systemtap 패키지를 인스톨하셔야 합니다.
그리고 systemtap은 스크립트와 같은 언어로 되어 있습니다.
다음은 샘플프로그램입니다.
#! /usr/bin/env stap
# Usage: ./keyhack.stp -g
probe kernel.function("kbd_event") {
s = sprintf("%dn", $event_code)
printf("%s", s)
}
probe end {
printf("nDONEn")
}
위의 소스는 systemtap의 sample 소스 입니다
원본 소스는 m키 값을 b키 값으로 바꾸는 소스인데요
제가 그냥 출력으로 바꾸었습니다.
밑에 보시면 "probe end {" 부분이 있는데요, 이부분이 프로그램을 종료 할때 호출되는 부분입니다, 물론 시작할때 호출되는 부분은 "probe begin" 이로 선언하면 됩니다.
근데, 위의 부분에서는 시작 부분이 필요가 없어서 사용을 안하였습니다.
그리고 "probe kernel.function("kbd_event") {" 부분이 실제로 보고자 하는 커널 함수를 등록하는 부분입니다. 위의 소스에서는 커널의 "kbd_event"을 보고자 해서 등록을 하였습니다.
그리고 함수 원형은 "static void kbd_event(struct input_handle *handle, unsigned int vent_type, unsigned int event_code, int value)" 다음과 같습니다.
그리고 소스 중간에 보시면은 "s = sprintf("%dn", $event_code)" 부분이 있는데 이 부분은 함수 원형의 인자로 "event_code" 값을 s라는 버퍼로 저장하라는 의미입니다.
그리고 바로 밑은 그냥 출력입니다.....
그리고 제가 여기서 문법을 모두 설명하기가 힘들거 같습니다.
자세한 내용은 다음(http://sourceware.org/systemtap/documentation.html)싸이트를 참조 하시면 될꺼 같습니다.
그리고 예상하셨든이 systemtap은 커널의 kprobes을 이용하여 위의 작업을 합니다.
kprobe관련 자료는 리눅스 소스에 "linux/Documentation/kprobes.txt에 있습니다.
systemtap을 사용안하셔도 kprobes을 이용하면 해당작업을 할수 있습니다.
모든분들이 다 아시는 내용일수 있는데, 혹시 보시고 틀린부분있으면 지적바랍니다.
먼저 systemtap을 사용할려먼, kernel-debuginfo패키지와 systemtap 패키지를 인스톨하셔야 합니다.
그리고 systemtap은 스크립트와 같은 언어로 되어 있습니다.
다음은 샘플프로그램입니다.
#! /usr/bin/env stap
# Usage: ./keyhack.stp -g
probe kernel.function("kbd_event") {
s = sprintf("%dn", $event_code)
printf("%s", s)
}
probe end {
printf("nDONEn")
}
위의 소스는 systemtap의 sample 소스 입니다
원본 소스는 m키 값을 b키 값으로 바꾸는 소스인데요
제가 그냥 출력으로 바꾸었습니다.
밑에 보시면 "probe end {" 부분이 있는데요, 이부분이 프로그램을 종료 할때 호출되는 부분입니다, 물론 시작할때 호출되는 부분은 "probe begin" 이로 선언하면 됩니다.
근데, 위의 부분에서는 시작 부분이 필요가 없어서 사용을 안하였습니다.
그리고 "probe kernel.function("kbd_event") {" 부분이 실제로 보고자 하는 커널 함수를 등록하는 부분입니다. 위의 소스에서는 커널의 "kbd_event"을 보고자 해서 등록을 하였습니다.
그리고 함수 원형은 "static void kbd_event(struct input_handle *handle, unsigned int vent_type, unsigned int event_code, int value)" 다음과 같습니다.
그리고 소스 중간에 보시면은 "s = sprintf("%dn", $event_code)" 부분이 있는데 이 부분은 함수 원형의 인자로 "event_code" 값을 s라는 버퍼로 저장하라는 의미입니다.
그리고 바로 밑은 그냥 출력입니다.....
그리고 제가 여기서 문법을 모두 설명하기가 힘들거 같습니다.
자세한 내용은 다음(http://sourceware.org/systemtap/documentation.html)싸이트를 참조 하시면 될꺼 같습니다.
그리고 예상하셨든이 systemtap은 커널의 kprobes을 이용하여 위의 작업을 합니다.
kprobe관련 자료는 리눅스 소스에 "linux/Documentation/kprobes.txt에 있습니다.
systemtap을 사용안하셔도 kprobes을 이용하면 해당작업을 할수 있습니다.
예전에 솔라리스 진영에서 유명한 dtrace의 리눅스 버전을 찾다가 알게 되었는데, 눈독만 들여놓고 아직 써보진 못하고 있습니다. 이거 한번 익혀놓으면 여러모로 쓸모있을듯 합니다. 커널 소스 분석 스터디에 systemtap 활용 해보면 재밌을것 같네요.
시간나시면 systemtap 사용법 세미나라도 한번 해주심이? ^^