Highlights
✨ Memory instruments for development-signed apps
Four Instruments channels are now wrapped. The device only serves them for debuggable apps (development-signed, with get-task-allow); any other process is refused with a one-line ProcessInspectionError.
# Regions of the address space
pymobiledevice3 developer dvt vm-regions PID
# Memory graph for leaks(1), heap(1) or vmmap(1); prints the leak count and addresses as JSON
pymobiledevice3 developer dvt memgraph PID app.memgraph
leaks app.memgraph
# Launch with malloc stack logging and the graph also carries allocation backtraces
pymobiledevice3 developer dvt launch --env MallocStackLogging=1 com.example.app
pymobiledevice3 developer dvt memgraph PID app.memgraph
malloc_history app.memgraph --fullStacks ADDRESS
# Launch an app and summarize its heap allocations by class (on Ctrl+C or after --duration)
pymobiledevice3 developer dvt allocations com.example.app --duration 10
# Or print every event with its backtrace as image+offset frames
pymobiledevice3 developer dvt allocations com.example.app --events --kind heap --kind reference-counts
# Launch timing, image and dlopen counts as the dynamic loader recorded them
pymobiledevice3 developer dvt dyld-metrics PIDThe library side is VMTracking, Leaks, Allocations and DyldMetrics under pymobiledevice3.services.dvt.instruments. ProcessControl also gained is_debuggable, suspend and resume.
✨ File operations and change monitoring in app containers
developer core-device can now edit a file-service domain, not only list and read it, and on iOS 27+ stream its changes.
pymobiledevice3 developer core-device create-directory appDataContainer Documents/logs --identifier com.example.app
pymobiledevice3 developer core-device write-file appDataContainer Documents/logs/a.txt ./a.txt --identifier com.example.app
pymobiledevice3 developer core-device stat appDataContainer Documents/logs/a.txt --identifier com.example.app
pymobiledevice3 developer core-device rename appDataContainer Documents/logs/a.txt Documents/logs/b.txt --identifier com.example.app
pymobiledevice3 developer core-device create-symlink appDataContainer Documents/link Documents/logs/b.txt --identifier com.example.app
pymobiledevice3 developer core-device remove-file appDataContainer Documents/logs/b.txt --identifier com.example.app
# One JSON record per change (iOS 27+)
pymobiledevice3 developer core-device watch appDataContainer --identifier com.example.appFileServiceService gained the matching methods, including descriptor-based open_file / read_file / write_file / truncate_file. Always close the service: a client that vanishes with an open session can leave the device's file service stuck until the device restarts.
🐛 A service that never answers the RemoteXPC handshake
A daemon that accepts the connection but never answers (stuck, or refusing this host) surfaced as a raw TimeoutError traceback. It now raises RemoteXPCHandshakeTimeoutError, which the CLI reports in one line.
🐛 DTX: channel cancellations sent by the device
A cancellation the device initiated carries the channel code with the opposite sign, so it was reported as a protocol error for an unknown channel and the channel stayed registered. It is now applied to the right channel. DTX also gained keyed messages (send_keyed_message), which the dyld metrics service is driven with.
What's Changed
- 3678d7c dvt: Add is_debuggable, suspend and resume to ProcessControl (#2006) (@doronz88)
- 78955f5 dvt: Add memory instruments and dyld metrics (#2006) (@doronz88)
- cba802e dtx: Add keyed messages (#2006) (@doronz88)
- e19bc86 dtx: Accept a channel cancellation sent by the peer (#2006) (@doronz88)
- 497f815 core-device: Add file operations and change monitoring (#2006) (@doronz88)
- 2dec1e7 remotexpc: Report an unanswered handshake as a clean error (#2006) (@doronz88)
Full Changelog: v11.25.0...v11.26.0