Как получить gdb с кодовой подписью на OSX?

Потому что мне нужен Python с поддержкой gdbЯ установил другую версию через

brew tap homebrew/dupes
brew install gdb

Я хочу использовать это gdb с Eclipse CDT, где я ввел путь к бинарному файлу в настройках отладки. Однако запуск программы для отладки завершается неудачно со следующим сообщением:

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 39847: (os/kern) failure (0x5).\n (please check gdb is codesigned - see taskgated(8))
Unable to find Mach task port for process-id 39847: (os/kern) failure (0x5).\n (please check gdb is codesigned - see taskgated(8))

Что означает "кодовое обозначение" в этом контексте? Как я могу получить это gdbБег?

10 ответов

Решение

Казалось бы, вам нужно подписать исполняемый файл. Смотрите эти ссылки для получения дополнительной информации. Вы должны иметь возможность избежать подписи, если не планируете распространять эту версию gdb,

https://developer.apple.com/library/mac/#documentation/Security/Conceptual/CodeSigningGuide/Introduction/Introduction.html

https://developer.apple.com/library/mac/#documentation/Darwin/Reference/Manpages/man1/codesign.1.html

Кроме того, вы можете отключить подпись кода в вашей системе, хотя это представляет угрозу безопасности. Для этого попробуйте запустить sudo spctl --master-disable в Терминале.

I.1 Совместная разработка отладчика

Ядро Дарвина требует, чтобы отладчик имел специальные разрешения, прежде чем ему будет позволено управлять другими процессами. Эти разрешения предоставляются путем кодирования подписи исполняемого файла GDB. Без этих разрешений отладчик будет сообщать об ошибках, таких как:

Starting program: /x/y/foo
Unable to find Mach task port for process-id 28885: (os/kern) failure (0x5).
 (please check gdb is codesigned - see taskgated(8))

Codesigning требует сертификата. Следующая процедура объясняет, как ее создать:

  • Запустите приложение Keychain Access (в /Applications/Utilities/Keychain Access.app)
  • Выберите Доступ к цепочке для ключей -> Ассистент сертификации -> Создать сертификат... меню
  • Затем:
    • Выберите имя для нового сертификата (эта процедура будет использовать "gdb-cert" в качестве примера)
    • Установите для "Identity Type" значение "Self Signed Root"
    • Установите "Тип сертификата" на "Подписание кода"
    • Активируйте опцию "Разрешить переопределение по умолчанию"
  • Нажмите несколько раз на "Продолжить", пока не появится экран "Укажите местоположение для сертификата", затем установите для "Связки ключей" значение "Система".
  • Нажимайте "Продолжить", пока сертификат не будет создан.
  • Наконец, в представлении дважды щелкните новый сертификат и установите для параметра "При использовании этого сертификата" значение "Всегда доверять".
  • Закройте приложение Keychain Access и перезагрузите компьютер (это, к сожалению, необходимо)

После того, как сертификат был создан, отладчик может иметь кодовое обозначение следующим образом. В терминале выполните следующую команду...

codesign -f -s  "gdb-cert"  <gnat_install_prefix>/bin/gdb

... где "gdb-cert" должен быть заменен фактическим именем сертификата, выбранным выше, и должен быть заменен местом, где вы установили GNAT.

источник: https://gcc.gnu.org/onlinedocs/gcc-4.8.1/gnat_ugn_unw/Codesigning-the-Debugger.html

ОБНОВЛЕНИЕ: High-Sierra (помощник по сертификатам - неизвестная ошибка) https://apple.stackexchange.com/questions/309017/unknown-error-2-147-414-007-on-creating-certificate-with-certificate-assist

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

  1. Установите GDB с MacPort. (может быть, вы можете пропустить это)

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

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

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

  4. Используйте GDB

Проверьте доверие к сертификату, оно должно быть доверенным для подписи кода (на yosemite, который является третьим последним в разделе доверия в представлении сертификата в доступе цепочки для ключей).

Сначала сертификат не был известен кодовой подписью к цепочке для ключей, потому что отсутствовала цель Расширения "Подписывание кода", вы можете найти это, если вы посмотрите на цепочку для ключей и дважды щелкните по сертификату:

введите описание изображения здесь

Я исправил это:

введите описание изображения здесь

Затем я добавил сертификат в доверенные сертификаты подписи, после того как перетащил сертификат из цепочки для ключей на свой рабочий стол, что создало ~/Desktop/gdb-cert.cer:

