gdb не работает с ошибкой «Не удалось найти порт задачи Mach для идентификатора процесса»


139

Мое приложение работает нормально, но GDB не может его отладить со следующей ошибкой

(gdb) run
Starting program: /path/to/app 
Unable to find Mach task port for process-id 83767: (os/kern) failure (0x5).

Я использую OS X Lion. Версия GDB

$ gdb --version
GNU gdb 6.3.50-20050815 (Apple version gdb-1752) (Sat Jan 28 03:02:46 UTC 2012)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "x86_64-apple-darwin".

Думаю, этот пост может помочь: stackoverflow.com/questions/10221448/… .
Codie CodeMonkey

Ответы:


66

В Snow Leopard и более поздних версиях Mac OS кодовой подписи gdbисполняемого файла недостаточно .

Вы должны следовать этому руководству, чтобы оно работало: http://www.opensource.apple.com/source/lldb/lldb-69/docs/code-signing.txt

В руководстве объясняется, как это сделать для lldb, но процесс точно такой же для gdb.


14
Эти инструкции не сработали для меня на OSX 10.9.2 с MacPorts, но это сработало
simpleuser

Оно работает! Но не могли бы вы объяснить, что sudo security add-trustделает линия? Могу я сейчас удалить .cerфайл со своего рабочего стола?
Сриджит Рамакришнан,

9
codesign -s gdb_codesign `which gdb` помогает после этого гайда
синтезатор

Или sudo codesign -s gdb_codesign `which gdb-apple` на macOS sierra.
sdive

3
Для последней ОС ссылка работала
yuxuan

146

Работает, когда меняю на sudo gdb executableFileName! :)


2
Спасибо. Этот плюс подписи кода требовался для работы GDB. Я дал gdb root-доступ (как описано здесь stackoverflow.com/questions/10476154/… ), поэтому мне не приходилось каждый раз вводить sudo. Изменить - нашел здесь лучший подход: stackoverflow.com/a/10441587/305149
Анейл Маллаварапу

14
Запускать как root? Ты серьезно? Худшее «решение».
Equidamoid 01

7
@Equidamoid Почему так плохо работать gdbс root? Мне было просто любопытно, потому что это всего лишь отладчик.
ЭТОМ ПОЛЬЗОВАТЕЛЮ НУЖНА ПОМОЩЬ

Что будет, если запустить его как root? Это код, который вы написали, и я не понимаю последствий
COLD ICE

4
@COLDICE, как правило, вы не хотите запускать процессы с расширенными привилегиями (особенно с расширенными привилегиями наверху как root), поскольку в целом им не нужен доступ для изменения вещей в системе или открытия портов ниже 1024 (более высокие порты могут быть используется не системными / некорневыми пользователями). Даже если вы «доверяете» своему собственному коду, это не означает, что вы не совершили ошибку, которая приводит к его возникновению, rm -rf /или что-то похожее разрушительное, когда вы перезаписываете некоторые конфигурации / двоичные файлы, которые ваш компьютер использует для запуска и нормальной работы.
Shaunhusain

32

Вам необходимо создать сертификат и подписать gdb:

  • Откройте приложение «Связка ключей» (/ Applications / Utilities / Keychain Access.app)
  • Откройте меню / Доступ к связке ключей / Помощник по сертификации / Создать сертификат ...
  • Выберите имя (в примере - gdb-cert), установите «Тип удостоверения» на «Самоподписанный корень», установите «Тип сертификата» на «Подписание кода» и выберите «Разрешить отменять значения по умолчанию». Щелкните «Продолжить». Возможно, вы захотите продлить предопределенный период с 365 дней до 3650 дней.
  • Нажмите несколько раз на «Продолжить», пока не дойдете до экрана «Укажите местоположение для сертификата», затем установите «Связка ключей в систему».
  • Если вы не можете сохранить сертификат в цепочке ключей «Система», создайте его в цепочке ключей «Логин», а затем экспортируйте его. Затем вы можете импортировать его в связку ключей «Система».
  • В брелках выберите «Система», и вы должны найти свой новый сертификат. Используйте контекстное меню для сертификата, выберите «Получить информацию», откройте элемент «Доверять» и установите для «Подписывание кода» значение «Всегда доверять».
  • Вы должны выйти из приложения «Связка ключей», чтобы использовать сертификат, и перезапустить службу «с привязкой к задачам», прервав текущий запущенный процесс с привязкой к задачам. В качестве альтернативы вы можете перезагрузить компьютер.
  • Наконец, вы можете подписать gdb:

    sudo codesign -s gdb-cert /usr/local/bin/ggdb

    sudo ggdb ./myprog


