Summary
Implement a client for com.apple.dt.remoteFetchSymbols to download the dyld shared cache from iOS devices. This would enable local symbol resolution without needing Xcode.
Motivation
Currently, resolving symbol addresses (e.g. dlsym, objc_msgSend) in a remote process requires parsing Mach-O headers over GDB RSP memory reads (#699). While this works, having the shared cache locally would allow:
- Faster symbol resolution — parse locally instead of over USB/network
- Crash symbolication — resolve addresses in crash logs
- Offline analysis — inspect device libraries without being connected
- Cache per iOS version — download once, reuse for all devices on the same version
Currently only Xcode downloads these symbols (to ~/Library/Developer/Xcode/iOS DeviceSupport/). go-ios doesn't have this capability.
Implementation
The service is straightforward (see pymobiledevice3's RemoteFetchSymbolsService for reference):
- Connect to
com.apple.dt.remoteFetchSymbols via RemoteXPC
- Send
{"XPCDictionary_sideChannel": <uuid>, "DSCFilePaths": []} → receive file count
- For each file: receive metadata (path, size), then stream chunks via file transfer
- Store locally, indexed by iOS version/build
The shared cache is large (several GB), so downloading should be optional and cached per iOS version + build number.
Related
Summary
Implement a client for
com.apple.dt.remoteFetchSymbolsto download the dyld shared cache from iOS devices. This would enable local symbol resolution without needing Xcode.Motivation
Currently, resolving symbol addresses (e.g.
dlsym,objc_msgSend) in a remote process requires parsing Mach-O headers over GDB RSP memory reads (#699). While this works, having the shared cache locally would allow:Currently only Xcode downloads these symbols (to
~/Library/Developer/Xcode/iOS DeviceSupport/). go-ios doesn't have this capability.Implementation
The service is straightforward (see pymobiledevice3's
RemoteFetchSymbolsServicefor reference):com.apple.dt.remoteFetchSymbolsvia RemoteXPC{"XPCDictionary_sideChannel": <uuid>, "DSCFilePaths": []}→ receive file countThe shared cache is large (several GB), so downloading should be optional and cached per iOS version + build number.
Related
dlsymbootstrapping