«Veuillez vérifier que gdb est codé - voir taskgated (8)» - Comment installer gdb avec le code homebrew signé?

107

Je suis sous osx 10.8.4 et j'ai installé gdb 7.5.1 avec homebrew (la motivation obtient un nouveau gdb avec de nouvelles fonctionnalités telles que --with-python etc ...)

En bref, lorsque j'exécute le débogage dans un projet C ++ Eclipse, j'obtiens:

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

J'ai suivi diverses suggestions pour la signature de code

Alors j'ai fait:

  1. Configurer le certificat
  2. Signez le gdb -> codesign -s gdb-cert / usr / local / bin / gdb

Quand je relance le débogage dans Eclipse, j'obtiens la même erreur que ci-dessus "(veuillez vérifier que gdb est codé - voir taskgated (8))".

Si je remets le gdb à l'ancien gdb (dans les préférences gdb d'Eclipse) / usr / libexec / gdb / gdb-i386-apple-darwin, le débogage se déroule comme prévu.

Des solutions / astuces là-bas?

THX

Pelle

pellekrogholt
la source
N'est-ce pas une "fonction de sécurité" - en d'autres termes, votre système est configuré pour n'accepter que les logiciels qui ont été officiellement signés? Si tel est le cas, j'espère qu'il existe un moyen de désactiver cette fonctionnalité ...
Mats Petersson
ok merci pour vos commentaires - je comprends votre point de sécurité mais mon problème est alors de savoir comment faire la signature ... il y a un post similaire stackoverflow.com/questions/12050257/gdb-fails-on-mountain-lion qui n'a pas fait ' T le résoudre pour moi encore
pellekrogholt

Réponses:

137

Cette erreur se produit car OSX implémente une politique d'accès pid qui nécessite une signature numérique pour les binaires pour accéder à d'autres processus pids. Pour activer l'accès gdb à d'autres processus, nous devons d'abord signer le code binaire. Cette signature dépend d'un certificat particulier, que l'utilisateur doit créer et enregistrer auprès du système.

Pour créer un certificat de signature de code, ouvrez l'application Keychain Access. Choisissez le menu Accès au trousseau -> Assistant de certificat -> Créer un certificat…

Choisissez un nom pour le certificat (par exemple, gdb-cert), définissez Type d'identité sur Racine auto-signée, définissez Type de certificat sur Signature de code et sélectionnez les valeurs par défaut Permettez-moi de remplacer. Cliquez plusieurs fois sur Continuer jusqu'à ce que vous arriviez à l'écran Spécifier un emplacement pour le certificat, puis définissez Trousseau sur Système.

Double-cliquez sur le certificat, ouvrez la section Trust et définissez Code Signing sur Always Trust. Quittez l'application Keychain Access.

Redémarrez le service géré par tâches et signez le binaire.

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

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

Sur macOS 10.12 (Sierra) et versions ultérieures, vous devez également

Utiliser gdb 7.12.1 ou version ultérieure Empêchez également gdb d'utiliser un shell pour démarrer le programme à déboguer. Vous pouvez utiliser la commande suivante pour cela dans gdb:

set startup-with-shell off

Vous pouvez également placer cette dernière commande dans un fichier appelé .gdbinit dans votre répertoire personnel, auquel cas elle sera appliquée automatiquement à chaque fois que vous démarrez gdb

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

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

maximser
la source
6
Fonctionne comme un charme. Je vous remercie.
pceccon
14
Comme l'a souligné l'OP, cela n'a pas fait l'affaire pour lui (et pour moi non plus).
PVitt
6
Il semble que cela ne fonctionne pas macOS Sierraavec les certificats auto-signés.
loretoparisi
sudo killall taskgatedest la clé pour résoudre mon problème
Karthikeyan Vaithilingam
J'ai suivi les étapes avec précision, et cela a parfaitement fonctionné pour moi sur macOS Sierra.
jdg
29

J'ai fait fonctionner gdb sur OSX 10.9 sans code de cette façon (décrit ici ):

  1. Installez gdb avec macports. (peut-être que vous pouvez le sauter)

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

    changer la chaîne d'option de -sà -spà la ligne 22, col 27.

  3. Redémarrez l'ordinateur.

  4. Utilisez gdb. Si vous l'avez installé avec des ports mac, vous devez utiliser la ggdbcommande. Ou créez un alias dans votre fichier de configuration:

alias gdb='ggdb'

et utilisez ensuite la commande 'gdb'.

klm123
la source
J'avais rencontré ce problème pendant un certain temps et j'avais trouvé d'autres astuces inutiles. Cela a fonctionné comme un charme.
Bill DeRose
@BillDeRose, la même chose pour moi.
klm123
@nimrodm, vous voulez dire "sudo gdb"? ça devrait être "ggdb" avec macports
klm123
1
Pouah. Je ne veux pas avoir à courir gdbcomme sudo. Cela semble être un risque de sécurité inutile.
Autumnsault
2
Je ne vais pas redémarrer l'ordinateur. Il doit y avoir une commande pour redémarrer quelque chose!
Michael le
27

J'ai mis à niveau gdb 8.3et je n'ai pas pu faire fonctionner les choses. Cela m'a aidé:

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

Où le contenu de gdb.xmlest:

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

