"пожалуйста, проверьте, что gdb имеет кодовое обозначение - см. taskgated (8)" - Как получить gdb, установленный с кодом доморощенного, подписанным?
Я под osx 10.8.4 и установил gdb 7.5.1 с homebrew (мотивация получает новый gdb с новыми функциями, такими как --with-python и т.д.)
Короче говоря, когда я запускаю debug в проекте С++ Eclipse, я получаю:
Error in final launch sequence
Failed to execute MI command:
-exec-run
Error message from debugger back end:
Unable to find Mach task port for process-id 46234: (os/kern) failure (0x5).
(please check gdb is codesigned - see taskgated(8))
Unable to find Mach task port for process-id 46234: (os/kern) failure (0x5).
(please check gdb is codesigned - see taskgated(8))
Я следил за различными предложениями для подписания кода
Итак, я сделал:
- Настройка сертификата
- Подпишите gdb → codesign -s gdb-cert/usr/local/bin/gdb
Когда я повторно запускаю отладку в Eclipse, я получаю ту же ошибку, что и выше "(пожалуйста, проверьте, что gdb имеет кодовое обозначение - см. taskgated (8))".
Если я верну gdb к старшему gdb (в настройках gdb Eclipse)/usr/libexec/gdb/gdb-i386-apple-darwin, отладка выполняется как ожидалось.
Любые решения/намеки?
спасибо
Пелле
Ответы
Ответ 1
Эта ошибка возникает из-за того, что OSX реализует политику доступа к pid, которая требует, чтобы двоичные файлы имели цифровую подпись для доступа к другим pid-процессам. Чтобы разрешить доступ gdb к другим процессам, мы должны сначала подписать код двоичным кодом. Эта подпись зависит от конкретного сертификата, который пользователь должен создать и зарегистрировать в системе.
Чтобы создать сертификат подписи кода, откройте приложение Keychain Access. Выберите меню Keychain Access → Certificate Assistant → Создать сертификат…
Выберите имя для сертификата (например, gdb-cert), установите для параметра "Тип идентификации" значение "Самоподписанный корень", для параметра "Тип сертификата" выберите значение "Подписание кода" и выберите значения по умолчанию "Разрешить переопределение". Нажмите несколько раз на кнопку "Продолжить", пока не перейдете к экрану "Указать местоположение для сертификата", затем установите для "Связки ключей" значение "Система".
Дважды щелкните сертификат, откройте раздел "Доверие" и установите "Подписывание кода" на "Всегда доверять". Выход из приложения Keychain Access.
Перезапустите сервис на основе задач и подпишите двоичный файл.
$ sudo killall taskgated
$ codesign -fs gdb-cert "$(which gdb)"
источник http://andresabino.com/2015/04/14/codesign-gdb-on-mac-os-x-yosemite-10-10-2/
В macOS 10.12 (Sierra) и более поздних версиях также необходимо
Используйте gdb 7.12.1 или новее. Кроме того, запретите gdb использовать оболочку для запуска программы, подлежащей отладке. Вы можете использовать следующую команду для этого внутри GDB:
set startup-with-shell off
Вы также можете поместить эту последнюю команду в файл с именем .gdbinit в вашем домашнем каталоге, и в этом случае она будет применяться автоматически каждый раз, когда вы запускаете gdb
echo "set startup-with-shell off" >> ~/.gdbinit
ИСТОЧНИК: https://sourceware.org/gdb/wiki/BuildingOnDarwin
Ответ 2
Я сделал gdb работу над OSX 10.9 без координирования таким образом (описано здесь):
-
Установите gdb с помощью macports. (возможно, вы можете пропустить его)
-
sudo nano/System/Library/LaunchDaemons/com.apple.taskgated.plist
измените строку параметров с -s
на -sp
в строке 22, col 27.
-
перезагрузите компьютер.
-
Используйте gdb. Если вы установили его с портами mac, вы должны использовать команду "ggdb". Или сделал псевдоним в вашем файле конфигурации:
alias gdb = 'ggdb'
и затем используйте команду "gdb".
Ответ 3
У меня возникла такая же проблема с GDB.
Я бегу под Mac OS X 10.8.5
иначе Горный Лев.
Я использую версию GDB 7.7.1
.
Я скомпилировал свою тестовую программу со следующей командой:
g++ -o gdb-sample.out -g gdb-sample.cpp
Если я ввел команду gdb sample.out
, я получаю такое же загадочное сообщение об ошибке:
"Unable to find Mach task port for process-id 46234: (os/kern) failure (0x5). (please check gdb is codesigned - see taskgated(8))"
Это сообщение об ошибке, однако, является красной селедкой.
Решение, которое я нашел для меня, состояло в том, чтобы просто вызвать GDB с помощью acus суперпользователя:
sudo gdb sample.out.
Это отлично работает для меня.
И с этой точки я мог бы запустить GDB example.out без использования sudo.
Надеюсь, что это помогает и работает для других.
RSVP, если это не так.
Ответ 4
Для тех, кто использует Sierra 10.12.6 (и выше) и Homebrew, /usr/local/bin/gdb
является символической ссылкой на /usr/local/Cellar/gdb/8.0/bin/gdb
(или любую другую версию, например 8.0.1
).
Вам нужно закодировать как ссылку, так и цель:
codesign -fs gdb-cert /usr/local/bin/gdb
codesign -fs gdb-cert "/usr/local/Cellar/gdb/8.0/bin/gdb"
Или, если у вас есть greadlink
(установлен через brew install coreutils
):
codesign -fs gdb-cert $(which gdb)
codesign -fs gdb-cert $(greadlink -f $(which gdb))
Ответ 5
Ничто из этого не сработало для меня, и мне пришлось идти в долгосрочной перспективе. Вот полный список шагов, которые я сделал, чтобы заставить его работать.
- Создайте сертификат для подписи GDB.
К сожалению, системный сертификат дал мне Unknown Error = -2,147,414,007
что очень полезно, поэтому мне пришлось пойти на обходной путь. KeyChain Assistant → Create certificate ->
Выберите login
, gdb-cert
, Code Signing
Скопируйте/переместите сертификат в системную связку ключей (введите пароль)
- Выберите сертификат (
gdb-cert
), нажмите Get info
→ Trust Always
- Отключить
startup-with-shell
Войдите в консоль: set startup-with-shell off
Запомните конфигурацию: echo "set startup-with-shell off" >> ~/. gdbinit
echo "set startup-with-shell off" >> ~/. gdbinit
- Включить Root User
Перейдите в System Preferences
→ Users & Groups
→ Unlock it
→ Login Options
→ Network Account Server
→ Join
→ Unlock it
→ Edit
(меню) → Enable Root User
-
sudo killall taskgated
- Наконец подписать GDB
codesign -fs gdb-cert "$(which gdb)"
- Отключить пользователя root (шаг 4)
- Перезагрузка, если все еще не работает. (если больше ничего не работает, скорее всего, это уже работает)
PS. Я заканчиваю тем, что использую lldb
потому что это просто работает (учебник)
Ответ 6
Интересно, имеют ли глобальные изменения в самом высоком голосовом ответе здесь какие-то непреднамеренные последствия.
Вместо того, чтобы включать старое соглашение Tiger, taskgated позволяет запускать подписанный код. Так что лучше всего просто получить подписанный сертификат для gdb, аналогичный здесь.
После этого я смог sudo
использовать gdb. Если вам нужно использовать gdb w/o sudo, то, возможно, эта ссылка поможет, хотя отказ от ответственности я еще не пробовал, так как использование sudo
теперь является решением ok.
Ответ 7
Это не может быть связано. Вы можете использовать lldb на macos вместо gdb. Вам не нужно это хлопот для установки GDB.
lldb (http://lldb.llvm.org) уже установлен по умолчанию в High Sierra
Ответ 8
Я обновился до gdb 8.3
и не смог заставить все работать.
Это помогло мне:
codesign --entitlements gdb.xml -fs gdb-cert /usr/local/bin/gdb
Где содержание gdb.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.cs.allow-jit</key>
<true/>
<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
<true/>
<key>com.apple.security.cs.allow-dyld-environment-variables</key>
<true/>
<key>com.apple.security.cs.disable-library-validation</key>
<true/>
<key>com.apple.security.cs.disable-executable-page-protection</key>
<true/>
<key>com.apple.security.cs.debugger</key>
<true/>
<key>com.apple.security.get-task-allow</key>
<true/>
</dict>
</plist>
Я нашел это решение здесь: https://timnash.co.uk/getting-gdb-to-semi-reliably-work-on-mojave-macos/
Примечание: без разрешения я смог запустить gdb
только с sudo
.
Ответ 9
Только что попробовал sudo gdb...
и это работает.
Ответ 10
GDB 8,3;
Моя проблема такая же, как у парня выше,
решено с помощью
codesign --entitlements gdb.xml -fs gdb-cert /usr/local/bin/gdb