--ftrace_modify_code(pc, 0,new, false) 如上,ftrace_modify_code通过修改text段,将指令ftrace_call替换为bl ftrace_ops_no_ops,此处是第一次替换; ftrace_modify_all_code(command) --ftrace_replace_code(mod_flags | FTRACE_MODIFY_ENABLE_FL); --do_for_each_ftrace_rec(pg, rec) { __ftrace_rep...
rec, MCOUNT_ADDR);//将bl _mcount对应的指令码替换掉ftrace_check_current_call(rec->ip, call);//校验地址中的内容的合法性ftrace_modify_code(pc, old, new, validate);//这里的new就是nop对应的指令码,old是根据MCOUNT
static int ftrace_update_code(struct module *mod) { …… /* * Do the initial record conversion from mcount jump * to the NOP instructions. */ if (!ftrace_code_disable(mod, p)) break; …… } 3、3运行时修改调用函数 linux-3.12.6\kernel\trace\ftrace.c void ftrace_modify_all_code(in...
/sys/kernel/debug/tracing# echo function > current_tracer[45.632002] CPU:0PID:111Comm: sh Not tainted5.10.0-dirty #35[45.632457] Hardware name: linux,dummy-virt (DT)[45.632697] Call trace:[45.632981] dump_backtrace0x0/0x1f8[45.633169] show_stack0x2c/0x7c[45.634039] ftrace_modify_all_co...
__fentry__+0x10/0x10 [401273.017968] [<ffffffff8a69471d>] warn_slowpath_null+0x1d/0x20 [401273.017970] [<ffffffff8a7574c3>] ftrace_bug+0x223/0x270 [401273.017973] [<ffffffff8a661e11>] ftrace_replace_code+0x2b1/0x420 [401273.017975] [<ffffffff8a757baa>] ftrace_modify_all_code+0x...
ftrace(FunctionTracer)是Linux内核的一个跟踪框架,它从2008年10月9日发布的内核版本2.6.27开始并入Linux内核主线[1]。官方文档[2]中的描述大致翻译如下: ftrace是一个内部跟踪程序,旨在帮助系统的开发人员和设计人员弄清楚内核内部发生的情况。它可以用于调试或分析在用户空间之外发生的延迟和性能问题。虽然ftrace通常被...
#include<linux/ftrace.h>#include<linux/linkage.h>#include<linux/slab.h>#include<linux/uaccess.h>#include<linux/version.h>#if defined(CONFIG_X86_64) && (LINUX_VERSION_CODE >= KERNEL_VERSION(4,17,0))#define PTREGS_SYSCALL_STUBS 1#endif/**我们需要内核函数的原始地址才能HOOK,所以第一步需...
[ 2983.124938] ftrace_modify_all_code (kernel/trace/ftrace.c:2011) [ 2983.126208] arch_ftrace_update_code (arch/x86/include/asm/atomic.h:103 arch/x86/kernel/ftrace.c:680) [ 2983.127613] ftrace_run_update_code (kernel/trace/ftrace.c:2088) ...
void arch_ftrace_update_code(int command) { ftrace_modify_all_code(command); }/* Currently only x86_64 supports dynamic trampolines */ #ifdef CONFIG_X86_64#ifdef CONFIG_MODULES #include <linux/moduleloader.h> /* Module allocation simplifies allocating memory for code */ static inline void *...
void ftrace_modify_all_code(int command); #ifndef FTRACE_ADDR #define FTRACE_ADDR ((unsigned long)ftrace_caller) #endif #ifndef FTRACE_GRAPH_ADDR #define FTRACE_GRAPH_ADDR ((unsigned long)ftrace_graph_caller) #endif #ifndef FTRACE_REGS_ADDR ...