„Proszę sprawdzić, czy gdb ma podpisany kod - patrz taskgated (8)” - Jak zainstalować gdb z podpisanym kodem homebrew?

107

Jestem pod OSX 10.8.4 i zainstalowałem gdb 7.5.1 z homebrew (motywacja zdobądź nowy gdb z nowymi funkcjami, takimi jak --with-python itp ...)

Krótko mówiąc, kiedy uruchamiam debugowanie w projekcie C ++ Eclipse, otrzymuję:

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))

Postępowałem zgodnie z różnymi sugestiami dotyczącymi podpisywania kodu

Więc zrobiłem:

  1. Skonfiguruj certyfikat
  2. Podpisz gdb -> codeign -s gdb-cert / usr / local / bin / gdb

Kiedy ponownie uruchamiam debugowanie w Eclipse, pojawia się ten sam błąd, co powyżej „(sprawdź, czy gdb jest oznaczony kodem - patrz taskgated (8))”.

Jeśli ustawię gdb z powrotem na starszą wersję gdb (w preferencjach gdb Eclipse) / usr / libexec / gdb / gdb-i386-apple-darwin, debugowanie przebiega zgodnie z oczekiwaniami.

Jakieś rozwiązania / wskazówki?

Dzięki

Pelle

pellekrogholt
źródło
Czy to nie jest „funkcja bezpieczeństwa” - innymi słowy, Twój system jest skonfigurowany tak, aby akceptować tylko oprogramowanie, które zostało oficjalnie podpisane? Jeśli tak, miejmy nadzieję, że istnieje sposób na wyłączenie tej funkcji ...
Mats Petersson,
ok, dziękuję za twoją opinię - rozumiem twój punkt dotyczący funkcji bezpieczeństwa, ale mój problem polega na tym, jak wykonać podpisanie ... jest podobny post stackoverflow.com/questions/12050257/gdb-fails-on-mountain-lion, który nie zrobił nie rozwiąż go jeszcze dla mnie
pellekrogholt

Odpowiedzi:

137

Ten błąd występuje, ponieważ OSX implementuje politykę dostępu pid, która wymaga podpisu cyfrowego dla plików binarnych, aby uzyskać dostęp do innych identyfikatorów procesów. Aby umożliwić gdb dostęp do innych procesów, musimy najpierw podpisać kod binarny. Podpis ten zależy od konkretnego certyfikatu, który użytkownik musi utworzyć i zarejestrować w systemie.

Aby utworzyć certyfikat podpisujący kod, otwórz aplikację Dostęp do pęku kluczy. Wybierz menu Dostęp do pęku kluczy -> Asystent certyfikatu -> Utwórz certyfikat…

Wybierz nazwę certyfikatu (np. Gdb-cert), ustaw Typ tożsamości na Katalog główny z podpisem własnym, ustaw Typ certyfikatu na Podpisywanie kodu i wybierz opcję Pozwól mi zastąpić wartości domyślne. Kliknij kilkakrotnie przycisk Kontynuuj, aż dojdziesz do ekranu Określ lokalizację dla certyfikatu, a następnie ustaw Pęk kluczy na System.

Kliknij dwukrotnie certyfikat, otwórz sekcję Zaufanie i ustaw Podpisywanie kodu na Zawsze ufaj. Zamknij aplikację Dostęp do pęku kluczy.

Zrestartuj usługę wyznaczoną na zadania i podpisz plik binarny.

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

źródło http://andresabino.com/2015/04/14/codesign-gdb-on-mac-os-x-yosemite-10-10-2/

W systemie macOS 10.12 (Sierra) i nowszych musisz także

Użyj gdb w wersji 7.12.1 lub nowszej Dodatkowo uniemożliwiaj gdb używanie powłoki do uruchamiania programu, który ma być debugowany. Możesz użyć następującego polecenia do tego wewnątrz gdb:

set startup-with-shell off

Możesz również umieścić to ostatnie polecenie w pliku o nazwie .gdbinit w swoim katalogu domowym, w którym to przypadku zostanie ono zastosowane automatycznie za każdym razem, gdy uruchomisz gdb

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

