ideas & ramblings

How to debug a Cocoa crash

(Originally published in 2012.)

You'll need a crash report. It'll start out something like this:

Process:         DragonDrop [21032]
Path:            /Applications/DragonDrop.app/Contents/MacOS/DragonDrop
Identifier:      com.shinyplasticbag.DragonDrop
Version:         1.0b1 (1.0)
Code Type:       X86-64 (Native)
Parent Process:  launchd [125]

In the Binary Images section, find the line with your app's bundle identifier in it. You'll need the load address (highlighted in blue) and the full path to the executable (highlighted in green).

       0x10d477000 -        0x10d489fff +com.shinyplasticbag.DragonDrop (1.0b1 - 1.0) <8576B764-B97E-36B7-97B8-1F86BC53C2D9> /Applications/DragonDrop.app/Contents/MacOS/DragonDrop

Open up a Terminal and run the atos command (this assumes you're debugging an x86_64 executable):

atos -arch x86_64 -o /Applications/DragonDrop.app/Contents/MacOS/DragonDrop -l 0x10d477000

atos will wait for you to enter addresses, one per line. The crash report will tell you which thread crashed:

Crashed Thread:  0  Dispatch queue: com.apple.main-thread

So, scroll to that part of the crash report and find the first line that includes your bundle id.

1   com.shinyplasticbag.DragonDrop 0x000000010d47edbe 0x10d477000 + 32190

That's where your code crashed. Copy the hex addresses (highlighted in red) and paste them into your atos window:

 0x000000010d47edbe 0x10d477000

-[NSApplication (NSApplication_shouldStartAtLogin) loginItemExistsWithLoginItemReference:ForPath:] (in DragonDrop) (NSApplication+startAtLogin.m:93)
0x0000000100000000 (in DragonDrop)

This tells us that our code crashed on line 93 of NSApplication+startAtLogin.m. Neat.