В чем смысл: "Номер версии файла формата дерева поиска (0) не поддерживается"?

В macOS 10.13 High Sierra на Xcode 9 Я получаю это сообщение журнала:

2017-09-28 15: 19: 28.246511 + 0800 wr [5376: 128702] MessageTracer: load_domain_whitelist_search_tree: 73: Формат версии файла формата дерева поиска (0) не поддерживается 2017-09-28 15: 19: 28.246541 + 0800 wr [ 5376: 128702] MessageTracer: возврат к стандартному белому списку

В чем смысл этого сообщения?

Ответ 1

Эти сообщения поступают из функции msgtracer_domain_new в /usr/lib/libDiagnosticMessagesClient.dylib.

  1. Запустите приложение на Xcode 9.
  2. Прекрати это.
  3. В навигаторе отладки щелкните NSApplicationMain чуть выше main
  4. Установите pushq %rbp останова на первой строке pushq %rbp
  5. Запустите приложение еще раз.
  6. Когда точка останова попадает, установите другую breakpoint set -n msgtracer_domain_new останова, набрав breakpoint set -n msgtracer_domain_new
  7. Продолжить выполнение программы.

По достижении точки останова загляните в код ассемблера. ты увидишь:

libDiagnosticMessagesClient.dylib'msgtracer_domain_new:
->  0x7fff667c7f08 <+0>:    pushq  %rbp
    0x7fff667c7f09 <+1>:    movq   %rsp, %rbp
    0x7fff667c7f0c <+4>:    pushq  %r15

(omit)

    0x7fff667c7ff1 <+233>:  leaq   0xc1d(%rip), %rdi         ; "/Library/Application Support/CrashReporter/SubmitDiagInfo.domains"
    0x7fff667c7ff8 <+240>:  xorl   %r13d, %r13d
    0x7fff667c7ffb <+243>:  movl   $0x20, %esi
    0x7fff667c8000 <+248>:  xorl   %eax, %eax
    0x7fff667c8002 <+250>:  callq  0x7fff667c8990            ; symbol stub for: open

(omit)

    0x7fff667c801d <+277>:  leaq   0xc33(%rip), %rsi         ; "format_version"
    0x7fff667c8024 <+284>:  movl   $0x4, %ecx
    0x7fff667c8029 <+289>:  xorl   %r8d, %r8d
    0x7fff667c802c <+292>:  xorl   %r9d, %r9d
    0x7fff667c802f <+295>:  movl   %r15d, %edi
    0x7fff667c8032 <+298>:  movq   %r12, %rdx
    0x7fff667c8035 <+301>:  callq  0x7fff667c895a            ; symbol stub for: fgetxattr
    0x7fff667c803a <+306>:  cmpl   %r13d, (%r12)
    0x7fff667c803e <+310>:  jne    0x7fff667c808b            ; <+387>
    0x7fff667c8040 <+312>:  movl   $0x0, (%rsp)
    0x7fff667c8047 <+319>:  leaq   0xc18(%rip), %rcx         ; "MessageTracer: %s:%d: Search tree file format version number (%u) is not supported"
    0x7fff667c804e <+326>:  leaq   0xb9e(%rip), %r8          ; "load_domain_whitelist_search_tree"

(omit)

    0x7fff667c808f <+391>:  leaq   0xc25(%rip), %rcx         ; "MessageTracer: Falling back to default whitelist"
    0x7fff667c8096 <+398>:  xorl   %edi, %edi
    0x7fff667c8098 <+400>:  xorl   %esi, %esi
    0x7fff667c809a <+402>:  movl   $0x6, %edx
    0x7fff667c809f <+407>:  xorl   %eax, %eax
    0x7fff667c80a1 <+409>:  callq  0x7fff667c8924            ; symbol stub for: asl_log

В моем случае, MacBook Pro в конце 2011 года работает High Sierra 10.13:

$ ls [email protected] "/Library/Application Support/CrashReporter/SubmitDiagInfo.domains"
[email protected] 1 root  admin  12988 Sep 21  2014 /Library/Application Support/CrashReporter/SubmitDiagInfo.domains
    com.apple.TextEncoding     15 
    os_version     12 

Этот файл не имеет format_version ожидаемого функцией msgtracer_domain_new

Кто-нибудь знает, как его обновить?

Добавив:

Советы по изучению подобного явления.

Найдите идентификатор процесса вашего приложения.

$ ps -ef | grep your_app_name | grep -v grep
  999 86803 86804   0  1:34AM ??         0:00.97 /Users/xxx/Library/Developer/Xcode/DerivedData/....

Получите пути к файлу, загруженные вашим приложением.

$ vmmap 86803 | perl -ne 'print "$1\n" if m{(/\S*)\Z}' | sort -u > z

Отредактируйте временный файл по мере необходимости, чтобы удалить непоправимые пути к файлам.

Найдите файл, который содержит сообщение.

$ cat z | xargs grep -l -b 'Search tree file' 2> /dev/null
/usr/lib/libDiagnosticMessagesClient.dylib

Подтвердите, существует ли сообщение.

$ strings /usr/lib/libDiagnosticMessagesClient.dylib | grep 'Search tree file'
MessageTracer: %s:%d: Search tree file format version number (%u) is not supported

Производите команды отладчика, а затем применяйте их.

$ nm /usr/lib/libDiagnosticMessagesClient.dylib | grep " T " | sort -u | perl -pe 's/.* _/breakpoint set -n /'
breakpoint set -n msgtracer_domain_new
breakpoint set -n msgtracer_domain_free
breakpoint set -n msgtracer_msg_new
breakpoint set -n msgtracer_set
breakpoint set -n msgtracer_msg_free
breakpoint set -n msgtracer_vlog
breakpoint set -n msgtracer_log
breakpoint set -n msgtracer_vlog_with_keys_skip_nulls
breakpoint set -n msgtracer_vlog_with_keys
breakpoint set -n msgtracer_log_with_keys
breakpoint set -n msgtracer_log_with_keys_skip_nulls
breakpoint set -n msgtracer_uuid_create

Указанный выше способ не является совершенным. Он не заботится о белых пробелах в пути к файлу. Пока это работает, все будет хорошо. Мне нравится использовать perl для обработки текстов. Вы будете использовать свои любимые.

Ответ 2

Эта команда удаляет сообщения журнала:

xattr -w format_version 1 "/Library/Application Support/CrashReporter/SubmitDiagInfo.domains"

Ответ 3

Я видел эту проблему на компьютере, который был обновлен до High Sierra.

Я пошел в панель безопасности и конфиденциальности в системных настройках. На вкладке конфиденциальности я разблокировал и обновил параметры конфиденциальности. Я установил совместное использование с Apple и сторонними разработчиками. Проблема исчезла.