"Будь ласка, перевірте, чи gdb підписаний - див. Завдання (8)" - Як встановити gdb з підписаним кодом homebrew?


107

Я перебуваю під OSX 10.8.4 і встановив gdb 7.5.1 з домашньою мовою (мотивація отримати новий gdb з новими можливостями, такими як --with-python тощо ...)

Довга коротка історія, коли я запускаю налагодження в рамках проекту C ++ Eclipse, я отримую:

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

Я дотримувався різних пропозицій щодо підписання коду

Так я і зробив:

  1. Налаштуйте сертифікат
  2. Підпишіть gdb -> codeign -s gdb-cert / usr / local / bin / gdb

Під час повторного запуску налагодження в Eclipse я отримую таку ж помилку, як і вище "(будь ласка, перевірте, чи gdb є кодованим - див. Завдання (8))".

Якщо я поверну gdb до старшого gdb (у налаштуваннях gdb Eclipse) / usr / libexec / gdb / gdb-i386-apple-darwin, налагодження запускається так, як очікувалося.

Якісь рішення / підказки там?

Дякую

Пелле


Це не є "функцією безпеки" - іншими словами, ваша система налаштована приймати лише програмне забезпечення, яке офіційно підписано? Якщо так, сподіваємось, є спосіб відключити цю функцію ...
Матс Петерсон

добре, дякую за відгук - я розумію, що у вас є функція безпеки, але моя проблема полягає в тому, як зробити підписання ... є аналогічний пост stackoverflow.com/questions/12050257/gdb-fails-on-mountain-lion, який не став ' t вирішити це для мене ще
pellekrogholt

Відповіді:


136

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

Щоб створити сертифікат підпису коду, відкрийте додаток Keychain Access. Виберіть меню Access Keychain Access -> Assistant Certificate Assistant -> Створення сертифіката ...

Виберіть назву сертифіката (наприклад, gdb-cert), встановіть тип ідентичності на Root Self-Signed, встановіть тип сертифіката на підпис коду та виберіть Дозволити мені замінити значення за замовчуванням. Клацніть кілька разів на «Продовжити», поки ви не перейдете до екрана «Вказати місце для сертифіката», а потім встановіть Брелок для системи.

Двічі клацніть на сертифікаті, відкрийте розділ Довіра та встановіть для підпису коду значення Завжди довіряти. Вийдіть із програми Keychain Access.

Перезапустіть сервіс із завданнями та підпишіть двійковий файл.

$ sudo killall taskgated
$ codesign -fs gdb-cert "$(which gdb)"

джерело http://andresabino.com/2015/04/14/codesign-gdb-on-mac-os-x-yosemite-10-10-2/

На macOS 10.12 (Sierra) та пізніших версіях ви також повинні

Використовуйте gdb 7.12.1 або новішу версію. Крім того, не дозволяйте gdb використовувати оболонку для запуску програми налагодження. Ви можете використовувати таку команду для цього всередині gdb:

set startup-with-shell off

Ви також можете помістити цю останню команду у файл під назвою .gdbinit у вашому домашньому каталозі, і в цьому випадку вона буде застосовуватися автоматично кожного разу при запуску gdb

echo "set startup-with-shell off" >> ~/.gdbinit

ДЖЕРЕЛ: https://sourceware.org/gdb/wiki/BuildingOnDarwin


6
Працює як шарм. Дякую.
pceccon

14
Як зазначає ОП, це не зробило для нього хитрощів (і для мене ні).
PVitt

6
Здається, це не працює macOS Sierraз самопідписаними сертифікатами.
loretoparisi

sudo killall taskgated- це ключ до вирішення моєї проблеми
Karthikeyan Vaithilingam

Я точно виконував кроки, і це прекрасно працювало для мене на macOS Sierra.
jdg

29

Я змусив gdb працювати на OSX 10.9, не кодуючи цей спосіб (описано тут ):

  1. Встановіть gdb з макпортами. (можливо, ви можете пропустити це)

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

    змінити варіант рядки з -sдо -spв рядку 22, зібр 27.

  3. Перезавантажте комп'ютер.

  4. Використовуйте gdb. Якщо ви встановили його з портами mac, тоді ви повинні використовувати ggdbкоманду. Або зробили псевдонім у вашому файлі налаштування:

alias gdb='ggdb'

і тоді використовуйте команду 'gdb'.


Я деякий час працював над цим питанням і виявив, що інші способи корисної роботи не корисні. Це спрацювало як шарм.
Білл Дероз

@BillDeRose, те ж саме для мене.
klm123

@nimrodm, ти маєш на увазі "sudo gdb"? це має бути "ggdb" з
макпортами

1
Тьфу. Мені не хочеться бігати gdbяк sudo. Це здається зайвим ризиком безпеки.
Осінь,

2
Не збирається перезавантажувати комп’ютер. Повинна бути команда щось перезапустити!
Майкл

27

Я gdb 8.3пройшов модернізацію і не зміг зробити так, щоб справи працювали. Це допомогло мені:

codesign --entitlements gdb.xml -fs gdb-cert /usr/local/bin/gdb

Де вміст gdb.xml:

<?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.allow-jit</key>
    <true/>
    <key>com.apple.security.cs.allow-unsigned-executable-memory</key>
    <true/>
    <key>com.apple.security.cs.allow-dyld-environment-variables</key>
    <true/>
    <key>com.apple.security.cs.disable-library-validation</key>
    <true/>
    <key>com.apple.security.cs.disable-executable-page-protection</key>
    <true/>
    <key>com.apple.security.cs.debugger</key>
    <true/>
    <key>com.apple.security.get-task-allow</key>
    <true/>
</dict>
</plist>