ŹRÓDŁO: https://sourceware.org/gdb/wiki/BuildingOnDarwin

maximser
źródło
6
Działa jak marzenie. Dziękuję Ci.
pceccon
14
Jak zauważył OP, nie pomogło mu to (i mnie też).
PVitt
6
Wygląda na to, że nie działa macOS Sierraz certyfikatami z podpisem własnym.
loretoparisi
sudo killall taskgatedjest kluczem do rozwiązania mojego problemu
Karthikeyan Vaithilingam
Dokładnie postępowałem zgodnie z instrukcjami, a to zadziałało pięknie dla mnie na macOS Sierra.
jdg
29

Zrobiłem gdb na OSX 10.9 bez kodowania w ten sposób (opisane tutaj ):

  1. Zainstaluj gdb z macports. (może możesz to pominąć)

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

    zmień łańcuch opcji z -sna -spw linii 22, kol 27.

  3. Zrestartuj komputer.

  4. Użyj gdb. Jeśli zainstalowałeś go z portami mac, musisz użyć ggdbpolecenia. Lub utwórz alias w swoim pliku konfiguracyjnym:

alias gdb='ggdb'

i użyj polecenia „gdb”.

klm123
źródło
Od jakiegoś czasu natknąłem się na ten problem i uznałem, że inne porady nie są pomocne. To zadziałało jak urok.
Bill DeRose,
@BillDeRose, to samo dla mnie.
klm123
@nimrodm, masz na myśli „sudo gdb”? powinno to być „ggdb” z macportami
klm123
1
Fuj. Nie chcę biegać gdbjako sudo. Wydaje się, że jest to niepotrzebne zagrożenie bezpieczeństwa.
Autumnsault
2
Nie zamierzam ponownie uruchamiać komputera. Musi istnieć polecenie ponownego uruchomienia czegoś!
Michael
27

Zaktualizowałem do gdb 8.3i nie byłem w stanie sprawić, by wszystko działało. Pomogło mi to:

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

Gdzie treść gdb.xmlto:

<?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>

Znalazłem to rozwiązanie tutaj: https://timnash.co.uk/getting-gdb-to-semi-reliably-work-on-mojave-macos/

Uwaga: bez uprawnienia mogłem biegać gdbtylko z sudo.

Johnny Thunderman
źródło
2
Co zrobisz, jeśli dostanieszerror: The specified item could not be found in the keychain.
Sridhar Sarnobat
@SridharSarnobat Użyj najpierw potoku tej odpowiedzi stackoverflow.com/a/32727069/339146
Panayotis
Niepowodzenie po wypróbowaniu odpowiedzi @maximser. Wtedy to działa dla mnie. macOS 10.15.4, gdb 9.2 zainstalowany przez brew.
weaming
@SridharSarnobat: Najpierw musisz utworzyć certyfikat stackoverflow.com/questions/35020236/…
Akansha
26

Doświadczyłem tego samego problemu z GDB. Biegnę pod Mac OS X 10.8.5aką Mountain Lion. Używam wersji GDB 7.7.1.

Skompilowałem swój program testowy za pomocą następującego polecenia:

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

Jeśli wpisałem polecenie gdb sample.out, otrzymuję ten sam tajemniczy komunikat o błędzie:

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

Ten komunikat o błędzie to jednak czerwony śledź.

Rozwiązaniem, które znalazłem, było po prostu wywołanie GDB przy użyciu konta superużytkownika:

sudo gdb sample.out. 

Dla mnie to działa dobrze.

I od tego momentu mogłem uruchomić GDB example.out bez używania sudo.

Mam nadzieję, że to pomaga i działa dla innych. RSVP, jeśli nie.

mickster99
źródło
1
Nie wiem, dlaczego głosowano w dół. Uruchomiłem polecenie jako root (z sudo) i zadziałało.
iProgram
6

