handle_pte_fault
Linux カーネルで関数呼び出しを追跡するために kprobe を使用しようとしています。プローブできますhandle_mm_fault
が、プローブしようとするとhandle_pte_dault
、kprobe のハンドラはhandle_pte_fault
何も出力しません。
これを使用して、インラインであり、おそらく静的な関数をプローブできないことがわかりました。そこで、handle_pte_fault
関数の定義を次のように変更し、カーネルを再コンパイルしました。
から:
static int handle_pte_fault(struct vm_fault *vmf)
に:
noinline int handle_pte_fault(struct vm_fault *vmf)
handle_pte_fault
また、シンボルが存在することを確認するために以下を追加しました
EXPORT_SYMBOL_GPL(handle_pte_fault);
それでも、handle_pte_fault 関数を追跡/調査することはできません。任意のヘルプまたは説明。kprobe は一部のランダム関数でしか機能しないということですか?
カーネル v4.13 を使用しています。
以下は、私が使用している kprobe のカーネル モジュール コードです。
#include<linux/module.h>
#include<linux/version.h>
#include<linux/kernel.h>
#include<linux/init.h>
#include<linux/kprobes.h>
static struct kprobe kp;
static const char *probed_func = "handle_pte_fault";
static unsigned int counter = 0;
int Pre_Handler(struct kprobe *p, struct pt_regs *regs){
printk("Pre_Handler: counter=%u\n",counter++);
return 0;
}
void Post_Handler(struct kprobe *p, struct pt_regs *regs, unsigned long flags){
printk("Post_Handler: counter=%u\n",counter++);
}
int myinit(void)
{
printk("module inserted\n ");
kp.pre_handler = Pre_Handler;
kp.post_handler = Post_Handler;
kp.addr = (kprobe_opcode_t *)kallsyms_lookup_name(probed_func);
register_kprobe(&kp);
return 0;
}
void myexit(void)
{
unregister_kprobe(&kp);
printk("module removed\n ");
}
module_init(myinit);
module_exit(myexit);
MODULE_AUTHOR("User1");
MODULE_DESCRIPTION("KPROBE MODULE");
MODULE_LICENSE("GPL");