Token导航 LogoToken导航TokenDH.com
研究检索需要联网github未标认证来源可访问许可证需确认审计通过

debugging-instruments调试仪器

Agent Skill

debugging-instruments 用于查找、检索和筛选相关信息,适合在 Codex、Claude、Cursor、Gemini CLI 中需要根据关键词、任务场景或来源线索快速定位候选结果时使用。可结合来源仓库、安装命令和原始 README 继续核验具体用法。安装前建议确认权限范围、维护状态,以及是否会触发联网、命令执行或文件读写。

总安装

26,928

周安装

1,122

GitHub Stars

523

下载量

8,712
CodexClaudeCursorGemini CLI

安装说明

本站只整理中文说明和来源信息,不托管安装包,也不代用户安装。

GitHub

来源数

2

许可证

unknown

最后核验

2026-05-01

来源状态

来源可访问

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:debugging-instruments(调试仪器)
来源仓库:https://github.com/dpearson2699/swift-ios-skills
仓库路径:skills/debugging-instruments
安装命令:
npx skills add https://github.com/dpearson2699/swift-ios-skills --skill debugging-instruments
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 npx skills 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

skills.shnpx skills
npx skills add https://github.com/dpearson2699/swift-ios-skills --skill debugging-instruments

简介

该技能提供 iOS 应用调试工具使用指南,涵盖 LLDB、内存分析器和性能检测。

  • 适用于需要诊断崩溃、内存泄漏或主线程阻塞等问题的开发场景。
  • 通过 GitHub 仓库安装,需确认本地环境是否支持相关调试工具链。
  • 建议先验证项目是否使用 Swift/Objective-C 及 Xcode 版本兼容性。
  • debugging-instruments 属于研究检索类 Skill,可作为该场景下的辅助能力补充。

SKILL.md

Debugging and Instruments

Diagnose crashes, memory leaks, retain cycles, main thread hangs, and performance bottlenecks in iOS apps using LLDB, Memory Graph Debugger, and Instruments. Covers breakpoint workflows, memory graph analysis, hang detection, build failure triage, and Instruments profiling for CPU, memory, energy, and network.

Contents

LLDB Debugging

Essential Commands

(lldb) po myObject              # Print object description (calls debugDescription)
(lldb) p myInt                  # Print with type info (uses LLDB formatter)
(lldb) v myLocal                # Frame variable — fast, no code execution
(lldb) bt                       # Backtrace current thread
(lldb) bt all                   # Backtrace all threads
(lldb) frame select 3           # Jump to frame #3 in the backtrace
(lldb) thread list              # List all threads and their states
(lldb) thread select 4          # Switch to thread #4

Use v over po when you only need a local variable value — it does not execute code and cannot trigger side effects.

Breakpoint Management

(lldb) br set -f ViewModel.swift -l 42          # Break at file:line
(lldb) br set -n viewDidLoad                     # Break on function name
(lldb) br set -S setValue:forKey:                 # Break on ObjC selector
(lldb) br modify 1 -c "count > 10"              # Add condition to breakpoint 1
(lldb) br modify 1 --auto-continue true          # Log and continue (logpoint)
(lldb) br command add 1                          # Attach commands to breakpoint
> po self.title
> continue
> DONE
(lldb) br disable 1                              # Disable without deleting
(lldb) br delete 1                               # Remove breakpoint

Expression Evaluation

(lldb) expr myArray.count                        # Evaluate Swift expression
(lldb) e -l swift -- import UIKit                # Import framework in LLDB
(lldb) e -l swift -- self.view.backgroundColor = .red  # Modify state at runtime
(lldb) e -l objc -- (void)[CATransaction flush]  # Force UI update after changes

After modifying a view property in the debugger, call CATransaction.flush() to see the change immediately without resuming execution.

Watchpoints

(lldb) w set v self.score                        # Break when score changes
(lldb) w set v self.score -w read               # Break when score is read
(lldb) w modify 1 -c "self.score > 100"         # Conditional watchpoint
(lldb) w list                                    # Show active watchpoints
(lldb) w delete 1                                # Remove watchpoint

Watchpoints are hardware-backed (limited to ~4 on ARM). Use them to find unexpected mutations — the debugger stops at the exact line that changes the value.

Symbolic Breakpoints

Set breakpoints on methods without knowing the file. Useful for framework or system code:

(lldb) br set -n "UIViewController.viewDidLoad"
(lldb) br set -r ".*networkError.*"              # Regex on symbol name
(lldb) br set -n malloc_error_break              # Catch malloc corruption
(lldb) br set -n UIViewAlertForUnsatisfiableConstraints  # Auto Layout issues

In Xcode, use the Breakpoint Navigator (+) to add symbolic breakpoints for common diagnostics like -[UIApplication main] or swift_willThrow.

Memory Debugging

Memory Graph Debugger Workflow

  1. Run the app in Debug configuration.
  2. Reproduce the suspected leak (navigate to a screen, then back).
  3. Tap the Memory Graph button in Xcode's debug bar.
  4. Look for purple warning icons — these indicate leaked objects.
  5. Select a leaked object to see its reference graph and backtrace.

