问题
Today was the first time that I tried - and failed - to symbolicate a crash log on a newly bought MacBook (let's call this machine MB1). MB1 came with Mac OS X 10.9 pre-installed. I tracked the problem of the failing symbolication down to Spotlight not indexing any of my .dSYM
bundles (without the Spotlight index, Apple's symbolicatecrash
script fails to locate the .dSYM
bundle that matches the crash log). I came to my conclusion because
mdfind "com_apple_xcode_dsym_uuids == *"
does not print anything, although I have several .xcarchive
bundles in my ~/Library/Developer/Xcode/Archives
folder, and they definitely contain .dSYM
sub-bundles whose UUID I can print with dwarfdump --uuid
. I also have a couple of .dSYM
bundles inside my project's build folder (DerivedData
), but none of them are indexed either.
The short and easy question therefore is: How can I tell Spotlight to index my .dSYM bundles?
In case there is no easy answer for this easy question, here is what I have already tried on MB1:
- Check permissions of files and folders in
~/Library/Developer/Xcode/Archives
(they are all OK, 755 for folders, 644 for files) - Run
mdimport ~/Library/Developer/Xcode/Archives
(has no effect) - In "System Preferences > Spotlight > Privacy" first add and then remove the
~/Library/Developer/Xcode/Archives
folder (has no effect either) - Check with
mdutil -s /
that indexing is enabled for the volume (it is) - Erase and rebuild the entire index
mdutil -E /
(takes maybe 10-15 minutes, but still has no effect)
To go into more detail: I have an older MacBook (let's call this machine MB2) that was my dev machine before I switched to MB1. On MB2 I never had any trouble with symbolicating. MB2 had Mac OS X 10.8 installed while I was still actively developing on it, but I recently upgraded MB2 to Mac OS X 10.9.
Today, running mdfind
on MB2 still gives me a lot of .dSYM
bundles, both from the Archives
folder and from the project's DerivedData
build folder. These are all old files from the Mac OS X 10.8 days, but apparently Spotlight keeps its index across OS upgrades. I thought it would be interesting to see how Spotlight behaves when new files are created, so I did the following:
- Fire up Xcode on MB2, create a new archive, and run
mdfind
. This finds the intermediate.dSYM
bundle inside theDerivedData
build folder. - Delete the intermediate
.dSYM
bundle and runmdfind
again. No results this time, i.e. the.dSYM
bundle inside theArchives
folder is NOT found! - Make a copy of the
.xcarchive
bundle created in step 1 and place the copy in the root of the user home directory. Runmdfind
. This finds the.dSYM
sub-bundle within the copied.xcarchive
bundle!
At this point, I jumped to the conclusion that because ~/Library
is a hidden folder this is what prevents Spotlight from indexing stuff within it. This can be easily confirmed by creating a regular file inside ~/Library
and searching for it (no hits), then moving the file outside of ~/Library
and searching again (1 hit). Unfortunately, this theory falls flat on its nose because of two reasons:
~/Library
was already hidden in Mac OS X versions prior to 10.9, but this never prevented Spotlight from indexing.dSYM
files- The "hidden" flag is not all that keeps Spotlight from indexing stuff in
~/Library
: If I unhide the folder withchflags nohidden ~/Library
, that does not make the regular file visible to Spotlight.
Back to MB1: I tried to repeat step 3 from above, i.e. make a copy of the .xcarchive
bundle in the root of the user's home directory, then run mdfind
. Surprisingly, on MB1, the result is different from MB2: mdfind
still finds no .dSYM
bundles whatsoever!
At this point I give up and hope for your help. My conclusion is that Mac OS X 10.9 is somehow responsible for my problems, but for the life of me I can't figure out why this is so. In case it helps, here are a few additional configuration details:
- MB1: Xcode 5.0.2 and Xcode 4.6 are installed, 5.0.2 is the default (set with
xcode-select
). Also installed is Homebrew. The system is a clean install of Mac OS X 10.9. - MB2: Xcode 4.5, 4.6 and 5.0 are installed, 4.6 is the default. Also installed is MacPorts. The system is an upgrade install of Mac OS X 10.9 (previously installed .
回答1:
Peeking into an Xcode application bundle reveals the following Spotlight importers:
caradhras:~ --> find /Applications/Xcode-5.0.2.app -name \*.mdimporter
/Applications/Xcode-5.0.2.app/Contents/Applications/Application Loader.app/Contents/Library/Spotlight/MZSpotlight.mdimporter
/Applications/Xcode-5.0.2.app/Contents/Library/Spotlight/uuid.mdimporter
Running this command
mdimport -g /Applications/Xcode-5.0.2.app/Contents/Library/Spotlight/uuid.mdimporter ~
finally indexes the .xcarchive
bundle that is in the root of the user's home directory. It does NOT index the bundles in ~/Library/Developer/Xcode/Archives
, though, even when I explicitly point mdimport
to this folder.
The question remains: Why is uuid.mdimporter
not run automatically?
EDIT
The solution was to reboot the machine (logout/login might have been sufficient), archive bundles outside of ~/Library
are now properly indexed. The reason why I needed to reboot probably is this:
- I am using a privileged admin user (A) for installing software, but I am using a different, non-privileged user (U) for normal work, such as developing with Xcode.
- I was logged in with user U at the time I installed Xcode with user A
- Since that time I have never rebooted, nor made any logins (I prefer sending my machine to sleep over night instead of shutting it down). Presumably, the list of active Spotlight importers is updated (probably by launch services) only when logging out/logging in, or after a reboot.
Anyway, during troubleshooting I found that you can check the list of active Spotlight importers by running mdimport -L
(note that different users can have different Spotlight importers active at the same time). Unsurprisingly, after the reboot uuid.mdimporter
is now listed, while before the reboot it was not.
Here is a useful Apple document that I found after some googling: Troubleshooting Spotlight Importers.
FINAL SOLUTION
Configure Xcode so that the archive folder is located outside of ~/Library
. In Xcode 6 you can do this in the Preferences dialog, under the "Locations" tab.
来源:https://stackoverflow.com/questions/20715303/how-can-i-tell-spotlight-to-index-my-dsym-bundles