모듈을 로드할 때 커널 모듈 함수에서 Systemtap 프로브를 사용하는 방법. 로드 중인 특정 모듈에서 호출되는 함수를 인쇄하려고 합니다. hello.ko
로드되지 않은 커널 모듈이 있다고 가정해 보겠습니다 . 이제 hello_init()
이 모듈의 기능을 추적하고 싶습니다 . 다음 Systemtap 스크립트를 사용해 보았지만 작동하지 않습니다.
주문하다:
stap test10.stp -c "modprobe hello"
--> 아무것도 인쇄되지 않습니다.
시스템 탭 스크립트:
#!/usr/bin/env stap
global traces
probe module("hello").function("hello_init") {
printf("hello")
print_stack(backtrace())
}
커널 모듈:
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
MODULE_LICENSE("GPL");
static int __init hello_init(void)
{
printk(KERN_INFO "Hello world\n");
return 0;
}
static void __exit hello_exit(void)
{
printk(KERN_INFO "Done\n");
}
module_init(hello_init);
module_exit(hello_exit);
답변1
내가 아는 한, 생성된 커널 모듈 로만 staprun
전송하며 , 커널 모듈에서 프로브 기호를 찾을 수 없기 때문에 커널 모듈에서 kprobe 주소를 설정하지 않습니다 . 빠른 "테스트"를 위해 대신 주소를 보낼 수 있으며 두 기능 모두 동일한 서명을 갖기 때문에 작동합니다 .kallsyms_on_each_symbol
int send_relocation_kernel()
staprun.c
kallsyms_on_each_symbol
module_kallsyms_on_each_symbol
kallsyms_on_each_symbol
int send_relocation_kernel()
바꾸다
else if (linesize - pos == sizeof "kallsyms_on_each_symbol"
&& !strcmp(line + pos, "kallsyms_on_each_symbol" "\n"))
{
rc = send_a_relocation ("kernel", "kallsyms_on_each_symbol", address);
그리고
else if (linesize - pos == sizeof "module_kallsyms_on_each_symbol"
&& !strcmp(line + pos, "module_kallsyms_on_each_symbol" "\n"))
{
rc = send_a_relocation ("kernel", "kallsyms_on_each_symbol", address);
이 변경으로 인해 함수의 감지기가 init()
무언가를 인쇄해야 합니다.