"Per favore controlla che gdb sia codificato - vedi taskgated (8)" - Come installare gdb con codice homebrew firmato?


107

Sono sotto osx 10.8.4 e ho installato gdb 7.5.1 con homebrew (motivazione ottenere un nuovo gdb con nuove funzionalità come --with-python ecc ...)

Per farla breve, quando eseguo il debug all'interno di un progetto Eclipse c ++ ottengo:

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

Ho seguito vari suggerimenti per la firma del codice

Così ho fatto:

  1. Configura il certificato
  2. Firma gdb -> codesign -s gdb-cert / usr / local / bin / gdb

Quando eseguo nuovamente il debug in Eclipse ottengo lo stesso errore di cui sopra "(controlla che gdb sia contrassegnato in codice - vedi taskgated (8))".

Se reimposto il gdb al vecchio gdb (nelle preferenze gdb di Eclipse) / usr / libexec / gdb / gdb-i386-apple-darwin il debug viene eseguito come previsto.

Eventuali soluzioni / suggerimenti là fuori?

Grazie

Pelle


Non è questa una "funzionalità di sicurezza", in altre parole, il tuo sistema è configurato per accettare solo software che è stato ufficialmente firmato? Se è così, si spera che ci sia un modo per disattivare questa funzione ...
Mats Petersson

ok grazie per il tuo feedback - capisco la tua caratteristica di sicurezza ma il mio problema è quindi come eseguire la firma ... c'è un post simile stackoverflow.com/questions/12050257/gdb-fails-on-mountain-lion che non ha funzionato Non risolverlo ancora per me
pellekrogholt

Risposte:


136

Questo errore si verifica perché OSX implementa una politica di accesso pid che richiede una firma digitale per i binari per accedere ad altri processi pid. Per abilitare l'accesso a gdb ad altri processi, dobbiamo prima firmare il codice binario. Questa firma dipende da un particolare certificato, che l'utente deve creare e registrare con il sistema.

Per creare un certificato di firma del codice, apri l'applicazione Accesso portachiavi. Scegli il menu Accesso portachiavi -> Assistente certificato -> Crea un certificato ...

Scegliere un nome per il certificato (ad esempio, gdb-cert), impostare Tipo di identità su Radice autofirmata, impostare Tipo di certificato su Firma codice e selezionare Consenti l'override dei valori predefiniti. Fare clic più volte su Continua fino ad arrivare alla schermata Specifica una posizione per il certificato, quindi impostare Portachiavi su Sistema.

Fare doppio clic sul certificato, aprire la sezione Trust e impostare Code Signing su Always Trust. Esci dall'applicazione Accesso portachiavi.

Riavviare il servizio taskgated e firmare il file binario.

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

fonte http://andresabino.com/2015/04/14/codesign-gdb-on-mac-os-x-yosemite-10-10-2/

Su macOS 10.12 (Sierra) e versioni successive, devi anche

Usa gdb 7.12.1 o successivo Inoltre, impedisce a gdb di utilizzare una shell per avviare il programma di cui eseguire il debug. Puoi usare il seguente comando per questo all'interno di gdb:

set startup-with-shell off

Puoi anche mettere questo ultimo comando in un file chiamato .gdbinit nella tua home directory, nel qual caso verrà applicato automaticamente ogni volta che avvii gdb

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

FONTE: https://sourceware.org/gdb/wiki/BuildingOnDarwin


6
Funziona come un fascino. Grazie.
pceccon

14
Come ha sottolineato l'OP, questo non ha funzionato per lui (e nemmeno per me).
PVitt

6
Sembra che non funzioni macOS Sierracon certificati autofirmati.
loretoparisi

sudo killall taskgatedè la chiave per risolvere il mio problema
Karthikeyan Vaithilingam

Ho seguito i passaggi con precisione e questo ha funzionato magnificamente per me su macOS Sierra.
jdg

29

Ho fatto funzionare gdb su OSX 10.9 senza codeigning in questo modo (descritto qui ):

  1. Installa gdb con macports. (forse puoi saltarlo)

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

    cambia la stringa dell'opzione da -sa -spalla riga 22, col 27.

  3. Riavvia il computer.

  4. Usa gdb. Se lo hai installato con le porte Mac, devi usare ggdbcommand. O hai creato un alias nel tuo file di configurazione:

alias gdb='ggdb'

e usa il comando "gdb".


Mi ero imbattuto in questo problema per un po 'e avevo trovato altri how-to inutili. Questo ha funzionato come un fascino.
Bill DeRose

@ BillDeRose, lo stesso per me.
klm123

@nimrodm, intendi "sudo gdb"? dovrebbe essere "ggdb" con macports
klm123

1
Ugh. Non voglio dover correre gdbcome sudo. Sembra un rischio per la sicurezza non necessario.
Autumnsault

2
Non riavviare il computer. Ci deve essere un comando per riavviare qualcosa!
Michael,

27

