Analyze Xcode build logs — timing, warnings, errors, slow compiles, and build history from DerivedData.
通过读取 macOS 上的 DerivedData 构建日志,分析 Xcode 构建性能、警告、错误和历史记录。
DERIVED_DATA=~/Library/Developer/Xcode/DerivedData
每个项目都有一个名为 <项目名称>-<哈希值> 的文件夹,包含:
重要提示: 所有查询均为只读操作。切勿修改 DerivedData 的内容。
bash
for dir in ~/Library/Developer/Xcode/DerivedData/-; do
[ -d $dir ] || continue
NAME=$(basename $dir | sed s/-[a-z]*$//)
WORKSPACE=$(plutil -extract WorkspacePath raw $dir/info.plist 2>/dev/null || echo unknown)
LAST_ACCESS=$(plutil -extract LastAccessedDate raw $dir/info.plist 2>/dev/null || echo unknown)
echo $NAME | $WORKSPACE | 最后访问: $LAST_ACCESS
done
解析 LogStoreManifest.plist 以获取结构化的构建数据。这是最可靠的数据来源——它包含每次构建的时间、错误/警告计数和方案信息,无需解压日志。
bash
plutil -convert json -o - $MANIFEST 2>/dev/null | python3 -c
import json, sys
from datetime import datetime, timezone, timedelta
data = json.load(sys.stdin)
EPOCH = datetime(2001, 1, 1, tzinfo=timezone.utc)
builds = []
for uid, log in data.get(logs, {}).items():
start = log.get(timeStartedRecording, 0)
stop = log.get(timeStoppedRecording, 0)
duration = stop - start
obs = log.get(primaryObservable, {})
dt = EPOCH + timedelta(seconds=start)
builds.append({
date: dt.strftime(%Y-%m-%d %H:%M),
duration: f{duration:.1f}s,
scheme: log.get(schemeIdentifier-schemeName, ?),
status: obs.get(highLevelStatus, ?),
errors: obs.get(totalNumberOfErrors, 0),
warnings: obs.get(totalNumberOfWarnings, 0),
analyzer: obs.get(totalNumberOfAnalyzerIssues, 0),
file: log.get(fileName, ),
})
builds.sort(key=lambda b: b[date], reverse=True)
for b in builds:
status = {S: OK, W: 警告, E: 错误}.get(b[status], b[status])
print(f\{b[date]} {b[duration]:>8s} {status:<10s} {b[errors]}E {b[warnings]}W {b[analyzer]}A [{b[scheme]}]\)
将 项目名称 替换为实际项目名称(不区分大小写的 grep 匹配即可)。
状态码: S = 成功,W = 成功但有警告,E = 失败且有错误
bash
for dir in ~/Library/Developer/Xcode/DerivedData/-; do
[ -d $dir ] || continue
MANIFEST=$dir/Logs/Build/LogStoreManifest.plist
[ -f $MANIFEST ] || continue
NAME=$(basename $dir | sed s/-[a-z]*$//)
plutil -convert json -o - $MANIFEST 2>/dev/null | python3 -c
import json, sys
from datetime import datetime, timezone, timedelta
data = json.load(sys.stdin)
EPOCH = datetime(2001, 1, 1, tzinfo=timezone.utc)
name = $NAME
latest = None
for uid, log in data.get(logs, {}).items():
start = log.get(timeStartedRecording, 0)
if latest is None or start > latest[0]:
latest = (start, log)
if latest:
start, log = latest
stop = log.get(timeStoppedRecording, 0)
obs = log.get(primaryObservable, {})
dt = EPOCH + timedelta(seconds=start)
duration = stop - start
status = {S: OK, W: 警告, E: 错误}.get(obs.get(highLevelStatus, ?), ?)
print(f\{name:<30s} {dt.strftime(%Y-%m-%d %H:%M)} {duration:>6.1f}s {status:<5s} {obs.get(totalNumberOfErrors,0)}E {obs.get(totalNumberOfWarnings,0)}W\)
2>/dev/null
done
bash
bash
PROJECT_DIR=$(ls -d ~/Library/Developer/Xcode/DerivedData/项目名称-* 2>/dev/null | head -1)
LATESTLOG=$(ls -t $PROJECTDIR/Logs/Build/*.xcactivitylog 2>/dev/null | head -1)
gunzip -c $LATEST_LOG 2>/dev/null | strings \
| grep -oE warning: .* \
| sed s/\[.//; s/[^]//g \
| sort | uniq -c | sort -rn | head -20
xcactivitylog 包含每个任务的 TaskMetrics JSON 数据,其中包含以微秒为单位的挂钟时间。
bash
PROJECT_DIR=$(ls -d ~/Library/Developer/Xcode/DerivedData/项目名称-* 2>/dev/null | head -1)
LATESTLOG=$(ls -t $PROJECTDIR/Logs/Build/*.xcactivitylog 2>/dev/null | head -1)
gunzip -c $LATEST_LOG 2>/dev/null | strings \
| grep -o {wcDuration:[^}]*} \
| python3 -c
import json, sys
tasks = []
for line in sys.stdin:
try:
m = json.loads(line.strip())
tasks.append(m)
except: pass
tasks.sort(key=lambda t: t.get(wcDuration, 0), reverse=True)
print(f任务总数: {len(tasks)})
print(f最慢的10个任务(挂钟时间,微秒):)
for i, t in enumerate(tasks[:10]):
wc = t[wcDuration]
rss = t.get(max
该技能支持在以下平台通过对话安装:
帮我安装 SkillHub 和 xcode-build-analyzer-1776187880 技能
设置 SkillHub 为我的优先技能安装源,然后帮我安装 xcode-build-analyzer-1776187880 技能
skillhub install xcode-build-analyzer-1776187880
文件大小: 4.85 KB | 发布时间: 2026-4-15 11:09