web-dev-qa-db-fra.com

Comment obtenir un gdb "codeigned" sur OSX?

Parce que j'ai besoin d'un gdb compatible Python, j'ai installé une autre version via

brew tap homebrew/dupes
brew install gdb

Je veux utiliser ce gdb avec Eclipse CDT, où j'ai entré le chemin vers le binaire dans les paramètres de débogage. Cependant, le lancement d'un programme de débogage échoue avec le message suivant:

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

Que signifie "signé par code" dans ce contexte? Comment puis-je obtenir cette gdbexécution?

41
clstaudt

Il semblerait que vous deviez signer l'exécutable. Voir ces liens pour plus d'informations. Vous devriez pouvoir vous débrouiller avec l'auto-signature si vous ne prévoyez pas de redistribuer cette version de gdb.

https://developer.Apple.com/library/mac/#documentation/Security/Conceptual/CodeSigningGuide/Introduction/Introduction.html

https://developer.Apple.com/library/mac/#documentation/Darwin/Reference/Manpages/man1/codesign.1.html

Vous pouvez également désactiver la signature de code sur votre système, bien que cela présente un risque pour la sécurité. Pour ce faire, essayez d'exécuter Sudo spctl --master-disable dans le terminal.

4
Matt

I.1 Signature de code du débogueur

Le noyau Darwin nécessite que le débogueur dispose d'autorisations spéciales avant de pouvoir contrôler d'autres processus. Ces autorisations sont accordées en signant le code de l'exécutable GDB. Sans ces autorisations, le débogueur signalera des messages d'erreur tels que:

Starting program: /x/y/foo
Unable to find Mach task port for process-id 28885: (os/kern) failure (0x5).
 (please check gdb is codesigned - see taskgated(8))

La signature de codes nécessite un certificat. La procédure suivante explique comment en créer un:

  • Démarrez l'application Keychain Access (dans/Applications/Utilitaires/Keychain Access.app)
  • Sélectionnez le menu Keychain Access -> Certificate Assistant -> Create a Certificate ...
  • Ensuite:
    • Choisissez un nom pour le nouveau certificat (cette procédure utilisera "gdb-cert" comme exemple)
    • Définissez "Type d'identité" sur "Racine auto-signée"
    • Réglez "Type de certificat" sur "Signature du code"
    • Activez l'option "Permettez-moi de remplacer les valeurs par défaut"
  • Cliquez plusieurs fois sur "Continuer" jusqu'à ce que l'écran "Spécifier un emplacement pour le certificat" apparaisse, puis réglez "Porte-clés" sur "Système"
  • Cliquez sur "Continuer" jusqu'à la création du certificat
  • Enfin, dans la vue, double-cliquez sur le nouveau certificat et définissez "Lors de l'utilisation de ce certificat" sur "Toujours faire confiance"
  • Quittez l'application Keychain Access et redémarrez l'ordinateur (cela est malheureusement requis)

Une fois le certificat créé, le débogueur peut être codé comme suit. Dans un terminal, exécutez la commande suivante ...

codesign -f -s  "gdb-cert"  <gnat_install_prefix>/bin/gdb

... où "gdb-cert" doit être remplacé par le nom de certificat réel choisi ci-dessus, et doit être remplacé par l'emplacement où vous avez installé GNAT.

source: https://gcc.gnu.org/onlinedocs/gcc-4.8.1/gnat_ugn_unw/Codesigning-the-Debugger.html

MISE À JOUR: High-Sierra (Assistant Certificat - Erreur inconnue)https: //Apple.stackexchange .com/questions/309017/unknown-error-2-147-414-007-on-creation-certificate-with-certificate-assist

91
Zak

J'ai fait fonctionner gdb sur OSX 10.9 sans signer de 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'options de -s à -sp à la ligne 22, col 27.

  3. redémarrez l'ordinateur.

  4. Utilisez gdb

5
klm123

J'ai fini par devoir suivre ces directions au lieu des directions suggérées par d'autres.

Je ne sais toujours pas si c'était l'acte de killall taskgated ou le processus d'activation de l'utilisateur root qui a fait la différence.

Certains ont dit que le redémarrage était nécessaire. Je trouve qu'avec les instructions ci-dessus, ce n'est peut-être pas le cas.

J'ai également apporté le changement recommandé par @ klm123, donc cela peut également avoir contribué.

Notez que j'utilise homebrew, pas macports.

3
Doctor Mohawk

Vérifiez la confiance du certificat, il doit être approuvé pour la signature de code (sur yosemite qui est l'avant-dernier dans la section de confiance de la vue cert dans l'accès au trousseau).

Au début, le certificat n'était pas connu pour la signature de codes avec le trousseau, car il manquait le but d'extension "Signature de code", vous pouvez le trouver si vous regardez dans le trousseau et double-cliquez sur le certificat:

enter image description here

J'ai corrigé cela:

enter image description here

