Почему mdworker segfault при сканировании файлов, принадлежащих root?

2

Исследуя диск с постоянно сокращающимся свободным пространством mdworkerи частотой загрузки ЦП> 100%, я в конечном итоге определил, что проблема неоднократно была связана с ошибками, сохраняя занятость syslogd и CrashReporter.

Я попытался перестроить индексы Spotlight обычными способами: сначала через вкладку «Конфиденциальность» в «Системных настройках» -> «Spotlight», затем через mdworker -i off / ; mdworker -E -i on /и то же самое снова, но с промежуточной rm -rf /.Spotlight-V100загрузкой и перезагрузкой для хорошей меры; казалось, ничего не решило проблему.

Использование вкладки «Конфиденциальность» для исключения практически всего, кроме /Applications/добавления и удаления этой папки для принудительного повторного сканирования, и я смог определить, что некоторые файлы правильно проиндексированы (и отображаются в результатах Spotlight), а некоторые нет. ; немного больше возни с обнаружением того, opensnoop -n mdworkerчто при mdworkerзапуске с UID 501 сканировать файлы приложений, принадлежащие мне, он работает нормально (и то же самое для нескольких других UID, у которых есть файлы /Applications/), но когда он запускается с UID 89 ( _spotlight, согласно to dscl . -list /Users UniqueID) - предположительно для сканирования файлов, принадлежащих root - это segfaults.

Вот пример записи из консоли:

2015-07-16 13:53:25 com.apple.launchd[1]    (0x100101670.mach_init.mdworker[13276]) Job appears to have crashed: Segmentation fault
2015-07-16 13:53:25 com.apple.ReportCrash.Root[13274]   2015-07-16 13:53:25.326 ReportCrash[13274:341b] Saved crash report for mdworker[13276] version ??? (???) to /Library/Logs/DiagnosticReports/mdworker_2015-07-16-135325-1_localhost.crash

А вот отрывок из отчета о сбое (все они в значительной степени идентичны):

Process:         mdworker [13276]
Path:            /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/Metadata.framework/Versions/A/Support/mdworker
Identifier:      mdworker
Version:         ??? (???)
Code Type:       X86-64 (Native)
Parent Process:  launchd [1]

Date/Time:       2015-07-16 13:53:25.085 +0100
OS Version:      Mac OS X 10.6.8 (10K549)
Report Version:  6

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x000000010f5d1062
Crashed Thread:  3

[...]

Thread 3 Crashed:
0   ...ple.CoreServices.CarbonCore  0x00007fff867e7f0b CSStoreGetUnit + 84
1   com.apple.LaunchServices        0x00007fff821721ab _LSContainerCheckState + 65
2   com.apple.LaunchServices        0x00007fff82188fea _LSCopyLibraryItemURLs + 419
3   mdworker                        0x0000000100004305 0x100000000 + 17157
4   mdworker                        0x0000000100004c22 0x100000000 + 19490
5   mdworker                        0x00000001000050f3 0x100000000 + 20723
6   mdworker                        0x0000000100009aa2 0x100000000 + 39586
7   libSystem.B.dylib               0x00007fff80b94fd6 _pthread_start + 331
8   libSystem.B.dylib               0x00007fff80b94e89 thread_start + 13

[...]

Я достаточно уверен, что это не вызвано содержимым файлов, которые он пытается сканировать, потому что должен сканировать /Applications/, и opensnoopне сообщает, что это касается каких-либо файлов (фактически, список файлов, открытых для каждого сбойного UID 89 экземпляр идентичен, AFAICT).

Вполне возможно, что эта проблема связана с проблемами, возникшими у меня с Time Machine, которая началась примерно в то же время: backupdнеожиданно произошла ошибка - не сразу при запуске, а в процессе монтирования тома резервного копирования NAS. Вот выдержка из отчета о сбое резервного копирования:

