Как получить "кодовое обозначение" 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?

Ответ 1

Казалось бы, вам нужно подписать исполняемый файл. См. Эти ссылки для получения дополнительной информации. Вы должны уйти с самоподписыванием, если не планируете перераспределять эту версию 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 в терминале.

Ответ 2

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" в качестве примера)
    • Установите "Тип идентификации" в "Самоподписанный корень"
    • Установите "Тип сертификата" на "Подписание кода"
    • Активируйте опцию "Разрешить переопределение по умолчанию"
  • Нажмите несколько раз на "Продолжить", пока не появится экран "Укажите местоположение для сертификата", затем установите для "Связки ключей" значение "Система".
  • Нажимайте "Продолжить", пока сертификат не будет создан.
  • Наконец, в представлении дважды щелкните новый сертификат и установите для параметра "При использовании этого сертификата" значение "Всегда доверять".
  • Закройте приложение 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 (Certificate Assistant - Неизвестная ошибка) https://apple.stackexchange.com/questions/309017/unknown-error-2-147-414-007-on-creating-certificate-with-certificate-assist

Ответ 3

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

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

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

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

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

  • Использовать gdb

Ответ 4

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

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

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

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

Ответ 5

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

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

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

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

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

Ответ 6

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

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

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

Я установил, что:

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

Затем я добавил сертификат к доверенным сертификатам подписи, после того как я перетащил сертификат из связки ключей на мой рабочий стол, который создал файл ~/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-trusted-cert" (- p codeSign) и команды "security find-identity" (-p кодовое обозначение). Затем я продолжил подписывать gdb, и я также всегда получал:

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

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

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

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

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

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

Тогда я дал мне рабочий gdb, и он должен предоставить вам подписанное приложение.

Ответ 7

Если использование 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

Ответ 8

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