$ sudo security add-trusted-cert -d -r trustRoot -p codeSign -k /Library/Keychains/System.keychain ~/Desktop/gdb-cert.cer

Это было немного сложно, потому что меня вводили в заблуждение некоторые посты в интернете, и я не смотрел справочную страницу. Некоторые говорили, что вы должны использовать add-trust ( https://llvm.org/svn/llvm-project/lldb/trunk/docs/code-signing.txt). Страшным было то, что команда преуспела, но не сделала то, что "должна" (ну, это была неправильная команда, но она должна была сказать мне, что она была неправильной).

После этого я нашел новый сертификат в доверенных сертификатах, например, так:

$ security find-identity -p codesigning

Policy: Code Signing
  Matching identities
      1) E7419032D4..... "Mac Developer: FirstName LastName (K2Q869SWUE)"    (CSSMERR_TP_CERT_EXPIRED)
      2) ACD43B6... "gdb-cert"
  2 identities found

  Valid identities only
      1) ACD43... "gdb-cert"
  1 valid identities found

В моем случае срок действия сертификата Apple истек, но тот, который я использовал для подписи gdb, не был (ну, я просто создал его сам). Также имейте в виду, что политика называется по-разному для "security add-trust-cert"(-p codeSign) и команды "security find-identity" (-p codeigning). Затем я продолжил подписывать GDB, и я также всегда получал:

$ codesign --sign gdb-cert.cer --keychain ~/Library/Keychains/login.keychain `which gdb`
  gdb-cert.cer: no identity found

потому что у меня сложилось впечатление, что мне нужно было указать имя файла сертификата для параметра --sign, но на самом деле это был CN сертификата, который я должен был предоставить и должен быть в доверенном хранилище. Вы можете найти CN здесь, дважды щелкнув по сертификату в цепочке для ключей:

введите описание изображения здесь

или в приведенном выше выводе "security find-identity -p codesigning". Затем я продолжил подписывать, и я должен был дать ему правильный брелок:

 codesign -s gdb-cert --keychain /Library/Keychains/System.keychain `which gdb` 

Мне пришлось ввести пароль root, чтобы разрешить доступ к цепочке для ключей.

Это тогда дало мне рабочий GDB, и это должно дать вам подписанное приложение.

Это более старый вопрос, но ни одно из решений, похоже, у меня не сработало (я использовал Mojave). Преобразование в lldb - это не решение вопроса - это просто обходной путь.

Попробовав несколько решений, я нашел работающее здесь: https://gist.github.com/gravitylow/fb595186ce6068537a6e9da6d8b5b96d

Что ссылается на этот сайт: https://sourceware.org/gdb/wiki/PermissionsDarwin

Решение включает в себя немного измененную версию подписи кода. По сути, основное отличие заключается в том, что при подписании сертификата XML-файл прав должен передаваться при кодовой подписи. Ниже я скопировал / вставил содержимое веб-сайта с исходным кодом для всех этапов от начала до конца.

1.1. Создайте сертификат в системной связке ключей

Запустите приложение Keychain Access (/Applications/Utilities/Keychain Access.app)

Откройте пункт меню / Связка ключей / Помощник по сертификации / Создать сертификат...

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

Если вы не можете сохранить сертификат в системной цепочке ключей: вместо этого создайте его в цепочке ключей входа, а затем экспортируйте его. Затем вы можете импортировать его в системную связку ключей.

Наконец, выйдите из приложения Keychain Access, чтобы обновить хранилище сертификатов.

Управление: в терминальном типе

security find-certificate -c gdb-cert

Это должно отобразить некоторые сведения о вашем новом сертификате, например

цепочка для ключей: "/Library/Keychains/System.keychain" версия: 256 класс: 0x80001000 атрибуты: "alis"="gdb-cert" [...]

Убедитесь, что связка ключей: это системная связка ключей, как показано.

Also, make sure that your certificate is not expired yet:

security find-certificate -p -c gdb-cert | openssl x509 -checkend 0

If you want to inspect the entire X509 data structure, you can type

security find-certificate -p -c gdb-cert |openssl x509 -noout -text

1.2. Trust the certificate for code signing

Start Keychain Access again. Using the contextual menu for the certificate, select Get Info, open the Trust item, and set Code Signing to Always Trust.

Finally, quit the Keychain Access application once more to refresh the certificate store.

Control: in the terminal type

security dump-trust-settings -d

This should show the gdb-cert certificate (perhaps among others) and its trust settings, including Code Signing.

1.3. Sign and entitle the gdb binary

