gdb не вдається з помилкою "Не вдається знайти порт завдання Mach для id-процесу"


138

У моєму додатку працює нормально, але 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

Відповіді:


64

У версії Snow Leopard та пізніших версій Mac OS недостатньо для кодування дизайну gdbвиконуваного файлу.

Ви повинні дотримуватися цього посібника, щоб він працював: http://www.opensource.apple.com/source/lldb/lldb-69/docs/code-signing.txt

Посібник пояснює, як це зробити lldb, але процес точно такий же gdb.


12
Ці інструкції не робота для мене на OSX 10.9.2 з MacPorts, але це зробив: sourceware.org/gdb/wiki/BuildingOnDarwin
simpleuser

Це працює! Але чи можете ви пояснити, що sudo security add-trustробить лінія? Чи можна зараз видалити .cerфайл зі свого робочого столу?
Sreejith Ramakrishnan

9
codesign -s gdb_codesign `which gdb` допомагає після цього посібника
синтезатор

Або sudo codesign -s gdb_codesign `which gdb-apple` на macOS sierra.
sdive

3
Для останньої ОС посилання працювало
yuxuan

144

Це працює, коли я переходжу на sudo gdb executableFileName! :)


2
Дякую. Це підписання коду плюс було потрібно, щоб gdb працював. Я дав кореневий доступ до gdb (як описано тут stackoverflow.com/questions/10476154/… ), тому мені не довелося вводити sudo кожен раз. Edit - Знайдений найкращий підхід тут: stackoverflow.com/a/10441587/305149
Aneil Mallavarapu

14
Запустити його як корінь? Ти серйозно? Найгірше "рішення".
Еквідамоїд

7
@Equidamoid Чому б це було так погано запускати gdbяк root? Мені було просто цікаво, бо це просто налагоджувач.
ЦЕ ПОТРІБНИК ПОТРІБНО ДОПОМОГА

Що буде, якщо запустити його як корінь? Це написаний вами код, і я не розумію наслідків
COLD ICE

4
@COLDICE в цілому ви не хочете запускати процеси з ескалаційними привілеями (особливо ескальовані до вершини як root), оскільки в цілому їм не потрібен доступ для зміни речей у системі або відкритих портів нижче 1024 (більш високі порти можуть бути використовується несистемними / некористувальними користувачами). Навіть якщо ви "довіряєте" власному коду, це не означає, що ви не зробили помилку, яка його спричиняє, rm -rf /або щось подібне руйнівно, коли ви перезаписуєте деякі конфігурації / бінарні файли, на які покладається ваш комп'ютер для запуску та нормальної роботи.
shaunhusain

32

Вам потрібно створити сертифікат і підписати gdb:

  • Відкрийте додаток “Keychain Access” (/ Програми / Утиліти / Keychain Access.app)
  • Відкрити меню / Доступ до брелока / Помічник сертифіката / Створити сертифікат ...
  • Виберіть ім'я (gdb-cert у прикладі), встановіть "Тип ідентичності" на "Автоподписаний корінь", встановіть "Тип сертифіката" на "Підпис коду" та виберіть "Дозволити мені замінити значення за замовчуванням". Натисніть «Продовжити». Ви можете продовжити визначений 365 днів до 3650 днів.
  • Клацніть кілька разів на «Продовжити», поки ви не перейдете до екрана «Вкажіть місце для сертифіката», а потім встановіть «Брелок до системи».
  • Якщо ви не можете зберігати сертифікат у брелоку "Система", створіть його у брелоку "Логін" та експортуйте його. Потім можна імпортувати його в брелок «Система».
  • У брелоках виберіть "Система", і ви повинні знайти новий сертифікат. Використовуйте контекстне меню для сертифіката, виберіть "Отримати інформацію", відкрийте пункт "Довіра" та встановіть "Підпис коду" на "Завжди довіряти".
  • Ви повинні вийти з програми «Keychain Access», щоб скористатися сертифікатом та перезапустити службу «завдань», знищивши поточний запущений процес «із завданням». Можна також перезавантажити комп'ютер.
  • Нарешті ви можете підписати gdb:

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

    sudo ggdb ./myprog


