Как получить «кодовое обозначение» gdb на OSX?
Поскольку мне нужен gdb
поддержкой Python, я установил другую версию через
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
?
- Как вы отлаживаете classический ASP?
- _DEBUG vs NDEBUG
- Как избежать доступа к изменяемой переменной из закрытия
- NUnit не запускает код Visual Studio 2010
- Как найти, где исключение было выбрано на C ++?
- Где узнать о VS отладчике «волшебные имена»
- Xcode: TEST против макросов препроцессора DEBUG
- Как фильтровать стек вызовов в представлении отладки Eclipse для Java
- Инструмент / метод анализа дампа streamа
- Текущие возможности трассировки программы в C #?
- Жасмин: обратный вызов Async не вызывался в течение таймаута, указанного jasmine.DEFAULT_TIMEOUT_INTERVAL
- Как обнаружить системную информацию типа os или типа устройства
- Создание точки останова в Xcode для непризнанного селектора
Казалось бы, вам нужно подписать исполняемый файл. См. Эти ссылки для получения дополнительной информации. Вы должны уйти с самоподпиской, если не планируете перераспределять эту версию gdb
.
Кроме того, вы можете отключить подписание кода в своей системе, хотя это представляет угрозу безопасности. Для этого попробуйте запустить 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 требуется сертификат. Следующая процедура объясняет, как ее создать:
- Запустите приложение Access Keychain (в / Приложения / Утилиты / Keychain Access.app)
- Выберите «Доступ к цепочке ключей -> Ассистент сертификата -> Создать сертификат …»
- Затем:
- Выберите имя для нового сертификата (в качестве примера в этой процедуре будет использоваться «gdb-cert»)
- Установите «Тип идентификации» на «Self Signed Root»
- Установите «Тип сертификата» на «Подпись кода»
- Активируйте опцию «Позвольте мне переопределить значения по умолчанию»
- Несколько раз нажмите «Продолжить», пока не появится экран «Укажите местоположение для сертификата», затем установите «Брелок для ключей» в «Система»,
- Нажмите «Продолжить», пока не будет создан сертификат.
- Наконец, в представлении дважды щелкните новый сертификат и установите «При использовании этого сертификата» в «Всегда доверять»,
- Выйдите из приложения Keychain Access и перезагрузите компьютер (это, к сожалению, требуется)
После создания сертификата отладчик может быть закодирован следующим образом. В терминале запустите следующую команду …
codesign -f -s "gdb-cert"
/bin/gdb … где «gdb-cert» следует заменить фактическим именем сертификата, выбранным выше, и его следует заменить на место, где вы установили GNAT.
Источник: https://gcc.gnu.org/onlinedocs/gcc-4.8.1/gnat_ugn_unw/Codesigning-the-Debugger.html
UPDATE: High-Sierra (помощник сертификата – неизвестная ошибка) https://apple.stackexchange.com/questions/309017/unknown-error-2-147-414-007-on-creating-certificate-with-certificate-assist
Я сделал gdb работу над OSX 10.9 без координирования таким образом (описано здесь ):
-
Установите gdb с помощью macports. (возможно, вы можете пропустить его)
-
sudo nano /System/Library/LaunchDaemons/com.apple.taskgated.plist
измените строку с
-s
на-sp
в строке 22, col 27. -
перезагрузите компьютер.
-
Использовать gdb
Это очень старая тема, но я добавляю ответ, потому что из многих доступных инструкций только один содержит только правильные шаги, чтобы сделать самостоятельную работу отладчика.
Вы должны создать самозаверяющий корневой сертификат, а затем подписать исполняемый файл gdb вместе с ним, но многие люди жаловались, что он не работает для них. И это не для меня, пока я не наткнулся на эту ссылку .
Ключевой момент, отсутствующий в других руководствах, заключается в том, что вам необходимо перезагрузить компьютер, чтобы изменения вступили в силу. Как только я это сделал, все работало по назначению.
Надеюсь, это поможет другим.
Проверьте доверие к сертификату, ему нужно доверять подписи кода (на 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 в цепочке ключей:
или в вышеприведенном выводе «идентификация безопасности для идентификации -p кодовое обозначение». Затем я пошел подписать, и я должен был дать ему правильный брелок:
codesign -s gdb-cert --keychain /Library/Keychains/System.keychain `which gdb`
Мне нужно было ввести пароль root, чтобы разрешить доступ к цепочке ключей.
Тогда я дал мне рабочий gdb, и он должен предоставить вам подписанное приложение.
Мне пришлось следовать этим указаниям, а не указаниям, предложенным другими.
Я все еще не уверен, что это был поступок killall taskgated
или процесс включения пользователя root killall taskgated
ситуацию.
Некоторые говорят, что перезагрузка необходима. Я считаю, что с приведенными выше инструкциями это может быть не так.
Я также внес изменения, рекомендованные @ klm123, так что это также может внести вклад.
Обратите внимание, что я использую homebrew, а не macports.
Если использование 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