Thread 5 Crashed:
0   ...ple.CoreServices.CarbonCore  0x00007fff867e7f0b CSStoreGetUnit + 84
1   com.apple.LaunchServices        0x00007fff8217f3fb _LSBundleFindWithNode + 544
2   com.apple.LaunchServices        0x00007fff82177bd1 _LSFindOrRegisterBundleNode + 219
3   com.apple.LaunchServices        0x00007fff82177a85 _LSCopyItemAttributeForRefInfoWithOptions + 201
4   com.apple.LaunchServices        0x00007fff821799cf prepareAttributeValueForKey(__CFURL const*, __FileCache*, __CFString const*, void const**, __CFError**) + 79
5   com.apple.LaunchServices        0x00007fff82179934 prepareDistinctLocalizedNameValue(__CFURL const*, __FileCache*, __CFError**) + 36
6   com.apple.LaunchServices        0x00007fff8217990b prepareLocalizedNameValue(__CFURL const*, __FileCache*, __CFError**) + 9
7   com.apple.LaunchServices        0x00007fff82179712 LSPropertyProviderPrepareValues(__CFURL const*, __FileCache*, __CFString const* const*, void const**, long, void const*, __CFError**) + 51
8   ...ple.CoreServices.CarbonCore  0x00007fff867f8dd4 prepareValuesForBitmap(__CFURL const*, __FileCache*, _FilePropertyBitmap*, __CFError**) + 264
9   ...ple.CoreServices.CarbonCore  0x00007fff867f78bd _FSURLCopyResourcePropertiesForKeys + 980
10  com.apple.CoreFoundation        0x00007fff897dc562 CFURLCopyResourcePropertiesForKeys + 98
11  com.apple.DesktopServices       0x00007fff833737af TCFURLInfo::FetchProperties(bool) + 91
12  com.apple.DesktopServices       0x00007fff8337358f TCFURLInfo::Initialize(__CFURL const*, bool, bool) + 183
13  com.apple.DesktopServices       0x00007fff833d1acd TCFURLInfo::Initialize(char const*, unsigned int) + 89
14  com.apple.DesktopServices       0x00007fff833d369c TCFURLInfo::CreateDirectory(TUString const&, TUniqueNamer*, __FSFileSecurity*, bool, TCountedPtr<TCFURLInfo>&) const + 464
15  com.apple.DesktopServices       0x00007fff833dc95a TCopyWriter::CreateNewDestinationItem() + 178
16  com.apple.DesktopServices       0x00007fff833dd136 TCopyWriter::CreateItem() + 1126
17  com.apple.DesktopServices       0x00007fff833dd41e TCopyWriter::Write() + 146
18  com.apple.DesktopServices       0x00007fff833dd6a6 TCopyWriter::WriteTaskProc(void*) + 72
19  ...ple.CoreServices.CarbonCore  0x00007fff867e40d1 PrivateMPEntryPoint + 63
20  libSystem.B.dylib               0x00007fff80b94fd6 _pthread_start + 331
21  libSystem.B.dylib               0x00007fff80b94e89 thread_start + 13

Я использовал Дисковую Утилиту для проверки работоспособности тома и разрешений. Я попытался переустановить 10.6.8 Combo Update 1.1 и Дополнительное обновление.

Что может быть причиной этих сбоев, и как я могу это исправить?

cpcallen
источник
Если у вас установлены сторонние приложения, вот одна из идей. Попробуйте «разделить половину» на / Applications - то есть временно переместить половину приложений в другое место, перестроить индекс и посмотреть, не сработает ли он ... если он не сработает, проблема в тех приложениях, которые остаются: повторяйте процесс, пока вы не сузили его вниз (надеюсь) одно конкретное приложение. (Писать в спешке: извините, если это неясно ...)
Эшли
@ Эшли: это имело бы смысл, если бы он когда-либо открыл какие-либо файлы в /Applications/собственности root, но он даже не зашел так далеко.
cpcallen

Ответы:

5

Проблема была вызвана повреждением кэша Launch Services, и я решил ее, выполнив следующую команду:

sudo find /System/Library/Frameworks -type f -name lsregister -exec {} -kill -seed -r \;

Подсказка состояла в том, что произошла ошибка CSStoreGetUnit + 84в обоих процессах; быстрый поиск в Google приводит к записи в блоге, которая предполагает, что проблема может быть связана с повреждением кэша. Вместо того, чтобы вручную rmизвлекать файлы кеша, я следовал инструкциям, которые я нашел в The X Lab , что представляло собой подробное объяснение того, как открыть терминал для запуска вышеупомянутой команды, отмечая:

  • На этой странице есть опечатка, связанная с умными цитатами (сообщается).
  • Поскольку он mdworkerработал как UID 501 (и несколько других), я догадался, что мне придется сбросить rootкэш служб запуска; префикс sudoимел желаемый эффект.

Дополнительные примечания:

  • На 10.8.6 (как минимум) вы можете увидеть все файлы кэша Launch Service с помощью следующей команды:

    sudo find /var/folders /Library/Caches/ -name '*LaunchServices*' -print0 |sudo xargs -0 ls -l 
    
  • По неизвестной причине, недавно измененный файл кэша для UID 501 существует в обоих /Library/Caches/и /var/folders/; другие UID имеют только один под /var/folders/. Это, кажется, не вызывает никаких проблем.

  • Это действительно решило проблему с backupd.

cpcallen
источник