«Пожалуйста, проверьте, что gdb имеет кодовую подпись - см. Taskgated (8)» - Как установить gdb с подписанным кодом homebrew?

107

Я использую osx 10.8.4 и установил gdb 7.5.1 с homebrew (мотивация получить новый gdb с новыми функциями, такими как --with-python и т. Д.)

Короче говоря, когда я запускаю отладку в проекте C ++ 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))

Я следил за различными предложениями по подписи кода

Так я и сделал:

  1. Настроить сертификат
  2. Подпишите gdb -> codeign -s gdb-cert / usr / local / bin / gdb

Когда я повторно запускаю отладку в Eclipse, я получаю ту же ошибку, что и выше «(проверьте, что gdb имеет кодовую подпись - см. Taskgated (8))».

Если я верну gdb к старому gdb (в настройках gdb Eclipse) / usr / libexec / gdb / gdb-i386-apple-darwin, отладка будет выполняться должным образом.

Есть какие-нибудь решения / подсказки?

Спасибо

Пелле

пеллекрогхольт
источник
Разве это не «функция безопасности» - другими словами, ваша система настроена на прием только программного обеспечения, которое было официально подписано? Если так, надеюсь, есть способ отключить эту функцию ...
Матс Петерссон,
хорошо, спасибо за ваш отзыв - я понимаю вашу точку зрения о функции безопасности, но моя проблема в том, как подписать ... есть аналогичное сообщение stackoverflow.com/questions/12050257/gdb-fails-on-mountain-lion, которое не ' пока не решил это для меня
pellekrogholt

Ответы:

137

Эта ошибка возникает из-за того, что OSX реализует политику доступа pid, которая требует цифровой подписи для двоичных файлов для доступа к pid других процессов. Чтобы разрешить GDB доступ к другим процессам, мы должны сначала подписать двоичный код. Эта подпись зависит от конкретного сертификата, который пользователь должен создать и зарегистрировать в системе.

Чтобы создать сертификат подписи кода, откройте приложение Связка ключей. Выберите меню «Связка ключей» -> «Помощник по сертификации» -> «Создать сертификат…»

Выберите имя для сертификата (например, gdb-cert), установите для параметра «Тип удостоверения» значение «Самоподписанный корень», для параметра «Тип сертификата» выберите «Подписание кода» и выберите «Разрешить отмену значений по умолчанию». Нажмите несколько раз на «Продолжить», пока не дойдете до экрана «Укажите расположение для сертификата», затем установите «Связка ключей» на «Система».

Дважды щелкните сертификат, откройте раздел «Доверие» и установите для параметра «Подписывание кода» значение «Всегда доверять». Закройте приложение Keychain Access.

Перезапустите службу Taskgated и подпишите двоичный файл.

$ 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

максимсер
источник
6
Работает как шарм. Спасибо.
pceccon
14
Как указал ОП, это не помогло ему (и мне тоже).
PVitt
6
Похоже, это не работает macOS Sierraс самоподписанными сертификатами.
loretoparisi
sudo killall taskgated- ключ к решению моей проблемы
Картикеян Вайтилингам
Я точно выполнил все шаги, и у меня это прекрасно сработало на macOS Sierra.
jdg
29

Я заставил gdb работать на OSX 10.9 без кодирования таким способом (описанным здесь ):

  1. Установите gdb с помощью macports. (может быть, вы можете пропустить это)

  2. sudo nano /System/Library/LaunchDaemons/com.apple.taskgated.plist

    изменить вариант строки из -sк -spв строке 22, собр 27.

  3. Перезагрузите компьютер.

  4. Используйте gdb. Если вы установили его с портами Mac, вы должны использовать ggdbкоманду. Или сделал псевдоним в вашем файле конфигурации:

alias gdb='ggdb'

и затем используйте команду 'gdb'.

