"пожалуйста, проверьте, что 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

Ничто из этого не сработало для меня, и мне пришлось идти в долгосрочной перспективе. Вот полный список шагов, которые я сделал, чтобы заставить его работать.

  1. Создайте сертификат для подписи GDB.

К сожалению, системный сертификат дал мне Unknown Error = -2,147,414,007 что очень полезно, поэтому мне пришлось пойти на обходной путь. KeyChain Assistant → Create certificate ->

Выберите login, gdb-cert, Code Signing

Скопируйте/переместите сертификат в системную связку ключей (введите пароль)

  1. Выберите сертификат (gdb-cert), нажмите Get infoTrust Always
  2. Отключить startup-with-shell

Войдите в консоль: set startup-with-shell off

Запомните конфигурацию: echo "set startup-with-shell off" >> ~/. gdbinit echo "set startup-with-shell off" >> ~/. gdbinit

  1. Включить Root User

Перейдите в System PreferencesUsers & GroupsUnlock itLogin OptionsNetwork Account ServerJoinUnlock itEdit (меню) → Enable Root User

  1. sudo killall taskgated
  2. Наконец подписать GDB

codesign -fs gdb-cert "$(which gdb)"

  1. Отключить пользователя root (шаг 4)
  2. Перезагрузка, если все еще не работает. (если больше ничего не работает, скорее всего, это уже работает)

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