乐于分享
好东西不私藏

不碰内核源码也能"改"内核?聊聊 ftrace 函数挂钩那点事儿

不碰内核源码也能"改"内核?聊聊 ftrace 函数挂钩那点事儿

一、先整明白:这技术到底在干嘛?

咱们平时写的程序,调个 printf、发个网络请求,底层其实都在麻烦操作系统内核帮忙干活。内核里有一大堆"服务窗口"——也就是系统调用,比如 clone(创建进程)、execve(执行程序)这些。

那如果我想在内核处理这些请求的时候,插一脚自己的逻辑——比如记录个日志、拦下可疑操作、或者改改参数——该咋办?

最笨的办法是改内核源码,重新编译,重启机器。这太折腾了,而且生产环境谁让你随便重启?

这时候就轮到 ftrace 函数挂钩 登场了。简单说,它就是一个"动态拦截器":你写一个内核模块塞进去,不用改内核源码,不用重启,就能让内核在执行某个函数时,先(或后)执行你写的代码。完事儿还能继续走原来的逻辑,仿佛什么都没发生。

听起来有点像黑客技术?其实正经用途多得很:安全审计、行为监控、动态调试、甚至内核热补丁,底层都是这套思路。


二、核心思路:在函数门口"改道"

要理解这玩意儿怎么工作的,得先知道内核函数被调用时,CPU 在干啥。

在 x86_64 架构上,内核编译时默认会在每个函数开头塞一段小逻辑(跟 -pg 编译选项有关,也就是 mcount 机制)。这段逻辑原本是用来做性能分析的——ftrace 本身就是 Linux 里一个很强的跟踪框架。

正常情况下,ftrace 只是"看看":记录一下"函数 A 被调用了,耗时多少",然后放行。

但聪明的人们发现:既然已经能在函数门口拦住 CPU 了,那能不能直接告诉 CPU:"你别去原来那个函数了,去我指定的那个地址!"

