当前位置:首页>Linux>linux如何定位内存泄漏问题

linux如何定位内存泄漏问题

  • 2026-03-26 07:34:59
linux如何定位内存泄漏问题
本文是转帖文章,转帖自linux如何定位内存泄漏问题

前言:内存泄漏的危害与定位痛点

在 Linux 原生应用开发中(尤其是 C/C++),内存泄漏如同潜伏的 “内存吸血鬼”—— 进程通过malloc/new申请堆内存后,若未通过free/delete释放,这些内存会被永久占用且无法回收。短期内,应用可能仅表现为内存缓慢增长,看似 “无影响”;但长期部署后,会引发一系列连锁灾难:

  • 系统空闲内存持续枯竭,触发Swap 频繁抖动(内存与磁盘频繁交换数据),导致应用响应速度骤降;

  • 当内存耗尽时,Linux 内核的 OOM Killer 会直接终止进程,造成服务崩溃

  • 内存紧张还会间接挤压 Buffer/Cache 空间,导致磁盘 I/O 性能下降,形成 “性能雪崩”。

更棘手的是,内存泄漏的 “隐蔽性” 极强:短期测试难以复现,且需精准区分 “业务正常占用的内存” 与 “泄漏的无效内存”。本文基于 Ubuntu 18.04 环境(兼容 CentOS、Debian 等主流发行版),通过工具实操 + 真实 C 语言案例,带你走完 “发现泄漏→定位泄漏点→修复验证” 的全流程,核心掌握 vmstat、memleak(bcc 工具集)、strace 等工具的实战用法,彻底解决内存泄漏难题。

一、先搞懂:哪些内存会发生泄漏?

在定位前,需明确 Linux 进程的内存空间分布(参考文档核心知识点):

内存段
分配 / 释放方式
是否会泄漏
栈内存
系统自动分配 / 回收(局部变量)
不会
只读段 / 数据段
编译时分配(代码、常量、全局变量)
不会
堆内存
应用调用malloc()/calloc()分配,需手动free()释放
会(未调用free())
文件映射段
共享内存、动态库,需手动回收
会(未释放共享内存)

核心结论:内存泄漏仅发生在堆内存文件映射段,定位时重点关注这两类内存的分配与释放。

在动手排查前,必须先区分 “正常内存占用” 与 “内存泄漏”,避免将 “业务缓存的有效内存” 误判为泄漏。内存泄漏的典型特征可通过 “时间维度” 和 “系统状态” 双重验证:

  1. 进程内存持续增长且无收敛:通过top或ps查看进程的 RES(常驻内存),若随运行时间线性 / 非线性增长,且即使业务压力降低(如请求量减少)、进程空闲时也不释放,大概率存在泄漏;
  2. 系统级内存与 Swap 异常:空闲内存(free命令中的available)持续减少,同时 Swap 使用率(swpd)同步上升,说明物理内存已不足,系统开始依赖磁盘模拟内存;
  3. OOM 崩溃痕迹:若进程突然终止,可通过dmesg | grep -i oom查看,若日志中出现 “Out of memory: Kill process XXX”,且被 kill 的进程正是目标应用,基本可确认是内存泄漏导致。

二、第一步:发现泄漏 —— 用 vmstat 监控系统内存趋势,锁定异常

vmstat 是 Linux 内置的轻量级系统监控工具,无需额外安装,可实时输出内存、Swap、CPU、I/O 等关键指标。它的核心价值是从系统层面发现内存泄漏的 “宏观迹象”,为后续定位具体进程提供依据。

1. 工具基本用法与核心参数

# 语法:vmstat [刷新间隔(秒)] [输出次数]# 示例:每5秒输出1次内存状态,共输出12次(持续1分钟)vmstat 5 12

2. 输出结果解读:重点关注 “内存与 Swap” 指标

执行上述命令后,输出结果如下(关键指标已标注):

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st 1  0  10240  51200  8192  32768    0    0     0     0  500 1000  5  2 93  0  0 1  0  12288  48000  8192  32768    5    8    10     5  520 1050  6  3 91  0  0 1  0  15360  42000  8192  32768   12   15    20    10  550 1100  8  4 88  0  0