(Mac OS X 10.14 and later) Create a gdb-entitlement.xml file containing the following:

<?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.debugger</key>
    <true/>
</dict>
</plist>
</pre>

If the certificate you generated in the previous section is known as gdb-cert, use:

codesign --entitlements gdb-entitlement.xml -fs gdb-cert $(which gdb)

or before Mojave (10.14), just

codesign -fs gdb-cert $(which gdb)

Возможно, вам придется добавить к этой команде sudo, если двоичный файл gdb находится в месте, недоступном для записи обычными пользователями.

Если вы планируете часто собирать gdb, этот шаг можно автоматизировать, передав --enable-codeign=gdb-cert (опять же, предполагая, что gdb-cert - это имя сертификата) для настройки.

Управление: в терминальном типе

codesign -vv $(which gdb)

А начиная с версии 10.14 (Мохаве) также проверьте права:

codesign -d --entitlements - $(which gdb)

1.4. Обновите сертификаты системы и данные для подписи кода

Самый надежный способ - перезагрузить систему.

Менее инвазивный способ - перезапустить службу, управляемую задачами, путем остановки текущего запущенного процесса (в любой момент в процессе, но не позднее, чем перед повторной попыткой запустить gdb):

sudo killall taskgated

Тем не менее, иногда служба Taskgated не перезапускается успешно после ее завершения, поэтому убедитесь, что она активна после этого шага, проверив, например, ps $(pgrep -f taskgated). Или просто перезагрузите систему, как указано выше.

При использовании gdb это не сложное требование, вы также можете использовать lldb как альтернатива. Он уже есть в вашей системе и не требует подписи кода:

$ lldb stddev_bugged
(lldb) target create "stddev_bugged"
Current executable set to 'stddev_bugged' (x86_64).
(lldb) b mean_and_var
Breakpoint 1: where = stddev_bugged`mean_and_var + 17 at stddev_bugged.c:17, address = 0x0000000100000b11
(lldb) r
Process 1621 launched: '/Users/richardschneeman/Documents/projects/21stCentury/02/example-00/stddev_bugged' (x86_64)
Process 1621 stopped
* thread #1: tid = 0xc777, 0x0000000100000b11 stddev_bugged`mean_and_var(data=0x00007fff5fbff590) + 17 at stddev_bugged.c:17, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
    frame #0: 0x0000000100000b11 stddev_bugged`mean_and_var(data=0x00007fff5fbff590) + 17 at stddev_bugged.c:17
   14   typedef struct meanvar {double mean, var;} meanvar;
   15
   16   meanvar mean_and_var(const double *data){
-> 17       long double avg = 0,
   18             avg2 = 0;
   19       long double ratio;
   20       size_t count= 0;
(lldb)

Вот таблица преобразования gdb в lldb команды http://lldb.llvm.org/lldb-gdb.html

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

Вы должны создать самозаверяющий корневой сертификат и затем подписать с ним исполняемый файл gdb, но многие люди жаловались, что он не работает для них. Ни один не сделал это для меня, пока я не наткнулся на эту ссылку.

Ключевой момент, отсутствующий в других руководствах, заключается в том, что вам необходимо перезагрузить компьютер, чтобы изменения вступили в силу. Как только я это сделал, все заработало как задумано.

Надеюсь, это поможет другим.

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

Я до сих пор не уверен, что это был акт killall taskgated или процесс включения пользователя root, который сделал разницу.

Некоторые говорят, что перезагрузка необходима. Я считаю, что с приведенными выше инструкциями, это может быть не так.

Я также внес изменения, рекомендованные @klm123, так что это также может помочь.

Обратите внимание, что я использую homebrew, а не macports.

Я знаю, что это не прямой ответ на вопрос, но мне хотелось бы, чтобы кто-нибудь упомянул об этом до того, как я приложил усилия для того, чтобы GDB заработал.

Вы можете создавать и отлаживать код C++ с помощью бесплатной IDE Apple под названием Xcode. (Xcode похож на «Visual Studio» или «Android Studio».). Я уже был пользователем Xcode, но понятия не имел, что он работает с C++, потому что эта опция довольно хорошо скрыта. Это видео на YouTube проведет вас через это:

https://www.youtube.com/watch?v=-H_EyIqBNDA

Я выполнил инструкции с кодовой подписью, но GDB все равно выдаст мне ту же ошибку. Оказалось, что это работает, когда gdb запускается от имени root (sudo gdb). Я использую Sierra osx.

Другие вопросы по тегам