Enable Malloc Stack Logging (Scheme > Diagnostics) before running so the Memory Graph shows allocation backtraces.

Common Retain Cycle Patterns

Closure capturing self strongly:

// LEAK — closure holds strong reference to self
class ProfileViewModel {
    var onUpdate: (() -> Void)?

    func startObserving() {
        onUpdate = {
            self.refresh()  // strong capture of self
        }
    }
}

// FIXED — use [weak self]
func startObserving() {
    onUpdate = { [weak self] in
        self?.refresh()
    }
}

Strong delegate reference:

// LEAK — strong delegate creates a cycle
protocol DataDelegate: AnyObject {
    func didUpdate()
}

class DataManager {
    var delegate: DataDelegate?  // should be weak
}

// FIXED — weak delegate
class DataManager {
    weak var delegate: DataDelegate?
}

Timer retaining target:

// LEAK — Timer.scheduledTimer retains its target
timer = Timer.scheduledTimer(
    timeInterval: 1.0, target: self,
    selector: #selector(tick), userInfo: nil, repeats: true
)

// FIXED — use closure-based API with [weak self]
timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { [weak self] _ in
    self?.tick()
}

Instruments: Allocations and Leaks

  • Allocations template: Track memory growth over time. Use the "Mark Generation" feature to isolate allocations created between user actions (e.g., open/close a screen).
  • Leaks template: Automatically detects reference cycles at runtime. Run alongside Allocations for a complete picture.
  • Filter by your app's module name to exclude system allocations.

Malloc Stack Logging

Enable in Scheme > Run > Diagnostics > Malloc Stack Logging (All Allocations). This records the call stack for every allocation, letting the Memory Graph Debugger and leaks CLI show where objects were created.

# CLI leak detection
leaks --atExit -- ./MyApp.app/MyApp
# Symbolicate with dSYMs for readable stacks

Hang Diagnostics

Identifying Main Thread Hangs

A hang occurs when the main thread is blocked for > 250ms (noticeable) or

1s (severe). Common detection tools:
  • Thread Checker (Xcode Diagnostics): warns about non-main-thread UI calls
  • os_signpost and OSSignposter: mark intervals for Instruments
  • MetricKit hang diagnostics: production hang detection (see metrickit skill for MXHangDiagnostic)
import os

let signposter = OSSignposter(subsystem: "com.example.app", category: "DataLoad")

func loadData() async {
    let state = signposter.beginInterval("loadData")
    let result = await fetchFromNetwork()
    signposter.endInterval("loadData", state)
    process(result)
}

Using the Time Profiler

  1. Product > Profile (Cmd+I) to launch Instruments.
  2. Select the Time Profiler template.
  3. Record while reproducing the slow interaction.
  4. Focus on the main thread — sort by "Weight" to find hot paths.
  5. Check "Hide System Libraries" to see only your code.
  6. Double-click a heavy frame to jump to source.

Common Hang Causes

CauseSymptomFix
Synchronous I/O on main threadNetwork/file reads block UIMove to Task {} or background actor
Lock contentionMain thread waiting on a lock held by background workUse actors or reduce lock scope
Layout thrashingRepeated layoutSubviews callsBatch layout changes, avoid forced layout
JSON parsing large payloadsUI freezes during data loadParse on a background thread
Synchronous image decodingScroll jank on image-heavy listsUse AsyncImage or decode off main thread

Build Failure Triage

Reading Compiler Diagnostics

  • Start from the first error — subsequent errors are often cascading.
  • Search for the error code (e.g., error: cannot convert) in the build log.
  • Use Report Navigator (Cmd+9) for the full build log with timestamps.

SPM Dependency Resolution

# Common: version conflict
error: Dependencies could not be resolved because root depends on 'Package' 1.0.0..<2.0.0

# Fix: check Package.resolved and update version ranges
# Reset package caches if needed:
rm -rf ~/Library/Caches/org.swift.swiftpm
rm -rf .build
swift package resolve

Module Not Found / Linker Errors

ErrorCheck
No such module 'Foo'Target membership, import paths, framework search paths
Undefined symbolLinking phase missing framework, wrong architecture
duplicate symbolTwo targets define same symbol; check for ObjC naming collisions

Build settings to inspect first:

  • FRAMEWORK_SEARCH_PATHS
  • OTHER_LDFLAGS
  • SWIFT_INCLUDE_PATHS
  • BUILD_LIBRARY_FOR_DISTRIBUTION (for XCFrameworks)

Instruments Overview

Template Selection Guide

TemplateUse When
Time ProfilerCPU is high, UI feels slow, need to find hot code paths
AllocationsMemory grows over time, need to track object lifetimes
LeaksSuspect retain cycles or abandoned objects
NetworkInspecting HTTP request/response timing and payloads
SwiftUIProfiling view body evaluations and update frequency
Core AnimationFrame drops, off-screen rendering, blending issues
Energy LogBattery drain, background energy impact
File ActivityExcessive disk I/O, slow file operations
System TraceThread scheduling, syscalls, virtual memory faults

xctrace CLI for CI Profiling