klm123
источник
Я столкнулся с этой проблемой некоторое время и нашел другие советы бесполезными. Это сработало как шарм.
Билл ДеРоуз,
@BillDeRose, у меня то же самое.
klm123
@nimrodm, ты имеешь ввиду "sudo gdb"? это должно быть "ggdb" с macports
klm123
1
Тьфу. Я не хочу , чтобы бежать , gdbкак sudo. Это похоже на ненужную угрозу безопасности.
Autumnsault
2
Не собираюсь перезагружать компьютер. Должна быть команда, чтобы что-то перезапустить!
Майкл
27

Я обновился до 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.

Джонни Тандерман
источник
2
Что вы будете делать, если получитеerror: The specified item could not be found in the keychain.
Шридхар Сарнобат
@SridharSarnobat Используйте конвейер первым в этом ответе stackoverflow.com/a/32727069/339146
Панайотис
Ошибка после попытки ответа @maximser. Тогда это работает для меня. macOS 10.15.4, gdb 9.2, установленный через brew.
Weaming
@SridharSarnobat: сначала вам нужно создать сертификат stackoverflow.com/questions/35020236/…
Аканша
26

У меня была такая же проблема с GDB. Я бегаю под Mac OS X 10.8.5именем Mountain Lion. Я использую версию 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 с помощью суперпользователя acct:

sudo gdb sample.out. 

Мне это подходит.

И с этого момента я мог запускать GDB example.out без использования sudo.

Надеюсь, это поможет и сработает для других. RSVP, если это не так.

mickster99
источник
1
Не уверен, почему это было отклонено. Я запустил команду как root (с помощью sudo), и она сработала.
iProgram
6

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

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

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

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

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

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

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

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

  1. Включить корневого пользователя

Перейдите в System Preferences-> Users & Groups-> Unlock it-> Login Options-> Network Account Server-> Join-> Unlock it-> Edit(меню) ->Enable Root User

  1. sudo killall taskgated
  2. Наконец подпишите gdb

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

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

PS. Я использую, lldbпотому что он просто работает ( учебник )

Тарас Мацык
источник
5

Для всех, кто использует 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))
Ларри Сонг
источник
1
вы пробовали это на High Sierra? У меня не сработало на O / S: 10.13.6
rustyMagnet 01
3

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

Вместо того, чтобы использовать старое соглашение Tiger, Taskgated разрешает запуск подписанного кода. Так что может быть лучше просто получить подписанный сертификат для gdb, аналогичный ответу здесь .

После этого я смог sudoиспользовать gdb. Если вам нужно использовать gdb без sudo, то, возможно, эта ссылка поможет, хотя, отказ от ответственности, я еще не пробовал, потому что использование sudo- это нормальное решение на данный момент.

JnBrymn
источник
3

Это не может быть связано. Вы можете использовать lldb в macos вместо gdb. Вам не нужны эти хлопоты для установки gdb.

lldb ( http://lldb.llvm.org ) уже установлен по умолчанию в High Sierra

Кайтуо Ли
источник
0

Я могу порекомендовать следовать этой сути: https://gist.github.com/gravitylow/fb595186ce6068537a6e9da6d8b5b96d#file-codesign_gdb-md

С хитростью, которую нужно преодолеть: unknown error = -2,147,414,007во время создания сертификата, описанного здесь: https://apple.stackexchange.com/a/309123

Ноты:

Путь для gdb, установленного как homebrewпакет, должен быть примерно таким:/usr/local/Cellar/gdb/9.2/bin/gdb

И csrutil enable --without debugвызовет сообщение requesting unsupported configuration, как здесь: https://totalfinder.binaryage.com/system-integrity-protection

Тест:

  sw_vers -productVersion
10.13.6

  gdb ./a.out
GNU gdb (GDB) 9.2
...
Thread 3 hit Breakpoint 1, main () at main.c:14
14          data_t d = {0};
Юрий Василенко
источник
-1

gdb 8.3;

Моя проблема такая же, как у парня выше, решена

codesign --entitlements gdb.xml -fs gdb-cert /usr/local/bin/gdb
CJ
источник