Ensuite, j'ai ajouté le certificat aux certificats de signature de confiance, après avoir fait glisser et déposer le certificat du trousseau sur mon bureau, ce qui a créé le ~/Desktop/gdb-cert.cer:

$ Sudo security add-trusted-cert -d -r trustRoot -p codeSign -k /Library/Keychains/System.keychain ~/Desktop/gdb-cert.cer

C'était un peu délicat car j'ai été induit en erreur par certaines publications sur Internet et je n'ai pas consulté la page de manuel. Certains ont dit que vous devriez utiliser add-trust ( https://llvm.org/svn/llvm-project/lldb/trunk/docs/code-signing.txt ). Le plus terrible, c'est que la commande a réussi, mais n'a pas fait ce qu'elle "devrait" (enfin, c'était la mauvaise commande, mais elle aurait dû me dire que c'était faux).

Après cela, j'ai trouvé le nouveau certificat dans les certificats de confiance comme suit:

$ security find-identity -p codesigning

Policy: Code Signing
  Matching identities
      1) E7419032D4..... "Mac Developer: FirstName LastName (K2Q869SWUE)"    (CSSMERR_TP_CERT_EXPIRED)
      2) ACD43B6... "gdb-cert"
  2 identities found

  Valid identities only
      1) ACD43... "gdb-cert"
  1 valid identities found

Dans mon cas, le certificat Apple Apple a expiré, mais celui que j'utilisais pour signer gdb ne l'était pas (enfin, je l'ai créé moi-même). Sachez également que la stratégie est nommée différemment pour le "security add-trusted-cert" (- p codeSign) et la commande "security find-identity" (-p codesigning). J'ai ensuite signé gdb et j'ai toujours obtenu:

$ codesign --sign gdb-cert.cer --keychain ~/Library/Keychains/login.keychain `which gdb`
  gdb-cert.cer: no identity found

car j'avais l'impression que je devais donner le nom de fichier du certificat à l'option --sign, mais c'était en fait le CN du certificat que j'aurais dû fournir et qui devrait être dans le magasin de confiance. Vous pouvez trouver le CN ici en double-cliquant sur le certificat dans le trousseau:

enter image description here

ou dans la sortie ci-dessus de "security find-identity -p codesigning". Ensuite, j'ai signé et j'ai dû lui donner le bon porte-clés:

 codesign -s gdb-cert --keychain /Library/Keychains/System.keychain `which gdb` 

J'ai dû entrer le mot de passe root pour permettre l'accès au trousseau.

Cela m'a ensuite donné un gdb fonctionnel et cela devrait vous donner une demande signée.

3
user637338

C'est un sujet très ancien, mais j'ajoute une réponse, car sur de nombreuses instructions disponibles, une seule contenait juste les bonnes étapes pour faire fonctionner un débogueur auto-signé.

Vous devez créer un certificat racine auto-signé, puis signer l'exécutable gdb avec, mais beaucoup de gens se sont plaints que cela ne fonctionnait pas pour eux. Ni pour moi jusqu'à ce que je tombe sur ce lien .

Le point clé manquant dans d'autres manuels est que vous devez redémarrer votre ordinateur pour que les modifications prennent effet. Une fois que j'ai fait ça, tout a fonctionné comme prévu.

J'espère que cela aidera les autres.

3
skh

Si l'utilisation de gdb n'est pas une exigence difficile, vous pouvez également utiliser lldb comme alternative. Il est déjà sur votre système et n'a pas besoin d'être signé par code:

$ lldb stddev_bugged
(lldb) target create "stddev_bugged"
Current executable set to 'stddev_bugged' (x86_64).
(lldb) b mean_and_var
Breakpoint 1: where = stddev_bugged`mean_and_var + 17 at stddev_bugged.c:17, address = 0x0000000100000b11
(lldb) r
Process 1621 launched: '/Users/richardschneeman/Documents/projects/21stCentury/02/example-00/stddev_bugged' (x86_64)
Process 1621 stopped
* thread #1: tid = 0xc777, 0x0000000100000b11 stddev_bugged`mean_and_var(data=0x00007fff5fbff590) + 17 at stddev_bugged.c:17, queue = 'com.Apple.main-thread', stop reason = breakpoint 1.1
    frame #0: 0x0000000100000b11 stddev_bugged`mean_and_var(data=0x00007fff5fbff590) + 17 at stddev_bugged.c:17
   14   typedef struct meanvar {double mean, var;} meanvar;
   15
   16   meanvar mean_and_var(const double *data){
-> 17       long double avg = 0,
   18             avg2 = 0;
   19       long double ratio;
   20       size_t count= 0;
(lldb)

Voici un tableau convertissant les commandes gdb en lldbhttp://lldb.llvm.org/lldb-gdb.html

2
Schneems

J'ai suivi les instructions avec la signature de code, mais gdb me donnerait toujours la même erreur. Il s'est avéré que cela fonctionnait lorsque gdb est exécuté en tant que root (Sudo gdb). J'utilise Sierra osx.

0
Ilya M