gdb non riesce con errore "Impossibile trovare la porta attività Mach per ID processo"


138

La mia app funziona bene ma gdb non riesce a eseguirne il debug con il seguente errore

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

Sono su OS X Lion. La versione 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".

Penso che questo post possa essere d'aiuto: stackoverflow.com/questions/10221448/… .
Codie CodeMonkey

Risposte:


64

In Snow Leopard e versioni successive di Mac OS, non è sufficiente firmare il codice gdbdell'eseguibile.

Devi seguire questa guida per farlo funzionare: http://www.opensource.apple.com/source/lldb/lldb-69/docs/code-signing.txt

La guida spiega come farlo lldb, ma il processo è esattamente lo stesso per gdb.


12
Quelle istruzioni non hanno funzionato per me su OSX 10.9.2 con MacPorts, ma questo ha fatto: sourceware.org/gdb/wiki/BuildingOnDarwin
simpleuser

Funziona! Ma puoi spiegare cosa sudo security add-truststa facendo la linea? Posso cancellare il .cerfile dal mio desktop adesso?
Sreejith Ramakrishnan,

9
codesign -s gdb_codesign `which gdb` aiuta dopo questa guida
synther,

O sudo codesign -s gdb_codesign `which gdb-apple` su macOS sierra.
settembre

3
Per l'ultimo sistema operativo, il collegamento ha funzionato
yuxuan il

144

Funziona quando cambio a sudo gdb executableFileName! :)


2
Grazie. Questo plus codice era necessario per far funzionare gdb. Ho dato l'accesso root a gdb (come descritto qui stackoverflow.com/questions/10476154/… ) quindi non ho dovuto digitare sudo ogni volta. Edit - Trovato un approccio migliore qui: stackoverflow.com/a/10441587/305149
Aneil Mallavarapu

14
Eseguirlo come root? Sei serio? La peggiore "soluzione".
Equidamoide,

7
@Equidamoid Perché dovrebbe essere così male eseguire gdbcome root? Ero solo curioso perché è solo un debugger.
QUESTO UTENTE HA BISOGNO DI AIUTO

Cosa succederebbe se lo avessi eseguito come root? È il codice che hai scritto e non capisco le conseguenze
GHIACCIO FREDDO il