# Record a trace from the command line
xcrun xctrace record --device "My iPhone" \
    --template "Time Profiler" \
    --output profile.trace \
    --launch MyApp.app

# Export trace data as XML for automated analysis
xcrun xctrace export --input profile.trace --xpath '/trace-toc/run/data/table'

# List available templates
xcrun xctrace list templates

# List connected devices
xcrun xctrace list devices

Use xctrace in CI pipelines to catch performance regressions automatically. Compare exported metrics between builds.

Common Mistakes

DON'T: Use print() for debugging instead of os.Logger

print() output is not filterable, has no log levels, and is not automatically stripped from release builds. It pollutes the console and makes it impossible to isolate relevant output.

// WRONG — unstructured, not filterable, stays in release builds
print("user tapped button, state: \(viewModel.state)")
print("network response: \(data)")

// CORRECT — structured logging with Logger
import os

let logger = Logger(subsystem: "com.example.app", category: "UI")

logger.debug("Button tapped, state: \(viewModel.state, privacy: .public)")
logger.info("Network response received, bytes: \(data.count)")

Logger messages appear in Console.app with filtering by subsystem and category, and .debug messages are written to the in-memory log store only (not persisted to disk in release builds).

DON'T: Forget to enable Malloc Stack Logging before memory debugging

Without Malloc Stack Logging, the Memory Graph Debugger shows leaked objects but cannot display allocation backtraces, making it difficult to find the code that created them.

// WRONG — open Memory Graph without enabling Malloc Stack Logging
// Result: leaked objects visible but no allocation backtrace

// CORRECT — enable BEFORE running:
// Scheme > Run > Diagnostics > check "Malloc Stack Logging: All Allocations"
// Then run, reproduce the leak, and open Memory Graph

DON'T: Debug optimized code expecting full variable visibility

In Release (optimized) builds, the compiler may inline functions, eliminate variables, and reorder code. LLDB cannot display optimized-away values.

// WRONG — profiling with Debug build, debugging with Release build
// Debug builds: extra runtime checks distort perf measurements
// Release builds: variables show as "<optimized out>" in debugger

// CORRECT approach:
// Debugging: use Debug configuration (full symbols, no optimization)
// Profiling: use Release configuration (realistic performance)

DON'T: Stop on every loop iteration without conditional breakpoints

Breaking on every iteration wastes time and makes it hard to find the specific case you care about.

// WRONG — breakpoint on line inside loop, stops 10,000 times
for item in items {
    process(item)  // breakpoint here stops on EVERY item
}

// CORRECT — use a conditional breakpoint:
// (lldb) br set -f MyFile.swift -l 42 -c "item.id == targetID"
// Or in Xcode: right-click breakpoint > Edit > add Condition

DON'T: Ignore Thread Sanitizer warnings

Thread Sanitizer (TSan) warnings indicate data races that may only crash intermittently. They are real bugs, not false positives.

// WRONG — ignoring TSan warning about concurrent access
var cache: [String: Data] = [:]  // accessed from multiple threads

// CORRECT — protect shared mutable state
actor CacheActor {
    var cache: [String: Data] = [:]

    func get(_ key: String) -> Data? { cache[key] }
    func set(_ key: String, _ value: Data) { cache[key] = value }
}

Enable TSan: Scheme > Run > Diagnostics > Thread Sanitizer. Note: TSan cannot run simultaneously with Address Sanitizer.

Review Checklist

  • Using os.Logger instead of print() for diagnostic output
  • Malloc Stack Logging enabled before memory debugging sessions
  • Memory Graph Debugger checked after dismiss/dealloc flows
  • Delegates declared as weak var to prevent retain cycles
  • Closures stored as properties use [weak self] capture lists
  • Timers use closure-based API with [weak self]
  • Thread Sanitizer enabled in test schemes
  • No synchronous I/O or heavy computation on the main thread
  • Time Profiler run on Release build for performance baselines
  • Build failures triaged from the first error in the build log
  • OSSignposter used for custom performance intervals
  • Conditional breakpoints used for loop/collection debugging

References

适合场景

01

用户想查找某类 Agent Skill 时

02

需要根据任务场景推荐可安装能力包时

03

需要对比不同来源的安装命令和来源信息时

能力概览

能力 1

按任务关键词查找相关 Skills

能力 2

展示可复制的安装命令

能力 3

保留来源站点、仓库和原始说明,方便继续核验

能力 4

展示第三方安全扫描或审计结果

安装后应在对应宿主中按原始 README 的触发条件使用;具体调用方式请以来源页面和 README 为准。

平台分布

Codex

36.09%
按下载量换算3,144

Claude

31%
按下载量换算2,701

Cursor

19.53%
按下载量换算1,701

Gemini CLI

9.28%
按下载量换算808

安全审计

Gen Agent Trust Hub

通过

Socket

通过

Snyk

通过

权限和风险

需要联网

该 Skill 可能需要联网访问来源站点、仓库或外部 API;具体网络访问范围需要结合源码和 README 复核。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。当前只有一个来源,正式发布前建议补源仓库或其他目录站核验。

来源信息

继续浏览同类 Skills