Sono passato a gdb 8.3e non sono riuscito a far funzionare le cose. Questo mi ha aiutato:

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

Dove il contenuto di 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>

Ho trovato questa soluzione qui: https://timnash.co.uk/getting-gdb-to-semi-reliably-work-on-mojave-macos/

Nota: senza l'autorizzazione ero in grado di eseguire gdbsolo con sudo.


2
Cosa fai se ottienierror: The specified item could not be found in the keychain.
Sridhar Sarnobat

@SridharSarnobat Usa la pipeline prima di questa risposta stackoverflow.com/a/32727069/339146
Panayotis

Non riuscito dopo aver provato la risposta di @maximser. Allora questo funziona per me. macOS 10.15.4, gdb 9.2 installato tramite brew.
weaming

@SridharSarnobat: È necessario creare il certificato prima stackoverflow.com/questions/35020236/...
Akansha

26

Ho riscontrato lo stesso problema con GDB. Sto correndo sotto Mac OS X 10.8.5alias Mountain Lion. Sto usando la versione GDB 7.7.1.

Ho compilato il mio programma di test con il seguente comando:

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

Se ho inserito il comando gdb sample.out, ricevo lo stesso messaggio di errore criptico:

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

Questo messaggio di errore tuttavia è una falsa pista.

La soluzione che ho trovato che ha funzionato per me è stata semplicemente invocare GDB utilizzando l'account superutente:

sudo gdb sample.out. 

Funziona bene per me.

E da quel momento potrei eseguire GDB example.out senza usare sudo.

Spero che questo aiuti e funzioni per gli altri. RSVP se non lo fa.


1
Non sono sicuro del motivo per cui questo è stato votato. Ho eseguito il comando come root (con sudo) e ha funzionato.
iProgram

6

Niente di tutto questo ha funzionato per me e ho dovuto fare una lunga corsa. Ecco un elenco completo dei passaggi che ho eseguito per farlo funzionare.

  1. Crea un certificato per firmare il file gdb.

Sfortunatamente, il certificato di sistema mi ha fornito il Unknown Error = -2,147,414,007che è molto utile, quindi ho dovuto trovare una soluzione alternativa. KeyChain Assistant -> Create certificate ->

Raccogliere login, gdb-cert,Code Signing

Copia / sposta il certificato nel portachiavi di sistema (inserisci la password)

  1. Selezionare il certificato ( gdb-cert) fare clic su Get info->Trust Always
  2. disattivare startup-with-shell

Entra in console: set startup-with-shell off

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

  1. Abilita utente root

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

  1. sudo killall taskgated
  2. Infine firma gdb

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

  1. Disabilita utente root (passaggio 4)
  2. Riavvia se ancora non funziona. (se nient'altro funziona, molto probabilmente funziona già)

PS. Finisco per usare lldbperché funziona ( tutorial )


5

Per chiunque usi Sierra 10.12.6 (e versioni successive) e Homebrew, /usr/local/bin/gdbè un collegamento simbolico a /usr/local/Cellar/gdb/8.0/bin/gdb(o qualsiasi altra versione, ad esempio 8.0.1).

È necessario codificare sia il collegamento che il target:

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

Oppure, se hai greadlink(installato tramite brew install coreutils):

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

1
l'hai provato su High Sierra? Non ha funzionato per me su O / S: 10.13.6
rustyMagnet

3

Mi chiedo se il cambiamento globale nella risposta più votata qui abbia alcune conseguenze non intenzionali.

Piuttosto che abilitare la vecchia convenzione Tiger, il taskgated consente l'esecuzione del codice firmato. Quindi potrebbe essere meglio ottenere solo un certificato firmato per gdb, simile alla risposta qui .

Dopo questo sono stato in grado di sudoutilizzare gdb. Se hai bisogno di usare gdb senza sudo, forse questo link ti aiuterà , disclaimer, non l'ho ancora provato perché l'uso sudoè una soluzione ok per ora`.


3

Questo potrebbe non essere correlato. Puoi usare lldb su macos invece di gdb. Non hai bisogno di questa seccatura per installare gdb.

lldb ( http://lldb.llvm.org ) è già installato per impostazione predefinita in High Sierra


0

Posso consigliare di seguire questa sintesi: https://gist.github.com/gravitylow/fb595186ce6068537a6e9da6d8b5b96d#file-codesign_gdb-md

Con un trucco da superare: unknown error = -2,147,414,007durante la creazione del certificato descritto qui: https://apple.stackexchange.com/a/309123

Appunti:

Il percorso per gdb installato come homebrewpacchetto dovrebbe essere qualcosa del tipo:/usr/local/Cellar/gdb/9.2/bin/gdb

E csrutil enable --without debugcauserà un messaggio su requesting unsupported configuration, come qui: 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};

-1

gdb 8.3;

Il mio problema è lo stesso del ragazzo sopra, risolto da

codesign --entitlements gdb.xml -fs gdb-cert /usr/local/bin/gdb
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.