4
@COLDICE in generale non si desidera eseguire processi con privilegi di escalation (soprattutto escalation all'inizio come root) poiché in generale non hanno bisogno di accesso per modificare cose sul sistema o aprire porte inferiori a 1024 (le porte più alte possono essere utilizzato da utenti non di sistema / non root). Anche se "ti fidi" del tuo codice, ciò non significa che non hai commesso un errore che lo causi rm -rf /o qualcosa di simile distruttivo in cui sovrascrivi alcuni file di configurazione / binari su cui si basa il tuo computer per avviarsi e funzionare normalmente.
Shaunhusain,

32

Devi creare un certificato e firmare gdb:

  • Apri l'applicazione "Keychain Access" (/ Applicazioni / Utility / Keychain Access.app)
  • Apri menu / Accesso portachiavi / Assistente certificato / Crea un certificato ...
  • Scegli un nome (gdb-cert nell'esempio), imposta "Tipo di identità" su "Radice autofirmata", imposta "Tipo di certificato" su "Firma codice" e seleziona "Consenti di ignorare le impostazioni predefinite". Fai clic su "Continua". Potresti voler estendere il periodo predefinito di 365 giorni a 3650 giorni.
  • Fai clic più volte su "Continua" fino ad arrivare alla schermata "Specifica una posizione per il certificato", quindi imposta "Portachiavi su Sistema".
  • Se non riesci a memorizzare il certificato nel portachiavi "Sistema", crealo nel portachiavi "login", quindi esportalo. Puoi quindi importarlo nel portachiavi "Sistema".
  • Nei portachiavi seleziona "Sistema" e dovresti trovare il tuo nuovo certificato. Utilizzare il menu di scelta rapida per il certificato, selezionare "Ottieni informazioni", aprire la voce "Affidabilità" e impostare "Firma codice" su "Fidati sempre".
  • È necessario chiudere l'applicazione "Accesso Portachiavi" per utilizzare il certificato e riavviare il servizio "taskgated" interrompendo l'attuale processo "taskgated" in esecuzione. In alternativa è possibile riavviare il computer.
  • Finalmente puoi firmare gdb:

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

    sudo ggdb ./myprog


4
nota che uccidere taskgated non ha riavviato il processo. necessario per: sudo launchctl load /System/Library/LaunchDaemons/com.apple.taskgated.plist
Ben

Il taskgated è stato riavviato sopra, ma purtroppo non ha funzionato senza riavvio su sierra.
Neil McGill,

16

Il problema è che non sei loggato come utente root (cosa che non vuoi). È necessario creare un certificato per l'accesso a gdb. Segui questo tutorial e dovresti essere bravo ad andare ...

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

Se tutto il resto fallisce, basta usare: sudo gdb executableFileName


4
Il tutorial qui illustrato ha funzionato meglio. Ho dovuto solo eseguire codesign -s gdb-cert $(which gdb)per firmare l' gdbapp.
cevaris,

Confermando solo per chiunque stia provando questo su OSX 10.12.5, è necessario seguire entrambi i passaggi indicati nel collegamento BuildingOnDarwin ED eseguire gdb dopo il passaggio all'utente root.
AdjunctProfessorFalcon

7

Questo link ha fornito la procedura più chiara e dettagliata per far scomparire questo errore.

Nel mio caso dovevo avere la chiave come chiave di "Sistema", altrimenti non funzionava (cosa che non tutti gli URL citano).

Anche uccidere taskgatedè un'alternativa praticabile (e più rapida) al riavvio.

Ho anche disinstallato MacPorts prima di iniziare questo processo e disinstallato l'attuale gdb usando brew uninstall gdb.


Questo ha funzionato per me. +1 per riferimento che utilizza brew.
trigoman

3

Avevo bisogno di questo comando per farlo funzionare su El Capitan:

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


2

Su MacOSX lldb deve essere firmato con codice. Le build di debug e rilascio sono impostate per firmare il codice utilizzando un certificato di firma del codice denominato 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.

[Nota: - lldb è usato in mac come gdb.]


2

Ecco una guida davvero utile che ha risolto il mio problema (OSX 10.13.6).

  1. Apri Accesso portachiavi
  2. Nel menu, apri Accesso portachiavi> Assistente certificato> Crea un certificato
  3. Dagli un nome (es. Gdbc)
    • Tipo di identità: radice autofirmata
    • Tipo di certificato: firma del codice
    • Verifica: fammi sostituire le impostazioni predefinite
  4. Continuare fino a quando non viene richiesto: "specificare un percorso per ..."
  5. Imposta la posizione del portachiavi su Sistema
  6. Crea un certificato e chiudi assistente.
  7. Trova il certificato in Portachiavi di sistema, fai clic con il pulsante destro del mouse> ottieni informazioni (o fai doppio clic su di esso)
  8. Espandi Affidabilità, imposta la firma del codice in modo che sia sempre attendibile
  9. Riavvia taskgated nel terminale: killall taskgated
  10. Esegui codesign -fs gdbc /usr/local/bin/gdbnel terminale: questo richiede la password di root

1

Queste istruzioni funzionano per OSX High Sierra ed evitano di eseguire gdb come root (schifo!). Di recente ho aggiornato da OSX 10.13.2 a 10.3.3. Penso che sia quando gdb 8.0.1 (installato con homebrew) ha iniziato a fallire per me.

Ho avuto difficoltà con le istruzioni di altre persone. Dopo diverse istruzioni, tutto era un disastro. Quindi ho iniziato un nuovo. Ho seguito più o meno queste istruzioni .

Pulisci il casino:

  1. brew uninstall --force gdb # This deletes _all_ versions of gdb on the machine
  2. In Applications-> Utilities-> Keychain Access, ho eliminato tutti i certificati e le chiavi gdb precedenti (assicurati di sapere cosa stai facendo qui!). Non è chiaro se ciò sia necessario, ma dal momento che avevo risolto il problema cercando di creare quei certificati e chiavi usando altre istruzioni, li ho comunque eliminati. Avevo chiavi e certificati sia nel login che nel sistema.

Ora reinstalla gdb.

  1. brew install gdb
  2. All'interno Keychain Access, vai al menu Keychain Access-> Certificate Assistant->Create a Certificate
  3. Seleziona "Fammi sostituire le impostazioni predefinite" e imposta
Name : gdb-cert
Identity Type: Self Signed Root
Certificate Type : Code Signing

[X] Let me override defaults
  1. Nella prima pagina Informazioni sul certificato:
Serial Number : 1
Validity Period (days): 3650
  1. Nella seconda pagina Informazioni sul certificato, ho lasciato vuoti tutti i campi tranne quelli già compilati.

  2. Nella pagina Informazioni sulla coppia di chiavi ho lasciato i valori predefiniti

Key Size : 2048
Algorithm : RSA
  1. Nella pagina Estensione utilizzo chiave, ho lasciato le impostazioni predefinite selezionate.
[X] Include Key Usage Extension
[X] This extension is critical
Capabilities:
[X] Signature
  1. Nella pagina Estensione estensione utilizzo chiave, ho lasciato le impostazioni predefinite selezionate.
[X] Include Extended Key Usage Extension
[X] This extension is critical
Capabilities:
[X] Code Signing
  1. Nella pagina di estensione dei vincoli di base, nulla è stato verificato (impostazione predefinita).

  2. Nella pagina Estensione nome alternativo oggetto, ho lasciato l'impostazione predefinita selezionata e non ho aggiunto altro.

[X] Include Subject Alternate Name Extension
  1. Su Specifica una posizione per la pagina del certificato, ho impostato
Keychain: System
  1. Ho fatto clic su Crea e mi è stata richiesta la mia password.

  2. Di nuovo Keychain Accessnell'app, sono andato a, ho Systemcliccato con il tasto destro gdb-certe sotto il menu a discesa Trust, ho cambiato tutti i campi in Always Trust.

  3. Riavvia il computer.

  4. Al terminal, ho corso codesign -s gdb-cert /usr/local/bin/gdb. Ho inserito la mia password quando richiesto.

  5. Al terminal, ho corso echo "set startup-with-shell off" >> ~/.gdbinit

  6. Ho corso gdb myprograme poi startall'interno della console gdb. Qui, credo, mi ha richiesto la mia password. Dopodiché, tutte le successive esecuzioni non richiedevano la mia password.


Purtroppo, ho fatto sia la risposta più votata che la tua risposta e continuo a visualizzare lo stesso messaggio di errore. Ho macOS Catalina versione 10.15.4 e gdb 9.1.
Jay Sullivan,

@JaySullivan +1. Ho anche lo stesso problema.
Irsis

1

Questo è un approccio strano ma ha funzionato per me (MacOs HighSierra 10.13.3). Installa CLion. Viene fornito con gdb. Una volta eseguito gdb usando Terminale. Copia il programma gdb sul tuo usr / local / bin /. Nessun problema di accesso, sudo ecc.


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.