Today my TouchBar finally died...
I own a second-generation MacBook Pro 15' with the TouchBar (mid-2017 model).
As many, I can't say I'm a big fan of this TouchBar gadget.
As a developer, spending most of my time coding, or doing stuff in the Terminal and in
vim, I miss real function or escape keys.
That being said, having TouchID on a Mac is awesome (T1 ftw), plus I usually use an external keyboard, so that's not really a big issue.
And of course, the machine itself is simply splendid.
Unfortunately, the TouchBar never really worked on this machine.
Most of the time, it required multiple reboots simply to power-on. TouchID was working fine, so this was more a display issue.
Also, I was running the beta versions of macOS High Sierra, so I tought of a software-related issue.
But now it looks like its definitely dead. No matter what I try, the TouchBar does not power-on.
It's just a useless black ribbon, at the top of my keyboard.
Booting in diagnostics mode reports no issue.
And no luck resetting the SMC and PRAM either.
So I tried to investigate at the software level.
The TouchBar runs an operating system of its own, apparently a variant of WatchOS, on a dedicated chip.
It communicates with macOS through a system service called
TouchBarServer, used by the
ControlStrip application (in
Now while there's a
TouchBarServer process running on my machine, there's no
This is obviously an issue.
I tried to start the
ControlStrip process manually, but that doesn't work.
So I thought I could try debugging it with
Running the process gives the following output:
Process 688 launched: '/System/Library/CoreServices/ControlStrip.app/Contents/MacOS/ControlStrip' (x86_64) Process 688 stopped * thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGABRT frame #0: 0x00007fff7c0dbe4e libsystem_kernel.dylib`__pthread_kill + 10 libsystem_kernel.dylib`__pthread_kill: -> 0x7fff7c0dbe4e <+10>: jae 0x7fff7c0dbe58 ; <+20> 0x7fff7c0dbe50 <+12>: movq %rax, %rdi 0x7fff7c0dbe53 <+15>: jmp 0x7fff7c0d31e8 ; cerror_nocancel 0x7fff7c0dbe58 <+20>: retq Target 0: (ControlStrip) stopped.
abort is called somewhere, for some reason.
The backtrace gives:
* thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGABRT * frame #0: 0x00007fff7c0dbe4e libsystem_kernel.dylib`__pthread_kill + 10 frame #1: 0x00007fff7c21a150 libsystem_pthread.dylib`pthread_kill + 333 frame #2: 0x00007fff7c038312 libsystem_c.dylib`abort + 127 frame #3: 0x000000010004f07d ControlStrip`___lldb_unnamed_symbol1597$$ControlStrip + 61 frame #4: 0x0000000100045aca ControlStrip`___lldb_unnamed_symbol1532$$ControlStrip + 490 frame #5: 0x0000000100045aff ControlStrip`___lldb_unnamed_symbol1533$$ControlStrip + 15 frame #6: 0x00007fff51946d62 AppKit`-[NSClassSwapper initWithCoder:] + 584 ...
Let's try to break on the first function before
After the usual prologue, we can see the following stuff, in the disassembly:
0x10004f046 <+6>: callq 0x100079a92 ; symbol stub for: DFRCreateCAContext 0x10004f04b <+11>: movq %rax, %rdi 0x10004f04e <+14>: callq 0x100079fb4 ; symbol stub for: objc_retainAutoreleasedReturnValue 0x10004f053 <+19>: movq %rax, %rbx 0x10004f056 <+22>: movq %rbx, %rdi 0x10004f059 <+25>: callq 0x100079f9c ; symbol stub for: objc_release 0x10004f05e <+30>: testq %rbx, %rbx 0x10004f061 <+33>: je 0x10004f06a ; <+42> 0x10004f06a <+42>: leaq 0x31611(%rip), %rax ; "TouchBarServer not running." 0x10004f071 <+49>: movq %rax, 0x57a28(%rip) 0x10004f078 <+56>: callq 0x100079ed6 ; symbol stub for: abort
ControlStrip calls a
DFRCreateCAContext function, which fails, returning
It then calls
abort, with a
TouchBarServer not running. message.
I already know the
TouchBarServer process is running, so I can try making this test pass py placing the value
1 in the
This way, I'll avoid the call to
The process indeed continues normal execution, outputting a ton of AutoLayout issues (c'mon Apple...).
But obviously, the display stays dark...
Now I'm convinced this is an hardware issue.
I also tried to reinstall a fresh copy of macOS High Sierra, and the problem persist.
Looking at the system logs, I can also see:
[DFR] [DFRDisplayRegisterForNotification_block_invoke] AddTerminatedNotification ret = 0x0 [DFR] [deviceTerminate] [DFR] ERR [_DFRDisplayHandleVendorPacket] DFR display not ready, possible hardware error [DFR] ERR [GetInfoTimeout] get info timeout, retrying [DFR] ERR [_DFRDisplayHandleVendorPacket] DFR display not ready, possible hardware error
So yeah, I think I'm left with bringing this puppy to the nearest Apple Store for an exchange...
Fragile little things...