Отладка macOS: подпись и символы
Dev entitlements, проверка подписи, .dSYM и диагностика attach.
Нативный LLDB и отладчик C# решают разные задачи. Эта страница — про attach к процессу macOS, разрешения подписи и символы нативного кода. Подготовку scheme смотрите в руководстве Xcode.
Локальная сборка редактора
Из Source, рядом с SConstruct, соберите dev-вариант с символами:
scons platform=macos target=editor arch=arm64 dev_build=yes debug_symbols=yes generate_bundle=yes -j4На Intel используйте arch=x86_64. Пример не включает C#: для managed-части выполните отдельные стадии из руководства сборки macOS. Упаковку C# .app выполняйте после подготовки managed-файлов.
В текущем упаковщике dev_build=yes выбирает misc/dist/macos/editor_debug.entitlements; обычная сборка выбирает editor.entitlements. Только первый из этих файлов содержит com.apple.security.get-task-allow. debug_symbols=yes не выбирает debug entitlements: символы позволяют читать стек, но не дают права attach.
Упаковщик по умолчанию использует локальную ad-hoc identity -. Это не Developer ID и не notarization. Кроме того, текущий вызов codesign в упаковщике не проверяет ненулевой exit code автоматически: успешное завершение SCons само по себе не доказывает корректную подпись.
Проверка фактического bundle
Подставьте путь к полученной .app; имя зависит от параметров сборки. Команды ниже читают подпись и символы, не переподписывают приложение:
codesign --display --entitlements - "/absolute/Reckfell.app"
codesign --verify --deep --strict --verbose=2 "/absolute/Reckfell.app"
dwarfdump --uuid "/absolute/Reckfell.app/Contents/MacOS/Reckfell"Для отладочного bundle проверьте com.apple.security.get-task-allow = true и результат проверки подписи. Не заменяйте это наличием entitlement-файла в исходниках: важны разрешения, реально встроенные в подпись конкретного приложения. Разрешение не гарантирует attach при любых системных политиках; при отказе сохраните точное сообщение LLDB, путь и PID процесса.
Если нужны отдельные символы, сборка поддерживает пару debug_symbols=yes separate_debug_symbols=yes. macOS post-action сначала запускает dsymutil, создаёт <binary>.dSYM, затем strip; обе команды должны завершиться успешно. Сохраняйте соответствующие бинарник, .dSYM и исходники одной сборки. Одинаковый номер версии 1.0.0 не делает разные сборки взаимозаменяемыми; сравнивайте UUID бинарника и .dSYM через dwarfdump --uuid.
Экспортированная игра
Для локального отладочного экспорта есть настройка codesign/entitlements/debugging, по умолчанию false. При формировании встроенных entitlements она добавляет com.apple.security.get-task-allow. Если используете собственный entitlement-файл, проверяйте именно его и итоговую подпись, а не только флажок preset.
Не распространяйте debug-подпись как релизную. Требования к notarization и get-task-allow приведены в документации Apple. Для релиза создайте отдельную сборку/экспорт без debug entitlement и заново проверьте подпись; переименование .app разрешения не меняет.
Диагностика
| Симптом | Что проверить |
|---|---|
| Attach запрещён | Итоговые entitlements, подпись, PID, пользователя процесса и текст отказа. Не отключайте системную защиту как стандартный шаг. |
| Breakpoint серый, видны адреса | Символы, UUID, архитектуру и соответствие исходников. get-task-allow не генерирует символы. |
| Останавливается другой процесс | Scheme executable, PID редактора/игры, путь запуска и --editor. |
| C#-строки недоступны в LLDB | Нативная остановка не подтверждает подключение managed-debugger. |
Проверены исходники выбора entitlements и генерации символов. Переподпись, macOS attach, notarization и экспорт в этой проверке не выполнялись.