KeyMob
All articles

"It only happens on that one phone"

4 min readDevicesDebugging

Most teams have seen this: a bug that reproduces reliably on one device, on no one else’s, and survives every attempt to dismiss it as user error.

There is almost always a concrete explanation, usually a difference in device state that nobody has listed. Here is the list, roughly in order of how often each item turns out to be the cause.

1. iOS version

This is the first thing to check, and the most often skipped, because everyone assumes they know it. A point release changes behavior more often than expected, including WebKit, the network stack, the keyboard, background scheduling and the memory limits a process receives.

Get the exact build, not just “iOS 17”. 17.4 and 17.4.1 are different software.

2. Free storage

A device with nearly full storage misbehaves in ways that do not look like a storage problem:

  • Writes fail, sometimes silently, depending on how errors are handled
  • Caches are evicted as soon as they are written, so caching appears not to work
  • Installing a build fails partway
  • The system terminates background processes more aggressively

Ask for the amount of free space. If it is under a couple of gigabytes, treat it as the main suspect.

3. Temperature

A hot phone throttles. A device in a case, on a sunny desk, or running a capture for twenty minutes is slower than the same model kept cool.

The sign is that the problem gets worse the longer the session runs, and disappears after the phone rests for ten minutes.

4. Battery health

An old battery cannot deliver peak current like a new one, and iOS limits performance to avoid unexpected shutdowns. A device at 78% capacity with 900 cycles does not perform like the same model at 100%.

Read the capacity and the cycle count, rather than assuming the battery is fine.

5. Configuration profiles

These are rarely checked, and they cause the strangest results. A profile can install a root certificate, route traffic through a VPN, disable a system capability, or enroll the device in MDM with its own policies.

If a device has a VPN profile you did not know about, treat every network-related symptom on it as suspect: a different apparent region, different latency, or requests that fail only on that device.

6. Language, region and locale

These affect number formatting, date parsing, text direction, sort order and the length of every string in the interface. A layout that breaks only in German is a real category of bug, and so is a date parser that fails only in a locale with a different calendar.

7. Accessibility settings

Larger Text, Bold Text, Reduce Motion, Reduce Transparency, Increase Contrast and VoiceOver each change layout or behavior. They are common among real users, so “only on that phone” often means “only with Dynamic Type at maximum”.

8. Time and time zone

A device with a manually set clock, or in a time zone across the date line, exposes date-handling errors. Cache expiry, token refresh and “today’s” content are often affected.

9. Network

The difference is not only Wi-Fi versus cellular. Captive portals, IPv6-only carriers, corporate DNS, an app-level VPN and Low Data Mode all matter. Low Data Mode alone disables background refresh and lowers video quality, which changes app behavior significantly while nothing on the device looks unusual.

10. Model and memory

A phone with 3 GB of RAM gets a smaller memory allowance than one with 8 GB. Code that works on a flagship can be terminated by jetsam on a budget model, which appears as a crash report with no exception. Screen size and safe-area insets also belong in this category.

How to work through the list

  1. Record the device state before changing anything. iOS build, storage, battery health and cycle count, installed profiles, locale and accessibility settings. Many investigations end at this step.
  2. Find one difference. Compare with a device where the bug does not reproduce.
  3. Reproduce that difference on another device. If you suspect storage, fill another device’s storage. This step turns a theory into a finding.
  4. Then read the logs and captures, now that you know what to look for.

The cause not on the list

Sometimes the cause is the user’s data: an account with fifty thousand records, a corrupted local database, or an incomplete migration from a version two years old. When every device attribute matches and the bug follows the person rather than the phone, check what the app has stored. The answer is in the app’s container.