4
Обратите внимание, что убийство taskgated не перезапустило процесс. необходимо для: sudo launchctl load /System/Library/LaunchDaemons/com.apple.taskgated.plist
Бен

Вышеупомянутый перезапуск задачи был запущен, но, к сожалению, он все еще не работал без перезагрузки на sierra.
Нил МакГилл

16

Проблема в том, что вы не вошли в систему как пользователь root (что вам не нужно). Вам необходимо создать сертификат для доступа к GDB. Следуйте этому руководству, и все будет хорошо ...

http://sourceware.org/gdb/wiki/BuildingOnDarwin

Если ничего не помогает, просто используйте: sudo gdb executableFileName


4
Приведенный здесь учебник работал лучше всего. Просто нужно было запустить, codesign -s gdb-cert $(which gdb)чтобы подписать gdbприложение.
cevaris 08

Просто подтверждаю для всех, кто пробует это на OSX 10.12.5, вы должны выполнить шаги, описанные в ссылке BuildingOnDarwin, И запустить gdb после переключения на пользователя root.
AdjunctProfessorFalcon

7

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

В моем случае я должен был использовать ключ как «Системный» ключ, иначе он не работал (что не во всех URL-адресах).

Также убийство taskgated- жизнеспособная (и более быстрая) альтернатива перезапуску.

Я также удалил MacPorts перед тем, как начать этот процесс, и удалил текущий gdb, используя brew uninstall gdb.


Это сработало для меня. +1 для справки, которая использует brew.
trigoman

3

Мне нужна была эта команда, чтобы она работала на El Capitan:

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


2

В MacOSX lldb должен быть подписан кодом. Сборки отладки и выпуска настроены для подписи кода с использованием сертификата подписи кода с именем lldb_codesign.

If you don't have one yet you will need to:
- Launch /Applications/Utilities/Keychain Access.app

- In Keychain Access select the "login" keychain in the "Keychains"
  list in the upper left hand corner of the window.

- Select the following menu item:

    Keychain Access->Certificate Assistant->Create a Certificate...

- Set the following settings

    Name = lldb_codesign
    Identity Type = Self Signed Root
    Certificate Type = Code Signing

- Click Continue
- Click Continue
- Click Done
- Click on the "My Certificates"
- Double click on your new lldb_codesign certificate
- Turn down the "Trust" disclosure triangle

    Change:
        When using this certificate: Always Trust

- Enter your login password to confirm and make it trusted

The next steps are necessary on SnowLeopard, but are probably because of a bug
how Keychain Access makes certificates.

- Option-drag the new lldb_codesign certificate from the login keychain to
  the System keychain in the Keychains pane of the main Keychain Access window
  to make a copy of this certificate in the System keychain.  You'll have to
  authorize a few more times, set it to be "Always trusted" when asked.
- Switch to the System keychain, and drag the copy of lldb_codesign you just
  made there onto the desktop.
- Switch to Terminal, and run the following:

sudo security add-trust -d -r trustRoot -p basic -p codeSign -k /Library/Keychains/System.keychain ~/Desktop/lldb_codesign.cer

- Right click on the "lldb_codesign" certificate in the "System" keychain (NOT
  "login", but the one in "System"), and select "Delete" to delete it from
  the "System" keychain.
- Reboot
- Clean and rebuild lldb and you should be able to debug.

That should do it.

[Примечание: - lldb используется в Mac как gdb.]


2