memory 区域

  • swpd:已使用的 Swap 内存大小(单位:KB),若持续增长(如从 10240→15360),说明物理内存不足;

  • free:空闲物理内存大小,若持续减少(如从 51200→42000),是内存泄漏的重要信号;

  • buff/cache:Buffer(磁盘块缓存)和 Cache(文件缓存),正常情况下会随系统内存紧张而回收,若free减少但buff/cache不变,说明内存被进程 “永久占用”(泄漏)。

swap 区域

  • si(swap in):从磁盘 Swap 读入内存的数据量(KB);

  • so(swap out):从内存写入磁盘 Swap 的数据量(KB);

若si和so持续大于 0(如案例中 5→12、8→15),说明系统正频繁进行内存与磁盘的交换,内存泄漏已影响系统性能。

3. 实战场景:用 vmstat 发现疑似泄漏

场景:某 C 语言开发的日志收集服务(进程名:log-collector)部署后,运行 3 天内响应速度逐渐变慢。

操作:执行vmstat 10 36(每 10 秒输出 1 次,持续 1 小时),并将结果保存到文件:

vmstat 10 36 > vmstat_log.txt

结果分析

  • swpd从初始 0 增长至 81920 KB(80MB);

  • free从 1.2GB 降至 400MB,且buff/cache始终稳定在 200MB 左右(无回收);

  • si和so从 0 分别升至 30 KB 和 25 KB,持续有 Swap 交换。

结合这些指标,可判断系统存在内存泄漏,下一步需定位到具体进程。

三、第二步:锁定进程 —— 用 ps/top 定位 “内存吞噬者”

当 vmstat 发现系统内存异常后,需进一步锁定 “哪个进程在泄漏内存”。top和ps是最常用的进程级监控工具,核心关注进程的RES(常驻内存) 和VSZ(虚拟内存) 指标。

1. 用 top 实时监控进程内存变化

直接执行top命令,按M键(大写)可按内存使用率排序,重点关注:

  • RES(Resident Memory):进程实际占用的物理内存(不包含 Swap 和未使用的虚拟内存),内存泄漏时该值会持续增长;

  • %MEM:进程内存占系统总内存的百分比,若持续上升,需重点关注。

示例:在 top 界面中,log-collector 进程的 RES 从初始 50MB,1 小时后增长至 120MB,% MEM 从 4% 升至 10%,且无收敛趋势,可锁定该进程为泄漏源。

2. 用 ps 精确输出进程内存信息

若需将进程内存数据保存到文件,便于后续分析,可使用ps命令:

# 语法:ps -p [进程ID] -o pid,ppid,%mem,vsize,rss,cmd# 示例:查看log-collector的进程ID(假设为1234),每30秒输出1次内存状态whiletruedo ps -p 1234 -o pid,%mem,vsize,rss,cmd >> ps_mem_log.txt; sleep 30; done
  • rss:与 RES 含义一致,单位为 KB;

  • vsize:虚拟内存大小(包含未使用的内存和 Swap),泄漏时可能增长,但 RES 更能反映物理内存占用情况。

四、第三步:定位泄漏点 —— 用 memleak(bcc 工具集)揪出代码元凶

锁定泄漏进程后,最关键的一步是定位代码中具体的内存泄漏位置(如哪个函数调用了malloc但未free)。memleak 是 bcc 工具集中的核心工具,基于 BPF(Berkeley Packet Filter)技术,可实时跟踪进程的内存分配与释放,精准输出 “未释放的内存地址、分配次数、调用栈”,堪称 “内存泄漏的显微镜”。

1. 安装 bcc 工具集(Ubuntu 18.04)

# 安装依赖sudo apt update && sudo apt install -y bpfcc-tools linux-headers-$(uname -r)# 验证安装:执行memleak命令,若不报错则安装成功memleak --help

2. memleak 核心用法:跟踪指定进程的内存泄漏

# 语法:memleak -p [进程ID] [选项]# 示例:跟踪进程1234,每10秒输出1次泄漏报告,显示调用栈(-a)sudo memleak-bpfcc -p 1234 -a -t 10
  • **-p [pid]**:指定要跟踪的进程 ID,必选参数;

  • -a:显示内存分配的调用栈(关键!可定位到具体代码行);

  • **-t [seconds]**:每 N 秒输出 1 次泄漏报告,避免实时刷屏;

  • --allocations:仅显示内存分配记录,不显示释放记录(适合快速排查)。