Nic z tego nie działało dla mnie i musiałem iść na dłuższą metę. Oto pełna lista kroków, które wykonałem, aby to działało.

  1. Utwórz certyfikat, aby podpisać GDB.

Niestety, certyfikat systemowy dał mi Unknown Error = -2,147,414,007bardzo pomocne rozwiązanie, więc musiałem obejść ten problem. KeyChain Assistant -> Create certificate ->

Pick login, gdb-cert,Code Signing

Skopiuj / przenieś certyfikat do pęku kluczy systemu (wprowadź hasło)

  1. Wybierz certyfikat ( gdb-cert) kliknij Get info->Trust Always
  2. Wyłączyć startup-with-shell

Wprowadź w konsoli: set startup-with-shell off

Zapamiętaj konfigurację: echo "set startup-with-shell off" >> ~/. gdbinit

  1. Włącz użytkownika root

Przejdź do System Preferences-> Users & Groups-> Unlock it-> Login Options-> Network Account Server-> Join-> Unlock it-> Edit(menu) ->Enable Root User

  1. sudo killall taskgated
  2. Na koniec podpisz gdb

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

  1. Wyłącz użytkownika root (krok 4)
  2. Uruchom ponownie, jeśli nadal nie działa. (jeśli nic innego nie działa, najprawdopodobniej już działa)

PS. W końcu używam, lldbponieważ to po prostu działa ( samouczek )

Taras Matsyk
źródło
5

Dla każdego, kto używa Sierra 10.12.6 (i nowszych wersji) i Homebrew, /usr/local/bin/gdbjest to symboliczne łącze do /usr/local/Cellar/gdb/8.0/bin/gdb(lub dowolnej wersji, np.8.0.1 .).

Musisz kodować zarówno link, jak i cel:

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

Lub, jeśli masz greadlink(zainstalowane przez brew install coreutils):

codesign -fs gdb-cert $(which gdb)
codesign -fs gdb-cert $(greadlink -f $(which gdb))
Larry Song
źródło
1
próbowałeś tego na High Sierra? U mnie nie działało na O / S: 10.13.6
rustyMagnet
3

Zastanawiam się, czy globalna zmiana w odpowiedzi na najwyżej głosowaną tutaj odpowiedź ma jakieś niezamierzone konsekwencje.

Zamiast włączać starą konwencję Tiger, taskgated pozwala na uruchomienie podpisanego kodu. Więc może być lepiej, aby uzyskać podpisany certyfikat dla gdb, podobny do odpowiedzi tutaj .

Po tym mogłem sudoużywać gdb. Jeśli potrzebujesz użyć gdb bez sudo, być może ten link pomoże , uwaga, jeszcze tego nie próbowałem, ponieważ używanie sudojest na razie dobrym rozwiązaniem.

JnBrymn
źródło
3

To może nie być powiązane. Możesz użyć lldb na macOS zamiast gdb. Nie potrzebujesz tego kłopotu, aby zainstalować gdb.

lldb ( http://lldb.llvm.org ) jest już domyślnie zainstalowany w High Sierra

Kaituo Li
źródło
0

Mogę polecić przestrzeganie tego sedna: https://gist.github.com/gravitylow/fb595186ce6068537a6e9da6d8b5b96d#file-codesign_gdb-md

Ze sztuczką do pokonania: unknown error = -2,147,414,007podczas tworzenia certyfikatu opisanego tutaj: https://apple.stackexchange.com/a/309123

Uwagi:

Ścieżka do gdb zainstalowanego jako homebrewpakiet powinna wyglądać następująco:/usr/local/Cellar/gdb/9.2/bin/gdb

I csrutil enable --without debugspowoduje komunikat o requesting unsupported configuration, jak tutaj: https://totalfinder.binaryage.com/system-integrity-protection

Test:

  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};
Iurii Vasylenko
źródło
-1

gdb 8.3;

Mój problem jest taki sam, jak ten powyżej, rozwiązany przez

codesign --entitlements gdb.xml -fs gdb-cert /usr/local/bin/gdb
CJ
źródło