4
Зауважте, що вбивство із завданням не перезапустило процес. необхідно: Суду /System/Library/LaunchDaemons/com.apple.taskgated.plist launchctl навантаження
Бен

Вищезазначене перезапустило завдання - але це все одно не спрацювало без перезавантаження на сієррі, на жаль.
Ніл Макгілл

16

Проблема полягає в тому, що ви не ввійшли в систему як користувач root (що ви не хочете). Вам потрібно створити сертифікат для gdb, щоб йому було дозволено доступ. Виконайте цей підручник, і вам слід добре пройти ...

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

Якщо все інше не вдається, просто використовуйте: sudo gdb executableFileName


4
Навчальний посібник тут попрацював найкраще. Просто довелося запустити codesign -s gdb-cert $(which gdb)Щоб підписати gdbдодаток.
cevaris

Щойно підтверджуючи те, хто намагається це зробити на OSX 10.12.5, вам потрібно виконати кроки, викладені у посиланні BuildingOnDarwin, та запустити gdb після переходу на root користувача.
AdjunctProfessorFalcon

7

Це посилання мало найясніший і детальний покроковий крок, щоб зникнути для мене цю помилку.

У моєму випадку я повинен був мати ключ як "Система", інакше він не працював (про що не кожна URL-адреса згадується).

Також вбивство taskgatedє життєздатною (і швидшою) альтернативою необхідності перезапустити.

Я також видалив MacPorts перед тим, як запустити цей процес і видалив поточний gdb за допомогою brew uninstall gdb.


Це працювало для мене. +1 для довідки, яка використовує brew.
тригоман

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. У меню відкрийте доступ Keychain> Assistant Certificate> Створити сертифікат
  3. Дайте ім’я (наприклад, gdbc)
    • Тип особи: Корінь, який підписується самостійно
    • Тип сертифіката: підпис коду
    • Перевірте: дозвольте мені змінити значення за замовчуванням
  4. Продовжуйте, поки це не запропонує вам: "вкажіть місце для ..."
  5. Встановіть розташування брелоків у системі
  6. Створіть сертифікат і закрийте помічника.
  7. Знайдіть сертифікат у системних брелоках, клацніть правою кнопкою миші та отримайте інформацію (або просто двічі клацніть його)
  8. Розгорніть довіру, встановіть підпис коду, щоб завжди довіряти
  9. Перезапустіть завдання, виконані в терміналі: killall
  10. Запустити codesign -fs gdbc /usr/local/bin/gdbв терміналі: тут запитується кореневий пароль

1

Ці інструкції працюють для OSX High Sierra і уникають запуску gdb як root (yuck!). Я нещодавно оновив з OSX 10.13.2 до 10.3.3. Я думаю, що це коли gdb 8.0.1 (встановлений w / homebrew) для мене почав виходити з ладу.

У мене були труднощі з інструкціями інших людей. Після різних вказівок все було безладно. Тому я почав свіжий. Я більш-менш дотримувався цих інструкцій .

Очистіть безлад:

  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. На першій сторінці інформації про сертифікати:
Serial Number : 1
Validity Period (days): 3650
  1. На другій сторінці інформації про сертифікати я залишив порожні всі поля, крім тих, які вже заповнені.

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

Key Size : 2048
Algorithm : RSA
  1. На сторінці розширення використання ключових значень я залишив перевірені параметри за замовчуванням.
[X] Include Key Usage Extension
[X] This extension is critical
Capabilities:
[X] Signature
  1. На сторінці розширення використання розширеного ключа я залишив встановлені параметри за замовчуванням.
[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 /. Немає проблем з реєстрацією, судо тощо.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.