Systemtap은 모듈을 로드할 때 커널 모듈 기능을 감지합니다.

Systemtap은 모듈을 로드할 때 커널 모듈 기능을 감지합니다.

모듈을 로드할 때 커널 모듈 함수에서 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_symbolint send_relocation_kernel()staprun.ckallsyms_on_each_symbolmodule_kallsyms_on_each_symbolkallsyms_on_each_symbolint 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()무언가를 인쇄해야 합니다.

관련 정보