SuperAPI AI 工具集

ios-memgraph-leaks

测试与质量

查看项目

更新于 10-15 10:24

技能介绍

用途

ios-memgraph-leaks 用于捕获和检查 iOS 的泄漏(leaks)与内存图(memgraph)。当需要调试泄漏对象、循环引用、内存增长,或需要提供修复前后的泄漏证据时使用。它专注于从运行中的模拟器进程或已有的 .memgraph 文件证明泄漏存在。

当任务还涉及模拟器构建、安装、启动、UI 驱动、日志或截图时,建议配合 ../ios-debugger-agent/SKILL.md 一起使用。

主要能力

  • 从运行中的模拟器进程捕获 memgraph。
  • 对已有的 memgraph 汇总泄漏信息,并通过 --trace-limit 控制追踪树的输出量。
  • 对应用自身拥有的泄漏类型,使用 leaks --traceTree=<address> <file.memgraph> 检查所有权路径,或用分组泄漏证据辅助判断。
  • 针对根因做最小补丁,并在条件允许时在同一模拟器上重新捕获同一流程。

使用方式

捕获

优先从用于复现问题的那个模拟器上捕获。先解析模拟器 UDID 和应用 bundle 标识符,再捕获正在运行的应用:

SKILL_DIR="<absolute path to this loaded skill folder>"
SIM="<simulator-udid>"
BUNDLE_ID="<app.bundle.identifier>"
MEMGRAPH_DIR="$(mktemp -d "${TMPDIR:-/tmp}/codex-ios-memgraph.XXXXXX")"

"$SKILL_DIR/scripts/capture_sim_memgraph.sh" \
  --udid "$SIM" \
  --bundle-id "$BUNDLE_ID" \
  --out-dir "$MEMGRAPH_DIR"

注意不要从目标应用仓库的当前目录推导 SKILL_DIR;已安装的插件通常位于被调试应用之外。捕获结果应存放在本次运行专用的临时目录或用户指定的目录,而不是 SKILL_DIR 下。

如果找不到进程,请确认 bundle 标识符,并使用 xcrun simctl spawn "$SIM" launchctl list 检查正在运行的标签。

汇总

汇总一个已有的 memgraph:

"$SKILL_DIR/scripts/summarize_memgraph_leaks.py" \
  /path/to/app.memgraph \
  --trace-limit 5 \
  --out /path/to/leak-summary.md

谨慎使用 --trace-limit。追踪树是有用的根因证据,但较大的 memgraph 可能产生噪声输出。如果某个追踪树显示 Found 0 roots referencing,应将其视为不可达/自保留的泄漏候选,并使用汇总中的分组泄漏树,或 leaks --groupByType <file.memgraph> 来识别被保留的字段与载荷链路。

根因判断规则

  • 在泄漏输出或追踪中,识别第一个应用自身拥有的泄漏类型。
  • 确定其预期生命周期:进程、会话、账户、视图、请求或任务。
  • 将懒加载或延迟分配视为范围缩减,而不是泄漏修复;除非原本的急切分配本身就违反了预期生命周期。
  • 用 traceTree 所有权路径或独立复现来证明循环引用的说法。
  • 对于不可达/自循环泄漏,traceTree 可能没有根路径;此时使用 leaks --groupByType 并结合源码验证,找到自保留的边。
  • 不要仅仅因为泄漏总数下降就声称成功;要证明具体的类型或路径消失了。
  • 区分真正的根因分支与候选/噪声分支。
  • 相比添加宽泛的清理代码,优先删除保持存活的那条边。

报告内容

有用的泄漏报告应包含:

  • 精确的流程,以及模拟器与应用构建版本
  • memgraph 与汇总文件的路径
  • 应用自身拥有的泄漏类型与数量
  • 至少一条所有权路径;当对象从根不可达时,提供分组泄漏树证据
  • 最小的保留边修复方案(已提出或已应用)
  • 修复后的前后对比证据

如果 memgraph 只显示框架/运行时噪声,应如实说明,并建议下一次更窄范围的捕获,而不是凭空编造应用泄漏。

适用场景

适用于需要在 iOS 模拟器上定位、证明并修复内存泄漏与循环引用的调试场景,尤其是需要提供修复前后证据链的情况。

限制

该技能只在资料中描述了上述脚本、参数与流程,未提供其他功能、平台支持、价格或效果保证。关于安装方式、收费模式、兼容的 iOS 版本等信息,资料中暂未提供。