答案是:能。而且方法就是直接改 CPU 的"指路牌"——指令指针寄存器(rip

当 ftrace 的回调被触发时,内核会把当前的寄存器状态(保存在 struct pt_regs 里)传给你。你只需要把 regs->ip(也就是下一条要执行的指令地址)改成你自己函数的地址,CPU 就会乖乖转去执行你的代码。

这就是整个技术的灵魂:借 ftrace 的"跟踪"能力,做"劫持"的事儿。


三、代码里都在忙什么?逐段拆解

...
structftrace_hook {
constchar *name;
void *function;
void *original;

unsignedlong address;
structftrace_opsops;
};

staticintfh_resolve_hook_address(struct ftrace_hook *hook)
{
 hook->address = lookup_name(hook->name);

if (!hook->address) {
  pr_debug("unresolved symbol: %s\n", hook->name);
return -ENOENT;
 }

#if USE_FENTRY_OFFSET
 *((unsignedlong*) hook->original) = hook->address + MCOUNT_INSN_SIZE;
#else
 *((unsignedlong*) hook->original) = hook->address;
#endif

return0;
}

staticvoid notrace fh_ftrace_thunk(unsignedlong ip, unsignedlong parent_ip,
  struct ftrace_ops *ops, struct ftrace_regs *fregs)

{
structpt_regs *regs = ftrace_get_regs(fregs);
structftrace_hook *hook = container_of(opsstructftrace_hookops);

#if USE_FENTRY_OFFSET
 regs->ip = (unsignedlong)hook->function;
#else
if (!within_module(parent_ip, THIS_MODULE))
  regs->ip = (unsignedlong)hook->function;
#endif
}


intfh_install_hook(struct ftrace_hook *hook)
{
int err;

 err = fh_resolve_hook_address(hook);
if (err)
return err;

 hook->ops.func = fh_ftrace_thunk;
 hook->ops.flags = FTRACE_OPS_FL_SAVE_REGS
                 | FTRACE_OPS_FL_RECURSION
                 | FTRACE_OPS_FL_IPMODIFY;

 err = ftrace_set_filter_ip(&hook->ops, hook->address, 00);
if (err) {
  pr_debug("ftrace_set_filter_ip() failed: %d\n", err);
return err;
 }

 err = register_ftrace_function(&hook->ops);
if (err) {
  pr_debug("register_ftrace_function() failed: %d\n", err);
  ftrace_set_filter_ip(&hook->ops, hook->address, 10);
return err;
 }

return0;
}


voidfh_remove_hook(struct ftrace_hook *hook)
{
int err;

 err = unregister_ftrace_function(&hook->ops);
if (err) {
  pr_debug("unregister_ftrace_function() failed: %d\n", err);
 }

 err = ftrace_set_filter_ip(&hook->ops, hook->address, 10);
if (err) {
  pr_debug("ftrace_set_filter_ip() failed: %d\n", err);
 }
}


intfh_install_hooks(struct ftrace_hook *hooks, size_t count)
{
int err;
size_t i;

for (i = 0; i < count; i++) {
  err = fh_install_hook(&hooks[i]);
if (err)
goto error;
 }

return0;

error:
while (i != 0) {
  fh_remove_hook(&hooks[--i]);
 }

return err;
}


voidfh_remove_hooks(struct ftrace_hook *hooks, size_t count)
{
size_t i;

for (i = 0; i < count; i++)
  fh_remove_hook(&hooks[i]);
}

#ifndef CONFIG_X86_64
#error Currently only x86_64 architecture is supported
#endif

#if defined(CONFIG_X86_64) && (LINUX_VERSION_CODE >= KERNEL_VERSION(4,17,0))
#define PTREGS_SYSCALL_STUBS 1
#endif


#if !USE_FENTRY_OFFSET
#pragma GCC optimize("-fno-optimize-sibling-calls")
#endif

#ifdef PTREGS_SYSCALL_STUBS
static asmlinkage long(*real_sys_clone)(struct pt_regs *regs);

static asmlinkage longfh_sys_clone(struct pt_regs *regs)
{
long ret;

 pr_info("clone() before\n");

 ret = real_sys_clone(regs);

 pr_info("clone() after: %ld\n", ret);

return ret;
}
#else
static asmlinkage long(*real_sys_clone)(unsignedlong clone_flags,
unsignedlong newsp, int __user *parent_tidptr,
int __user *child_tidptr, unsignedlong tls)
;

static asmlinkage longfh_sys_clone(unsignedlong clone_flags,
unsignedlong newsp, int __user *parent_tidptr,
int __user *child_tidptr, unsignedlong tls)

{
long ret;

 pr_info("clone() before\n");

 ret = real_sys_clone(clone_flags, newsp, parent_tidptr,
  child_tidptr, tls);

 pr_info("clone() after: %ld\n", ret);

return ret;
}
#endif

staticchar *duplicate_filename(constchar __user *filename)
{
char *kernel_filename;

 kernel_filename = kmalloc(4096, GFP_KERNEL);
if (!kernel_filename)
returnNULL;

if (strncpy_from_user(kernel_filename, filename, 4096) < 0) {
  kfree(kernel_filename);
returnNULL;
 }

return kernel_filename;
}

#ifdef PTREGS_SYSCALL_STUBS
static asmlinkage long(*real_sys_execve)(struct pt_regs *regs);

static asmlinkage longfh_sys_execve(struct pt_regs *regs)
{
long ret;
char *kernel_filename;

 kernel_filename = duplicate_filename((void*) regs->di);

 pr_info("execve() before: %s\n", kernel_filename);

 kfree(kernel_filename);

 ret = real_sys_execve(regs);

 pr_info("execve() after: %ld\n", ret);

return ret;
}
#else
static asmlinkage long(*real_sys_execve)(constchar __user *filename,
constchar __user *const __user *argv,
constchar __user *const __user *envp)
;

static asmlinkage longfh_sys_execve(constchar __user *filename,
constchar __user *const __user *argv,
constchar __user *const __user *envp)

{
long ret;
char *kernel_filename;

 kernel_filename = duplicate_filename(filename);

 pr_info("execve() before: %s\n", kernel_filename);

 kfree(kernel_filename);

 ret = real_sys_execve(filename, argv, envp);

 pr_info("execve() after: %ld\n", ret);

return ret;
}
#endif


#ifdef PTREGS_SYSCALL_STUBS
#define SYSCALL_NAME(name) ("__x64_" name)
#else
#define SYSCALL_NAME(name) (name)
#endif

#define HOOK(_name, _function, _original) \
 {     \
  .name = SYSCALL_NAME(_name), \
  .function = (_function), \
  .original = (_original), \
 }


staticstructftrace_hookdemo_hooks[] = {
 HOOK("sys_clone",  fh_sys_clone,  &real_sys_clone),
 HOOK("sys_execve", fh_sys_execve, &real_sys_execve),
};

staticintfh_init(void)
{
int err;

 err = fh_install_hooks(demo_hooks, ARRAY_SIZE(demo_hooks));
if (err)
return err;

 pr_info("module loaded\n");

return0;
}
module_init(fh_init);

staticvoidfh_exit(void)
{
 fh_remove_hooks(demo_hooks, ARRAY_SIZE(demo_hooks));

 pr_info("module unloaded\n");
}
module_exit(fh_exit);


If you need the complete source code, please add the WeChat number (c17865354792)

咱们结合代码,看看一个完整的挂钩模块是怎么搭起来的。整个过程可以分成四步:找地址 → 填钩子 → 改道 → 防递归

第一步:找到你要拦的函数在哪

内核函数编译后都是二进制地址,你得先知道目标函数的"门牌号"。代码里用了两种办法:

  • 老内核(< 5.7):直接调用 kallsyms_lookup_name("sys_clone"),查内核符号表。
  • 新内核(≥ 5.7):内核把这张表藏起来了,那就临时注册一个 kprobe,让它帮忙查地址,查完就注销。
// 伪代码示意
hook->address = lookup_name("sys_clone");

拿到地址后,顺手把原始函数的指针保存一份,方便后面调用。

第二步:定义"钩子"结构

代码里定义了一个 ftrace_hook 结构体,把必要信息打包:

structftrace_hook {
constchar *name;      // 要挂钩的函数名
void *function;        // 你的替换函数
void *original;        // 原始函数指针的存放位置
unsignedlong address; // 解析出来的地址
structftrace_opsops;// ftrace 需要的状态
};

第三步:写回调函数——这是真正"改道"的地方

staticvoid notrace fh_ftrace_thunk(unsignedlong ip, unsignedlong parent_ip,
        struct ftrace_ops *ops, struct ftrace_regs *fregs)

{
structpt_regs *regs = ftrace_get_regs(fregs);
structftrace_hook *hook = container_of(opsstructftrace_hookops);

if (!within_module(parent_ip, THIS_MODULE))
        regs->ip = (unsignedlong)hook->function;
}

这段是精华:

  • ftrace_get_regs 拿到寄存器快照。
  • container_of 从 ftrace_ops 反推出我们自己的 ftrace_hook 结构。
  • 关键一行regs->ip = hook->function,直接把 CPU 的下一步指向了我们的函数。
  • within_module(parent_ip, THIS_MODULE) 是在检查:调用者是不是我自己? 如果是,就别再改了,否则会死循环(后面细说)。

第四步:注册到 ftrace 框架

hook->ops.func = fh_ftrace_thunk;
hook->ops.flags = FTRACE_OPS_FL_SAVE_REGS      // 要保存寄存器
                | FTRACE_OPS_FL_RECURSION      // 关掉 ftrace 自带的递归保护(我们自己管)
                | FTRACE_OPS_FL_IPMODIFY;      // 允许修改指令指针

ftrace_set_filter_ip(&hook->ops, hook->address, 00); // 只盯这个地址
register_ftrace_function(&hook->ops);                  // 上线!

这里几个标志位很重要:

  • SAVE_REGS:不保存寄存器,你改啥?
  • IPMODIFY:告诉 ftrace 我要改 ip,别拦我。
  • RECURSION:关掉 ftrace 自己的防递归,因为我们要改 ip,它那个机制反而碍事。

四、流程原理图

咱们把一次完整的挂钩过程画清楚:

用户进程调用 clone()
        │
        ▼
┌─────────────────┐
│  进入内核态      │
│  走到 sys_clone  │
│  函数入口处      │
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│ mcount 触发     │
│ ftrace 回调     │
│ fh_ftrace_thunk │
└────────┬────────┘
         │
         ▼
    [检查 parent_ip]
         │
    ┌────┴────┐
    ▼         ▼
  是模块内    不是模块内
  自己人?    别人调的?
    │         │
    ▼         ▼
  直接放行   修改 regs->ip
  不干预     指向 fh_sys_clone
    │         │
    └────┬────┘
         ▼
┌─────────────────┐
│ 执行 fh_sys_clone │
│ (你的自定义逻辑) │
│  打印日志等...    │
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│ 调用 real_sys_clone│
│ (保存的原始函数) │
│  真正干活的逻辑   │
└────────┬────────┘
         │
         ▼
    返回结果
         │
         ▼
    回到用户态

五、那个"防递归"到底在防啥?

这是最容易踩坑的地方。

假设你已经把 sys_clone 挂上了,你的替换函数叫 fh_sys_clonefh_sys_clone 里面为了完成工作,又调用了 real_sys_clone

但你想过没有:**real_sys_clone 本质上就是 sys_clone 本身啊!**

所以 CPU 走到 real_sys_clone 门口,ftrace 又触发了,又把 regs->ip 改成 fh_sys_clone……于是 fh_sys_clone 又执行一遍,又调用 real_sys_clone……无限套娃,内核直接栈溢出挂掉。

代码里的解决办法很巧妙:看 parent_ip(调用者的地址)。如果调用者就在咱们这个内核模块内部(within_module(parent_ip, THIS_MODULE)),说明这次触发是自己人调用引起的,直接放行,不改道

这就打破了循环:只有外部调用才会被拦截,内部调用走原路。


六、系统调用的"变脸"问题

代码里有一大堆 #ifdef PTREGS_SYSCALL_STUBS,这是因为在 Linux 4.17 之后,x86_64 的系统调用入口变了。

以前 sys_clone 参数是散的(clone_flagsnewsp...),后来统一改成只传一个 struct pt_regs *regs,寄存器里的参数自己拆。代码里做了兼容处理:

  • 新内核:从 regs->di 里拿第一个参数(比如 execve 的文件名)。
  • 老内核:直接接参数。

这也是为什么代码里 duplicate_filename 要专门从用户态拷字符串到内核态——内核里不能直接操作用户空间的指针,得用 strncpy_from_user 安全地复制一份。

七、测试运行

加载模块

sudo insmod ftrace_hook.ko

如果没有任何报错,说明加载成功了

看效果

开两个终端:

终端 1 - 实时监控内核日志:

sudo dmesg -w

终端 2 - 随便执行点命令触发系统调用:

ls
pwd
echo"hello"

然后回头看终端 1,你会看到类似输出:

[  123.456789] ftrace_hook: module loaded
[  145.123456] ftrace_hook: clone() before
[  145.123789] ftrace_hook: clone() after: 12345
[  145.234567] ftrace_hook: execve() before: /usr/bin/ls
[  145.235012] ftrace_hook: execve() after: 0

每执行一个命令,就会触发一次 execve;每创建一个新进程(比如 ls 本身可能 fork),就会触发 clone


卸载模块

sudo rmmod ftrace_hook

再看 dmesg

[  200.987654] ftrace_hook: module unloaded

总结

ftrace 原本只是个"看门"的跟踪工具,但借助修改寄存器的能力,它成了一个"守门"的利器。整个方案最精妙的地方在于:完全没有修改内核的任何代码,只是借用了既有的跟踪基础设施,就实现了对内核执行流的动态控制。

当然,玩内核模块有风险,建议在虚拟机里折腾。而且内核版本迭代很快,kallsyms 藏起来了、ftrace_regs 结构变了、系统调用传参方式改了……这些坑代码里都已经帮你踩了一遍,读的时候多留意那些 #if LINUX_VERSION_CODE 的条件编译,那就是一本活脱脱的"内核 API 变迁史"。

搞懂了这套机制,你对 Linux 内核的执行流程、中断处理、系统调用这些概念,基本就打通任督二脉了。

Welcome to follow WeChat official account【程序猿编码

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-05-10 01:23:08 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/597877.html
  2. 运行时间 : 0.109091s [ 吞吐率:9.17req/s ] 内存消耗:4,742.81kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=c42671ac8513a75ac9098dfec4b9b09e
  1. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_static.php ( 6.05 KB )
  7. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/ralouphie/getallheaders/src/getallheaders.php ( 1.60 KB )
  10. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  11. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  12. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  13. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  14. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  15. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  16. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  17. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  18. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  19. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions_include.php ( 0.16 KB )
  21. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions.php ( 5.54 KB )
  22. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  23. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  24. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  25. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/provider.php ( 0.19 KB )
  26. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  27. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  28. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  29. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/common.php ( 0.03 KB )
  30. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  32. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/alipay.php ( 3.59 KB )
  33. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  34. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/app.php ( 0.95 KB )
  35. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cache.php ( 0.78 KB )
  36. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/console.php ( 0.23 KB )
  37. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cookie.php ( 0.56 KB )
  38. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/database.php ( 2.48 KB )
  39. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/filesystem.php ( 0.61 KB )
  40. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/lang.php ( 0.91 KB )
  41. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/log.php ( 1.35 KB )
  42. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/middleware.php ( 0.19 KB )
  43. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/route.php ( 1.89 KB )
  44. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/session.php ( 0.57 KB )
  45. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/trace.php ( 0.34 KB )
  46. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/view.php ( 0.82 KB )
  47. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/event.php ( 0.25 KB )
  48. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  49. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/service.php ( 0.13 KB )
  50. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/AppService.php ( 0.26 KB )
  51. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  52. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  53. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  54. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  55. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  56. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/services.php ( 0.14 KB )
  57. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  58. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  59. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  60. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  61. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  62. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  63. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  64. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  65. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  66. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  67. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  68. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  69. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  70. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  71. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  72. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  73. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  74. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  75. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  76. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  77. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  78. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  79. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  80. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  81. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  82. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  83. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  84. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  85. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  86. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  87. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/Request.php ( 0.09 KB )
  88. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  89. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/middleware.php ( 0.25 KB )
  90. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  91. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  92. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  93. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  94. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  95. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  96. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  97. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  98. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  99. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  100. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  101. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  102. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  103. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/route/app.php ( 3.94 KB )
  104. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  105. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  106. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Index.php ( 9.87 KB )
  108. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/BaseController.php ( 2.05 KB )
  109. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  110. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  111. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  112. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  113. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  114. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  115. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  116. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  117. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  118. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  119. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  120. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  121. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  122. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  123. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  124. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  125. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  126. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  127. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  128. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  129. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  130. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  131. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  132. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  133. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  134. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  135. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Es.php ( 3.30 KB )
  136. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  137. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  138. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  139. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  140. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  141. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  142. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  143. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  144. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/runtime/temp/c935550e3e8a3a4c27dd94e439343fdf.php ( 31.50 KB )
  145. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000478s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000559s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.002478s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.002776s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000787s ]
  6. SELECT * FROM `set` [ RunTime:0.003143s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000830s ]
  8. SELECT * FROM `article` WHERE `id` = 597877 LIMIT 1 [ RunTime:0.002811s ]
  9. UPDATE `article` SET `lasttime` = 1778347388 WHERE `id` = 597877 [ RunTime:0.002595s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000289s ]
  11. SELECT * FROM `article` WHERE `id` < 597877 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000575s ]
  12. SELECT * FROM `article` WHERE `id` > 597877 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000602s ]
  13. SELECT * FROM `article` WHERE `id` < 597877 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.003787s ]
  14. SELECT * FROM `article` WHERE `id` < 597877 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.002475s ]
  15. SELECT * FROM `article` WHERE `id` < 597877 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.001365s ]
0.111042s