3. 输出结果解读:从调用栈定位泄漏点

执行上述命令后,若存在内存泄漏,会输出类似以下的报告:

WARNING: Could not find debug info for /usr/bin/log-collectorTracking memory allocations in process 1234 (log-collector)At time 10.000s: 200 bytes in 10 allocations from stack trace:    0x4008a3 (log_collector:read_log+0x23)    0x4009c5 (log_collector:main+0x85)    0x7f8a123450b3 (libc-2.27.so:__libc_start_main+0xf3)At time 20.000s: 400 bytes in 20 allocations from stack trace:    0x4008a3 (log_collector:read_log+0x23)    0x4009c5 (log_collector:main+0x85)    0x7f8a123450b3 (libc-2.27.so:__libc_start_main+0xf3)
  • 关键信息

  • 泄漏内存大小:从 200 字节增长至 400 字节,说明read_log函数每调用 1 次,泄漏 20 字节(200 字节 / 10 次 = 20 字节 / 次);

  • 调用栈:read_log+0x23表示泄漏发生在read_log函数的第 0x23 偏移处,main+0x85表示该函数由main函数调用;

  • 注意:若提示 “Could not find debug info”,需重新编译应用时添加-g参数(生成调试信息),否则无法显示具体代码行。

4. 结合 gdb 定位具体代码行

若应用已编译调试信息(-g参数),可通过gdb查看read_log+0x23对应的代码:

# 启动gdb,加载应用程序gdb /usr/bin/log-collector# 在gdb中查看read_log函数的汇编与源码对应关系(gdb) disassemble /s read_log

输出结果中,0x4008a3 <read_log+35>(0x23=35)对应的源码行如下:

Dump of assembler code forfunction read_log:0x0000000000400880 <+0>:   sh   %rbp...0x00000000004008a3 <+35>:        0x4006f0 <malloc@plt>  # 调用malloc申请内存0x00000000004008a8 <+40>:        %rax,%rdi...End of assembler dump.    mov  callq     pu

结合源码查看read_log函数:

void read_log() {    // 申请20字节内存,但未调用free释放    char* buffer = (char*)malloc(20);      memset(buffer, 0, 20);    fgets(buffer, 20, log_file);    // 业务逻辑处理后,未释放buffer}

至此,已精准定位到泄漏点:read_log函数中malloc申请的buffer未释放,每次调用都会泄漏 20 字节。

五、第四步:辅助验证 —— 用 strace 跟踪系统调用,确认泄漏逻辑

strace 是 Linux 下的系统调用跟踪工具,可实时输出进程调用的系统函数(如malloc对应的brk/mmap系统调用)。它的核心价值是辅助验证泄漏逻辑,确认 “内存分配后是否真的没有释放”。

1. strace 核心用法:跟踪内存相关系统调用
# 语法:strace -p [进程ID] -e [系统调用名]# 示例:跟踪进程1234的brk(堆内存分配)和munmap(内存释放)调用sudo strace -p 1234 -e brk,munmap
  • brk:malloc在申请小块内存时会调用brk调整堆大小,每次brk增长表示申请内存;

  • munmap:free在释放大块内存时会调用munmap,若仅看到brk增长而无munmap,说明内存未释放。

2. 输出结果验证泄漏

正常情况下,内存分配与释放应成对出现;若存在泄漏,会只看到brk增长,无munmap:

brk(NULL)                               = 0x55f8a78a2000brk(0x55f8a78a7000)                     = 0x55f8a78a7000  # 申请内存(堆增长)brk(0x55f8a78ac000)                     = 0x55f8a78ac000  # 再次申请内存# 无munmap调用,说明内存未释放

六、第五步:修复与验证 —— 确认泄漏已解决

定位到泄漏点后,修复逻辑很简单:在read_log函数中添加free(buffer)释放内存:

void read_log() {    char* buffer = (char*)malloc(20);      memset(buffer, 0, 20);    fgets(buffer, 20, log_file);    // 业务逻辑处理    free(buffer);  // 新增:释放内存    buffer = NULL; // 避免野指针}

修复后,需通过以下步骤验证泄漏已解决:

  1. 重启应用:确保修复后的代码生效;

  2. 用 vmstat 监控:观察free内存是否稳定,swpd、si、so是否恢复为 0;

  3. 用 memleak 跟踪:执行sudo memleak -p [新进程ID] -a,若持续监控 1 小时,泄漏内存大小不再增长,说明修复成功;

  4. 用 ps 跟踪 RES:进程的 RES 内存稳定在 50MB 左右,无持续增长趋势。

七、避坑指南:内存泄漏排查的 “3 个常见误区”

1.误区 1:将 Cache 内存误判为泄漏

free命令中的cache是文件缓存,系统会在内存紧张时自动回收,并非泄漏。判断标准:若free减少但cache增加,且echo 3 > /proc/sys/vm/drop_caches后free恢复,说明是正常 Cache,而非泄漏。

2.误区 2:忽视 “小泄漏” 的累积效应

单次泄漏 20 字节看似 “微不足道”,但若read_log每秒调用 1000 次,1 天会泄漏 20×1000×3600×24=1.728GB,最终导致 OOM。小泄漏必须及时修复。

3.误区 3:未用调试信息编译应用

若应用未加-g参数编译,memleak 和 gdb 无法显示具体代码行,只能看到内存地址,排查效率会大幅降低。因此,开发阶段务必添加-g参数编译(如gcc -g log_collector.c -o log_collector),便于后续定位。

八、进阶:预防内存泄漏的 “4 个实践策略”

解决内存泄漏的最佳方式是 “提前预防”。结合 Linux 原生应用开发特点,可从 编码规范、工具预防、测试手段、运行监控 四个维度建立防护体系,避免泄漏问题流入生产环境。

1. 编码规范:从源头减少泄漏风险

针对 C/C++ 等手动管理内存的语言,需制定严格的编码规则,强制规范内存分配与释放逻辑:

  • “谁申请,谁释放”:明确内存所有权,若函数 A 调用malloc申请内存,优先在函数 A 内通过free释放;若需将内存传递给其他函数,需在文档中注明 “由调用方负责释放”。
// 示例:函数返回动态内存,需注明由调用方释放char* create_buffer(int size) {  char* buf = (char*)malloc(size);if (buf == NULL) {    perror("malloc failed");return NULL;  }return buf; // 文档注明:调用方需调用 free(buf) 释放}// 调用方使用char* data = create_buffer(100);if (data != NULL) {  // 业务处理  free(data); // 主动释放,避免泄漏  data = NULL;}
  • 使用 “智能指针” 替代裸指针(C++):在 C++ 开发中,优先使用std::unique_ptr、std::shared_ptr等智能指针,它们会在对象生命周期结束时自动释放内存,从语法层面避免泄漏。
#include <memory>void process_data() {  // 使用 unique_ptr,自动释放内存  std::unique_ptr<char[]> buffer(new char[20]);  memset(buffer.get(), 0, 20);  fgets(buffer.get(), 20, log_file);  // 函数结束时,buffer 自动销毁,内存释放}
  • 避免 “内存分配后跳转”:若在条件判断(if)或循环(for)中申请内存,需确保跳转前(如break、return)已释放内存,避免因逻辑分支遗漏释放。
void handle_request(int flag) {  char* temp = (char*)malloc(50);if (temp == NULL) return;if (flag == 1) {    // 业务处理    free(temp); // 跳转前释放return;  }  // 其他逻辑  free(temp); // 正常流程释放}

2. 工具预防:编译 / 静态分析阶段发现隐患

借助静态分析工具,在代码编译或提交阶段自动扫描内存泄漏风险,提前发现问题:

  • Clang Static Analyzer:Clang 编译器自带的静态分析工具,可检测 “内存分配后未释放”“空指针访问” 等问题,支持集成到 IDE(如 VS Code)或 CI/CD 流程中。
# 示例:用 Clang 静态分析 log_collector.cclang --analyze -Xanalyzer -analyzer-output=text log_collector.c

若存在泄漏,会输出类似提示:

log_collector.c:15:3: warning: Memory is never released; potential memory leak  char* buffer = (char*)malloc(20);  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  • Valgrind(Memcheck):一款强大的内存调试工具,可在程序运行时跟踪内存分配、释放情况,精准定位泄漏点。适合在测试环境中对关键流程进行 “内存审计”。
# 示例:用 Valgrind 运行程序,检测内存泄漏valgrind --leak-check=full --show-leak-kinds=all ./log_collector

运行结束后,Valgrind 会输出泄漏报告,包括泄漏内存大小、位置:

==1234== LEAK SUMMARY:==1234==    definitely lost: 200 bytes in 10 blocks==1234==    indirectly lost: 0 bytes in 0 blocks==1234==      possibly lost: 0 bytes in 0 blocks==1234==    still reachable: 0 bytes in 0 blocks==1234==         suppressed: 0 bytes in 0 blocks==1234== ==1234== 200 bytes in 10 blocks are definitely lost in loss record 1 of 1==1234==    at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)==1234==    by 0x40089A: read_log (log_collector.c:15)==1234==    by 0x4009C0: main (log_collector.c:45)
3. 测试手段:模拟长期运行,暴露潜在泄漏

内存泄漏的 “隐蔽性” 决定了短期测试难以发现,需通过 长期压力测试 和 内存趋势监控 模拟生产环境,暴露潜在问题:

  • 长期压力测试:编写测试脚本,对应用施加持续业务压力(如每秒调用 1000 次read_log函数),运行 24~72 小时,同时用ps或top跟踪进程 RES 内存变化。若 RES 持续增长且无收敛,说明存在泄漏。
# 示例:用 while 循环模拟压力测试(需根据业务场景调整)whiletruedo  curl http://localhost:8080/collect-log  # 调用业务接口  sleep 0.001  # 每秒约 1000 次请求done
  • 内存快照对比:在测试开始(T0)、测试 12 小时(T1)、测试 24 小时(T2)三个时间点,用pmap工具生成进程内存快照,对比内存段变化。若某类内存段(如堆内存)大小持续增长,需重点排查。
# 生成内存快照(T0 时刻)pmap -x 1234 > pmap_T0.txt# 12 小时后生成 T1 快照pmap -x 1234 > pmap_T1.txt# 对比差异diff pmap_T0.txt pmap_T1.txt | grep -E "rwx|rw-"# 关注可读写内存段

4. 运行监控:生产环境实时预警

即使经过严格测试,生产环境仍可能因 “边缘场景” 触发泄漏,需建立实时监控告警机制:

  • 自定义监控脚本:结合vmstat、ps等工具,编写 Shell 脚本,定期检查进程 RES 内存和系统 Swap 使用率,当达到阈值(如 RES 超过 500MB、Swap 使用率超过 30%)时,通过邮件或告警平台通知运维人员。
# 示例:监控 log-collector 进程内存(每 5 分钟执行一次)# 写入 crontab:*/5 * * * * /path/to/monitor_mem.sh#!/bin/bashPID=$(pgrep log-collector)if [ -z "$PID" ]; thenecho"进程未运行" | mail -s "log-collector 异常" admin@example.comexit 1fi# 获取 RES 内存(单位:KB)RES=$(ps -p $PID -o rss --no-headers)# 阈值:500MB = 512000 KBif [ $RES -gt 512000 ]; thenecho"进程内存超过阈值:$((RES/1024)) MB" | mail -s "log-collector 内存告警" admin@example.comfi
  • 集成 APM 工具:使用 Application Performance Monitoring(APM)工具(如 Prometheus + Grafana、Datadog),通过自定义指标(如 “进程内存使用率”“Swap 使用率”)建立可视化仪表盘,并配置告警规则。当指标异常时,可快速定位问题进程。

九、总结:内存泄漏排查的 “黄金流程”

结合前文工具实操和案例,可总结出 Linux 应用内存泄漏排查的 “5 步黄金流程”,适用于绝大多数 C/C++ 原生应用场景:

  1. 发现异常:用vmstat监控系统内存趋势,若free持续减少、swpd/si/so上升,判断存在泄漏;
  2. 锁定进程:用top(按 M 排序)或ps定位 RES 持续增长的进程,确定泄漏源;
  3. 定位代码:用memleak(bcc 工具集)跟踪进程内存分配调用栈,结合gdb找到具体泄漏函数和代码行;
  4. 辅助验证:用strace跟踪brk/munmap系统调用,确认内存未释放;
  5. 修复验证:添加free/智能指针修复代码,重启应用后,用memleak和vmstat验证泄漏是否解决。

通过 “工具实操 + 规范预防” 双重手段,可有效解决 Linux 应用内存泄漏问题,保障服务长期稳定运行。

十、复杂场景进阶:应对特殊场景的泄漏排查

在实际开发中,内存泄漏往往并非 “单一函数未释放内存” 这么简单,多线程竞争、动态库依赖、第三方组件调用等场景会让泄漏排查难度陡增。本节针对三类典型复杂场景,提供针对性的排查思路与工具组合方案。

1. 多线程应用:定位 “线程专属泄漏”

多线程应用中,内存泄漏可能仅发生在特定线程(如处理异步任务的线程),且线程频繁创建销毁会导致泄漏内存 “分散”,常规memleak跟踪易遗漏关键信息。

排查思路与工具组合

  • 步骤 1:用pstack查看线程调用栈

先通过ps -T -p [进程ID]查看进程下所有线程的 TID(线程 ID),再用pstack [TID]输出特定线程的调用栈,判断哪些线程在频繁执行内存分配操作(如调用malloc的线程)。

# 查看进程1234的所有线程ps -T -p 1234# 输出TID为5678的线程调用栈pstack 5678
  • 步骤 2:用memleak跟踪线程级内存分配

bcc 工具集的memleak支持通过-t参数(跟踪线程)精准定位线程专属泄漏,需结合线程 TID 过滤:

# 跟踪进程1234中TID为5678的线程,每10秒输出泄漏报告sudo memleak -p 1234 -t 5678 -a -i 10
  • 步骤 3:用threadsanitizer检测线程内存竞争

部分多线程泄漏源于 “线程退出时未释放共享内存”(如线程间传递的内存块被遗忘),可在编译时加入-fsanitize=thread参数,运行时检测线程内存管理异常:

# 编译时启用线程 sanitizergcc -g -fsanitize=thread log_collector.c -o log_collector# 运行程序,若存在线程内存问题会输出告警./log_collector

实战案例

某多线程日志处理服务(3 个工作线程)运行时,内存每小时增长 100MB。通过ps -T -p 1234发现 TID 为 5678 的线程(负责压缩日志)RES 持续增长;用memleak -t 5678跟踪,发现该线程调用zlib库的deflateInit2申请的压缩上下文(z_streamp)未调用deflateEnd释放,导致每次压缩任务泄漏 1KB 内存。修复后,线程内存占用稳定在 20MB 以内。

2. 动态库依赖:排查 “第三方库泄漏”

当应用依赖第三方动态库(如libcurl、libmysqlclient)时,泄漏可能隐藏在动态库内部(如库函数申请的内存未提供释放接口),此时需区分 “应用代码泄漏” 与 “库本身泄漏”。

排查思路与工具组合

  • 步骤 1:用ldd确认动态库依赖

先通过ldd [应用程序]列出所有依赖的动态库,重点关注近期更新或版本较旧的库(如libcurl.so.4):

ldd ./log_collector# 输出示例:libcurl.so.4 => /usr/lib/x86_64-linux-gnu/libcurl.so.4 (0x00007f1234567890)
  • 步骤 2:用valgrind --trace-children=yes跟踪库调用

Valgrind 的--trace-children=yes参数可跟踪应用调用的动态库进程,结合--leak-check=full输出库内部的内存泄漏:

valgrind --leak-check=full --trace-children=yes --show-leak-kinds=all ./log_collector

若泄漏来自动态库,报告中会显示库函数的调用栈:

==1234== 500 bytes in 5 blocks are definitely lost in loss record 2 of 2==1234==    at 0x4C2FB0F: malloc (vgpreload_memcheck-amd64-linux.so)==1234==    by 0x7F1234568A10: curl_easy_init (libcurl.so.4)==1234==    by 0x400A20: http_request (log_collector.c:60)  # 应用调用库函数的位置
  • 步骤 3:验证库版本与文档

若确认泄漏来自动态库,先查看库的官方文档(如libcurl的curl_easy_cleanup是否必须调用),再检查是否使用了过时版本(如libcurl 7.58存在已知泄漏,升级到 7.80 后修复)。

3. 容器化环境:Docker/K8s 中的泄漏排查

容器化环境中,进程被隔离在容器内,常规工具需结合容器管理命令使用,且需注意 “容器内存限制触发 OOM” 的特殊场景。

排查思路与工具组合

  • 步骤 1:进入容器或直接在宿主机跟踪容器进程

两种方式可跟踪容器内进程:

① 进入容器内部执行工具(需容器内安装对应工具):

# 进入容器(容器名:log-collector-container)docker exec -it log-collector-container /bin/bash# 在容器内安装bcc工具集(以Ubuntu容器为例)apt update && apt install -y bcc-tools

② 在宿主机通过docker inspect获取容器 PID,直接跟踪:

# 获取容器的宿主机PID(容器ID:abc123)CONTAINER_PID=$(docker inspect -f '{{.State.Pid}}' abc123)# 在宿主机用memleak跟踪容器进程sudo memleak -p $CONTAINER_PID -a -i 10
  • 步骤 2:结合 K8s 监控排查(若使用 K8s)

K8s 的kubectl top pod可查看 Pod 的内存使用趋势,若 Pod 内存持续增长且触发OOMKilled(通过kubectl describe pod [pod名]查看事件),需进入 Pod 容器排查:

# 查看Pod内存使用kubectl top pod log-collector-pod# 进入Pod的容器kubectl exec -it log-collector-pod -c log-collector-container -- /bin/bash
  • 步骤 3:注意容器内存限制的影响

容器若设置了resources.limits.memory(如 1GB),当泄漏导致内存超过限制时,K8s 会直接终止容器。此时需先临时调高内存限制(如 2GB),预留足够时间用memleak定位泄漏点,避免容器频繁重启。

十一、常见内存泄漏类型对比与解决方案

不同类型的内存泄漏,其成因与修复方式差异较大。下表总结了四类高频泄漏场景的特征、排查工具与解决方案,便于快速定位问题:

泄漏类型
典型特征
核心排查工具
解决方案
函数内未释放
单次函数调用泄漏固定大小内存,调用越频繁泄漏越快
memleak + gdb
在函数返回前调用free,C++ 用智能指针
线程退出未释放
仅特定线程内存增长,线程销毁后内存不回收
pstack + memleak(指定 TID)
线程退出前释放专属内存,用线程局部存储(TLS)管理线程私有内存
动态库未释放
调用库函数后内存增长,无应用代码分配逻辑
Valgrind(--trace-children)
检查库函数文档,确保调用释放接口;升级库版本
循环引用(C++)
智能指针shared_ptr相互引用,对象无法销毁
Clang Static Analyzer + gdb
改用weak_ptr打破循环引用;避免过度使用shared_ptr

十二、附录:工具安装与常见问题解决

为方便开发者快速上手,本节整理了核心工具的跨发行版安装命令,以及排查过程中常见问题的解决方案。

1. 核心工具跨发行版安装

工具
Ubuntu 18.04/20.04
CentOS 7/8
验证命令
bpfcc-tools(memleak)
apt install -y bpfcc-tools linux-headers-$(uname -r)
CentOS 8:dnf install -y bcc;CentOS 7:需从 EPEL 源安装(yum install -y epel-release && yum install -y bcc)
memleak --help
Valgrind
apt install -y valgrind
yum install -y valgrind
valgrind --version
Clang Static Analyzer
apt install -y clang
yum install -y clang
clang --analyze --help
pstack
apt install -y gdb(pstack 依赖 gdb)
yum install -y gdb
pstack --help

2. 常见问题解决方案

问题现象
原因分析
解决方案
memleak 提示 “Could not find debug info”
应用未加-g参数编译,无调试信息
重新编译:gcc -g 源码.c -o 应用名
Valgrind 运行程序卡顿严重
Valgrind 会模拟内存操作,性能损耗大(约 10 倍)
仅在测试环境使用;用--leak-check=fast减少损耗
容器内无法安装 bcc-tools
容器基础镜像(如 alpine)缺少依赖
改用 Ubuntu/CentOS 基础镜像;或在宿主机跟踪容器 PID
多线程场景 memleak 输出混乱
线程频繁创建销毁,调用栈重叠
用-t [TID]指定跟踪特定线程;结合pstack先定位关键线程

通过以上内容,从基础排查流程到复杂场景应对,再到工具与问题解决,形成了一套完整的 Linux 内存泄漏排查体系。无论是新手开发者定位首次遇到的泄漏问题,还是资深工程师处理多线程、容器化环境的复杂泄漏,都可根据实际场景选择对应的工具与方案,高效解决内存泄漏难题,保障应用长期稳定运行

最新文章

随机文章

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