J'ai trouvé cette solution ici: https://timnash.co.uk/getting-gdb-to-semi-reliably-work-on-mojave-macos/

Remarque: sans le droit, je ne pouvais courir gdbqu'avec sudo.

Johnny Thunderman
la source
2
Que faites-vous si vous obtenezerror: The specified item could not be found in the keychain.
Sridhar Sarnobat le
@SridharSarnobat Utilisez d'abord le pipeline de cette réponse stackoverflow.com/a/32727069/339146
Panayotis
Échec après avoir essayé la réponse de @maximser. Ensuite, cela fonctionne pour moi. macOS 10.15.4, gdb 9.2 installé via brew.
weaming
@SridharSarnobat: Vous devez d'abord créer le certificat stackoverflow.com/questions/35020236/…
Akansha
26

J'ai rencontré le même problème avec GDB. Je cours sous Mac OS X 10.8.5aka Mountain Lion. J'utilise la version GDB7.7.1 .

J'ai compilé mon programme de test avec la commande suivante:

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

Si j'ai entré la commande gdb sample.out, j'obtiens le même message d'erreur cryptique:

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

Ce message d'erreur est cependant un hareng rouge.

La solution que j'ai trouvée et qui fonctionnait pour moi était d'appeler simplement GDB en utilisant le compte de superutilisateur:

sudo gdb sample.out. 

Cela fonctionne bien pour moi.

Et qu'à partir de là, je pourrais exécuter GDB example.out sans utiliser sudo.

J'espère que cela aide et fonctionne pour les autres. RSVP si ce n'est pas le cas.

mickster99
la source
1
Je ne sais pas pourquoi ce vote a été rejeté. J'ai exécuté la commande en tant que root (avec sudo) et cela a fonctionné.
iProgram
6

Rien de tout cela n'a fonctionné pour moi et j'ai dû faire un long parcours. Voici une liste complète des étapes que j'ai effectuées pour le faire fonctionner.

  1. Créez un certificat pour signer le gdb.

Malheureusement, le certificat système m'a donné ce Unknown Error = -2,147,414,007qui est très utile, j'ai donc dû aller avec une solution de contournement. KeyChain Assistant -> Create certificate ->

Choisissez login,gdb-cert ,Code Signing

Copier / déplacer le certificat vers le trousseau système (saisir le mot de passe)

  1. Sélectionnez le certificat ( gdb-cert) cliquez sur Get info->Trust Always
  2. Désactiver startup-with-shell

Entrez dans la console: set startup-with-shell off

Souvenez-vous de la configuration: echo "set startup-with-shell off" >> ~/. gdbinit

  1. Activer l'utilisateur racine

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

  1. sudo killall taskgated
  2. Enfin signer gdb

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

  1. Désactiver l'utilisateur racine (étape 4)
  2. Redémarrez si cela ne fonctionne toujours pas. (si rien d'autre ne fonctionne, cela fonctionne probablement déjà)

PS. Je finis par utiliser lldbparce que ça marche ( tutoriel )

Taras Matsyk
la source
5

Pour tous ceux qui utilisent Sierra 10.12.6 (et plus) et Homebrew, /usr/local/bin/gdbun lien symbolique vers /usr/local/Cellar/gdb/8.0/bin/gdb(ou n'importe quelle version, par exemple8.0.1 ).

Vous devez coder à la fois le lien et la cible:

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

Ou, si vous avez greadlink(installé via brew install coreutils):

codesign -fs gdb-cert $(which gdb)
codesign -fs gdb-cert $(greadlink -f $(which gdb))
Larry Song
la source
1
avez-vous essayé ceci sur High Sierra? Cela n'a pas fonctionné pour moi sur O / S: 10.13.6
rustyMagnet
3

Je me demande si le changement global de la réponse la plus votée ici a des conséquences involontaires.

Plutôt que d'activer l'ancienne convention Tiger, taskgated autorise l'exécution du code signé. Il serait donc préférable d'obtenir simplement un certificat signé pour gdb, similaire à la réponse ici .

Après cela, j'ai pu sudoutiliser gdb. Si vous avez besoin d'utiliser gdb sans sudo, ce lien vous aidera peut- être, avertissement, je ne l'ai pas encore essayé car l'utilisation sudoest une solution correcte pour le moment.

JnBrymn
la source
3

Cela peut ne pas être lié. Vous pouvez utiliser lldb sur macos au lieu de gdb. Vous n'avez pas besoin de ces tracas pour installer gdb.

lldb ( http://lldb.llvm.org ) est déjà installé par défaut dans High Sierra

Kaituo Li
la source
0

Je peux recommander de suivre cet essentiel: https://gist.github.com/gravitylow/fb595186ce6068537a6e9da6d8b5b96d#file-codesign_gdb-md

Avec astuce à surmonter: unknown error = -2,147,414,007lors de la création du certificat décrit ici: https://apple.stackexchange.com/a/309123

Remarques:

Le chemin pour gdb installé en tant que homebrewpackage devrait être quelque chose comme:/usr/local/Cellar/gdb/9.2/bin/gdb

Et csrutil enable --without debugprovoquera un message sur requesting unsupported configuration, comme ici: https://totalfinder.binaryage.com/system-integrity-protection

Tester:

  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
la source
-1

gdb 8,3;

Mon problème est le même que le gars ci-dessus, résolu par

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