Вот действительно полезное руководство, которое решило мою проблему (OSX 10.13.6).

  1. Открытый доступ к связке ключей
  2. В меню откройте Связка ключей> Помощник по сертификатам> Создать сертификат.
  3. Дайте ему имя (например, gdbc)
    • Тип удостоверения: самоподписанный корень
    • Тип сертификата: подпись кода
    • Проверить: позвольте мне изменить настройки по умолчанию
  4. Продолжайте до тех пор, пока вам не будет предложено: «укажите место для ...»
  5. Установите местоположение Связки ключей в Систему
  6. Создайте сертификат и закройте помощника.
  7. Найдите сертификат в системных связках ключей, щелкните его правой кнопкой мыши> получить информацию (или просто дважды щелкните его)
  8. Разверните «Доверие», установите для подписи кода значение «Всегда доверять».
  9. Перезапустите taskgated в терминале: killall taskgated
  10. Запустить codesign -fs gdbc /usr/local/bin/gdbв терминале: запрашивается пароль root

1

Эти инструкции работают для OSX High Sierra и избегают запуска gdb от имени пользователя root (фу!). Недавно я обновился с OSX 10.13.2 до 10.3.3. Думаю, именно тогда у меня начал выходить gdb 8.0.1 (установленный с домашним пивом).

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

Убери беспорядок:

  1. brew uninstall --force gdb # This deletes _all_ versions of gdb on the machine
  2. В Applications-> Utilities-> Keychain Accessя удалил все предыдущие сертификаты и ключи gdb (убедитесь, что вы знаете, что делаете здесь!). Неясно, необходимо ли это, но поскольку я ошибся, пытаясь создать эти сертификаты и ключи с помощью других инструкций, я все равно удалил их. У меня были ключи и сертификаты как в логине, так и в системе.

Теперь переустановите gdb.

  1. brew install gdb
  2. Внутри Keychain Accessперейдите в меню Keychain Access-> Certificate Assistant->Create a Certificate
  3. Установите флажок "Разрешить отмену значений по умолчанию" и установите
Name : gdb-cert
Identity Type: Self Signed Root
Certificate Type : Code Signing

[X] Let me override defaults
  1. На 1-й странице информации о сертификате:
Serial Number : 1
Validity Period (days): 3650
  1. На 2-й странице информации о сертификате я оставил все поля пустыми, кроме уже заполненных.

  2. На странице информации о паре ключей я оставил значения по умолчанию

Key Size : 2048
Algorithm : RSA
  1. На странице «Расширение использования ключа» я оставил флажком значения по умолчанию.
[X] Include Key Usage Extension
[X] This extension is critical
Capabilities:
[X] Signature
  1. На странице Extended Key Usage Extension я оставил флажком значения по умолчанию.
[X] Include Extended Key Usage Extension
[X] This extension is critical
Capabilities:
[X] Code Signing
  1. На странице расширения базовых ограничений ничего не проверялось (по умолчанию).

  2. На странице «Расширение альтернативного имени субъекта» я оставил установленный по умолчанию флажок и больше ничего не добавил.

[X] Include Subject Alternate Name Extension
  1. При указании местоположения для страницы сертификата я установил
Keychain: System
  1. Я нажал «Создать», и мне было предложено ввести пароль.

  2. Вернувшись в Keychain Accessприложение, я зашел Systemи щелкнул правой кнопкой мыши по gdb-certраскрывающемуся меню Trustи изменил все поля на Always Trust.

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

  4. Я сбежал от Терминала codesign -s gdb-cert /usr/local/bin/gdb. Я ввел свой пароль при появлении запроса.

  5. В Терминале я побежал echo "set startup-with-shell off" >> ~/.gdbinit

  6. Я запустил, gdb myprogramа затем startв консоли gdb. Здесь, я полагаю, меня попросили ввести пароль. После этого при всех последующих запусках мой пароль не запрашивался.


К сожалению, я сделал и ответ с наибольшим количеством голосов, и ваш ответ, но все еще вижу то же сообщение об ошибке. У меня macOS Catalina версии 10.15.4 и gdb 9.1.
Джей Салливан

@JaySullivan +1. У меня такая же проблема.
irsis

1

Это странный подход, но у меня он сработал (MacOs HighSierra 10.13.3). Установите CLion. Поставляется с gdb. После запуска gdb с помощью Terminal. Скопируйте программу gdb в ваш usr / local / bin /. Нет проблем с входом, sudo и т. Д.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.