Я знайшов це рішення тут: https://timnash.co.uk/getting-gdb-to-semi-reliably-work-on-mojave-macos/

Примітка: Без прав я міг бігати gdbтільки з sudo.


2
Що робити, якщо отримуєшerror: The specified item could not be found in the keychain.
Шрідхар Сарнобат

@SridharSarnobat Використовуйте конвеєр спочатку з цієї відповіді stackoverflow.com/a/32727069/339146
Панайотис

Помилка після спроби відповіді @maximser. Тоді це працює для мене. macOS 10.15.4, gdb 9.2, встановлений за допомогою варіння.
вечір

@SridharSarnobat: Ви повинні створити сертифікат першого stackoverflow.com/questions/35020236 / ...
Akansha

26

У мене виникло те саме питання з GDB. Я бігаю під Mac OS X 10.8.5ака гірським левом. Я використовую версію GDB 7.7.1.

Я склав свою тестову програму з наступною командою:

g++ -o gdb-sample.out -g gdb-sample.cpp    

Якщо я ввійшов у команду gdb sample.out, я отримаю те саме повідомлення про помилку:

"Unable to find Mach task port for process-id 46234: (os/kern) failure (0x5). (please check gdb is codesigned - see taskgated(8))"

Однак це повідомлення про помилку є червоною оселедцем.

Я знайшов рішення, яке працювало для мене, - просто викликати GDB за допомогою акта суперпользователя:

sudo gdb sample.out. 

Це добре працює для мене.

І з цього моменту я міг би запустити GDB example.out, не використовуючи sudo.

Сподіваюсь, це допомагає та працює для інших. RSVP, якщо цього немає.


1
Не впевнений, чому за це було проголосовано. Я керував командою як root (з sudo), і вона спрацювала.
iProgram

6

Ніщо з цього не працювало для мене, і мені довелося їхати з тривалим бігом. Ось повний перелік кроків, які я зробив, щоб його працювати.

  1. Створіть сертифікат для підписання gdb.

На жаль, системний сертифікат дав мені, Unknown Error = -2,147,414,007що дуже корисно, тому мені довелося піти з вирішенням проблеми. KeyChain Assistant -> Create certificate ->

Виберіть login, gdb-cert,Code Signing

Скопіюйте / перемістіть сертифікат у системний брелок (введіть пароль)

  1. Виберіть сертифікат ( gdb-cert) натисніть Get info->Trust Always
  2. Відключити startup-with-shell

Введіть у консоль: set startup-with-shell off

Запам’ятайте конфігурацію: echo "set startup-with-shell off" >> ~/. gdbinit

  1. Увімкнути кореневого користувача

Перейдіть до System Preferences-> Users & Groups-> Unlock it-> Login Options-> Network Account Server-> Join-> Unlock it-> Edit(меню) ->Enable Root User

  1. sudo killall taskgated
  2. Нарешті підпишіть gdb

codesign -fs gdb-cert "$(which gdb)"

  1. Вимкнути кореневого користувача (крок 4)
  2. Перезавантажте, якщо все ще не працює. (якщо нічого іншого не працює, швидше за все, це вже працює)

PS. Я закінчую використовувати, lldbтому що це просто працює ( підручник )


5

Для тих, хто використовує Sierra 10.12.6 (і вище) та Homebrew, /usr/local/bin/gdbє символічним посиланням на /usr/local/Cellar/gdb/8.0/bin/gdb(або будь-яку іншу версію, наприклад8.0.1 ).

Вам потрібно кодувати знак і посилання, і ціль:

codesign -fs gdb-cert /usr/local/bin/gdb
codesign -fs gdb-cert "/usr/local/Cellar/gdb/8.0/bin/gdb"

Або якщо у вас greadlink(встановлено через brew install coreutils):

codesign -fs gdb-cert $(which gdb)
codesign -fs gdb-cert $(greadlink -f $(which gdb))

1
ти спробував це на Високій Сьєррі? У мене не вийшло на O / S: 10.13.6
rustyMagnet

3

Цікаво, чи глобальна зміна найвищої відповіді тут має якісь ненавмисні наслідки.

Замість того, щоб увімкнути стару умову Тигра, цільова задача дозволяє запускати підписаний код. Тому може бути краще просто отримати підписаний сертифікат для gdb, подібний до відповіді тут .

Після цього я зміг sudoвикористовувати gdb. Якщо вам потрібно використовувати gdb без судо, можливо, це посилання допоможе, хоча, відмова, я ще не пробував цього, тому що використання sudoзараз нормальне рішення ".


3

Це може бути не пов’язано. Ви можете використовувати lldb на macos замість gdb. Вам не потрібно цього клопоту, щоб встановити gdb.

lldb ( http://lldb.llvm.org ) вже встановлено за замовчуванням у Високій Сьєррі


0

Я можу порекомендувати слідувати цій суті: https://gist.github.com/gravitylow/fb595186ce6068537a6e9da6d8b5b96d#file-codesign_gdb-md

З хитрістю для подолання: unknown error = -2,147,414,007під час створення сертифікату, описаного тут: https://apple.stackexchange.com/a/309123

Примітки:

Шлях для gdb, встановленого як homebrewпакунок, повинен бути чимось таким:/usr/local/Cellar/gdb/9.2/bin/gdb

І csrutil enable --without debugспричинить повідомлення про requesting unsupported configuration, як ось тут: https://totalfinder.binaryage.com/system-integrity-protection

Тест:

  sw_vers -productVersion
10.13.6

  gdb ./a.out
GNU gdb (GDB) 9.2
...
Thread 3 hit Breakpoint 1, main () at main.c:14
14          data_t d = {0};

-1

gdb 8,3;

Моя проблема така ж, як хлопець вище, вирішена

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