Get serial output on modern Macs with practical steps for macOS 14 vs 15+. Perfect for hardware-aware AI devs debugging early boot issues.

Serial Output on Modern Macs: Debug Like a Pro
Most teams only miss serial logs when they really need them—during a flaky boot loop, a kernel panic, or a hardware bring-up that fails before any higher-level logging comes online.
On modern Apple Silicon Macs, getting serial port output isn’t “plug in a USB-UART and open a terminal” anymore. Apple has shifted many devices to default their debug console over DockChannel instead of legacy UART, which is why familiar workflows (and commands like macvdmtool serial) often appear “broken.” They’re not broken; the plumbing changed.
This matters for the AI in Technology and Software Development crowd more than you might think. Edge AI prototypes, hardware accelerators, custom peripherals, and robotics stacks all rely on tight hardware-software feedback loops. When your device fails early in boot, serial output is still the most dependable signal. If your team builds or deploys AI systems that touch hardware, you want this capability in your toolkit.
Why serial output got harder on Apple Silicon
Modern Macs increasingly route “serial-like” debug output through DockChannel rather than a classic UART line. The practical result:
- Your target may not expose a traditional UART debug console by default.
- Tools expecting legacy UART can’t find it.
- The right device node may exist, but it won’t be connected to what you think it is.
Here’s the clean mental model:
Legacy UART is a physical-ish console path. DockChannel is a newer Apple debug transport that can replace it.
For developers doing hardware-aware work—especially teams shipping AI at the edge—this shift forces a choice:
- Accept DockChannel as the default and adapt tooling.
- Switch the target back to legacy UART mode when you need predictable serial behavior.
This post focuses on option 2, because it’s the closest thing to “known good” when you’re debugging low-level failures.
The practical path: enabling legacy UART serial logs
The shortest accurate answer: you need to set the right boot-args on the target device, and on macOS 15+ you must also point serial-device at the correct UART node in the DeviceTree.
Before you start: a reality check on risk
Switching these settings is not a casual tweak. You’ll be modifying boot-time behavior and lowering protections.
If you’re doing this on production hardware, don’t. Use a dedicated dev machine.
You’ll typically need to:
- Disable SIP on the target
- Disable boot-arg filtering on the target
- Apply boot-args for serial routing
That’s a lot of power. Treat it like root access on your CI signing keys.
Boot-args you’ll actually use
On the target device, the baseline serial selection is:
serial=3(orserial=7, depending on which port / routing you need)
Then the path splits by OS version.
macOS 14 and below: the “simple” option
On macOS 14 or older, there’s a boot-arg that explicitly asks for legacy UART:
use-legacy-uart=1
If you’re supporting a lab of mixed machines, this difference alone is worth documenting internally. I’ve seen teams waste hours because they assumed the same boot-args work across major OS versions.
macOS 15 and above: use-legacy-uart is gone
On macOS 15+, Apple rewrote parts of serial init and the old boot-arg no longer exists. Instead, you must select the correct serial device via DeviceTree by setting:
serial-device=<AAPL,phandle>
That AAPL,phandle value is model-specific. You cannot reliably copy it from someone else’s screenshot or blog post.
How to find the right serial-device value (macOS 15+)
Answer first: extract your device’s DeviceTree and read the uart0 node’s AAPL,phandle.
A workable workflow looks like this:
- Download the IPSW for your device model.
- Extract the DeviceTree for your model.
- Locate the
uart0node. - Read the outer
AAPL,phandlevalue (not the one nested underdebug-console). - Set boot-arg
serial-device=<that value>.
A quick “why this works” explanation: the DeviceTree includes defaults for which device should be treated as the system’s serial console. On 15+, Apple’s defaults often point at dockchannel-uart, and you’re overriding that selection to route logs to the UART you want.
Snippet-worthy rule: On macOS 15+, “getting serial back” mostly means “overriding the DeviceTree-selected console device.”
Host-to-target setup: cables, ports, and the “it’s the wrong USB-C port” problem
After setting boot-args, you still need the physical/logical path between machines.
The core steps:
- Reboot the target and confirm boot-args actually applied.
- Connect host and target using the correct cable and the correct DFU-capable port.
- Use the host tool to trigger reboot into serial.
If you’ve ever lost an afternoon to this, you’re not alone. Modern laptops have multiple USB-C ports with different internal routing, and not all ports behave the same for DFU/debug scenarios.
Using macvdmtool reboot serial
Once the cable and port are correct, you can typically initiate serial mode from the host:
macvdmtool reboot serial
One more gotcha: if your host is on newer macOS versions (Monterey and above), you may need to remove AppleSerialShim from the boot kernel cache to make everything behave.
That detail is easy to miss because it’s “host-side,” and most people focus entirely on target configuration.
Viewing serial logs: a working command and why it’s configured that way
To actually see the logs, a simple approach is using picocom against the debug console device.
Example:
sudo picocom -q --omap crlf --imap lfcrlf -b 115200 /dev/tty.debug-console
Why the extra mapping flags?
- Serial logs often mix line endings depending on firmware/boot stage.
- Normalizing CR/LF makes logs readable and easier to parse.
- If you’re piping output into tooling (or even an LLM), consistent line breaks matter.
Turning logs into something your team can use
If you’re doing AI-assisted debugging (which a lot of teams are experimenting with in late 2025), structure helps. A few practical habits:
- Capture logs to a timestamped file per boot attempt.
- Add a short human note at the top: “Changed boot-args,” “swapped cable,” “new firmware build,” etc.
- Keep the first 200 lines and the last 200 lines handy—those are usually the most informative.
This is where CLI-first workflows shine. Serial capture becomes reproducible, scriptable, and easy to attach to bug reports.
Why hardware-aware developers (and AI teams) should care
Serial output feels like “old-school embedded stuff,” but it’s increasingly relevant in modern AI development.
Edge AI and boot-time failures are common
When you’re deploying models to devices with strict power budgets, custom drivers, or experimental kernels, failures often happen before your observability stack starts.
Serial logs are often the only place you’ll see:
- Early init errors
- Driver probe failures
- Kernel panic backtraces (at the moment they happen)
- Secure boot / boot policy issues
Hardware integration is a software delivery problem
Teams building AI products usually think in layers: model, runtime, app. But the delivery pipeline includes hardware realities:
- USB controllers and power negotiation
- DeviceTree configuration
- Boot-arg differences across OS versions
If you don’t control this layer, you’ll ship slower. Worse, you’ll debug by guesswork.
Opinion: If your AI roadmap includes edge devices, someone on your team needs to be comfortable below the application layer. Otherwise, you’ll burn weeks on issues that a serial console would clarify in minutes.
Bonus: running macvdmtool on iOS (what it’s good for, what it isn’t)
Answer first: you can use macvdmtool on iOS for DFU and reboot workflows, but you won’t get serial console devices like /dev/cu.debug-console.
Doing this requires jailbreak-level access and compiling/signing with specific entitlements, including:
com.apple.security.iokit-user-client-class:AppleHPMUserClientcom.apple.USBCEntitlement:true
The takeaway for most developers isn’t “go jailbreak devices.” It’s that Apple’s internal diagnostic pathways exist, and with the right privileges, you can automate parts of device management that are painful to do manually.
For teams running hardware labs (common in robotics and edge AI), automation around reboot/DFU can reduce the human cost of testing.
A short troubleshooting checklist (the stuff that usually bites)
If you set boot-args and still see nothing, check these in order:
- Wrong port: you’re not using the DFU-capable USB-C port on one of the machines.
- Wrong device selection: on macOS 15+, your
serial-devicepoints to DockChannel instead ofuart0. - Boot-args didn’t apply: SIP/boot-arg filtering still blocks them.
- Host-side shim issues: newer macOS host still has
AppleSerialShiminterfering. - Wrong TTY: you’re tailing a different
/dev/tty.*node than the debug console.
When you’re under pressure, this list saves time because it’s ordered by likelihood.
Where this fits in modern software development (and why it’s not “just hardware”)
Serial access is a small capability with an outsized impact: it turns opaque failures into diagnosable ones.
In this AI in Technology and Software Development series, a recurring theme is that AI productivity gains don’t come only from better code generation—they come from shorter feedback loops. Hardware integration is one of the most expensive feedback loops developers deal with.
If you’re building AI systems that touch devices—sensor hubs, inference boxes, custom USB peripherals, even lab rigs—getting serial output on modern Macs is a force multiplier. It gives you reliable ground truth, and it gives your automation a solid footing.
Where would your team be if every “it won’t boot” ticket came with the first 30 seconds of boot logs attached?