gdb échoue avec l'erreur "Impossible de trouver le port de tâche Mach pour l'ID de processus"

138

Mon application fonctionne bien mais gdb ne parvient pas à la déboguer avec l'erreur suivante

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

Je suis sur OS X Lion. La version GDB est

$ 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".
SB
la source
Je pense que cet article peut aider: stackoverflow.com/questions/10221448/… .
Codie CodeMonkey

Réponses:

64

Dans Snow Leopard et les versions ultérieures de Mac OS, il ne suffit pas de coder l' gdbexécutable.

Vous devez suivre ce guide pour le faire fonctionner: http://www.opensource.apple.com/source/lldb/lldb-69/docs/code-signing.txt

Le guide explique comment le faire pour lldb, mais le processus est exactement le même pour gdb.

Tyilo
la source
12
Ces instructions n'ont pas fonctionné pour moi sur OSX 10.9.2 avec MacPorts, mais cela a fonctionné: sourceware.org/gdb/wiki/BuildingOnDarwin
simpleuser
Ça marche! Mais pouvez-vous s'il vous plaît expliquer ce que fait la sudo security add-trustligne? Puis-je supprimer le .cerfichier de mon bureau maintenant?
Sreejith Ramakrishnan
9
codesign -s gdb_codesign `which gdb` aide après ce guide
synther
Ou sudo codesign -s gdb_codesign `which gdb-apple` sur macOS sierra.
sdive
3
Pour le dernier système d'exploitation, le lien a fonctionné
yuxuan
144

Cela fonctionne quand je passe à sudo gdb executableFileName! :)

Mengyuan
la source
2
Merci. Cette signature de code plus était nécessaire pour que gdb fonctionne. J'ai donné un accès root à gdb (comme décrit ici stackoverflow.com/questions/10476154/… ) donc je n'ai pas eu à taper sudo à chaque fois. Edit -
Nous avons
14
Exécutez-le en tant que root? Es-tu sérieux? La pire "solution".
Equidamoid
7
@Equidamoid Pourquoi serait-il si mauvais de fonctionner en gdbtant que root? J'étais juste curieux parce que c'est juste un débogueur.
CET UTILISATEUR A BESOIN D'AIDE
Que se passerait-il si vous l'exécutiez en tant que root? C'est le code que vous avez écrit, et je ne comprends pas les conséquences
COLD ICE
4
@COLDICE en général, vous ne voulez pas exécuter de processus avec des privilèges élevés (en particulier escaladés vers le haut en tant que root) car en général ils n'ont pas besoin d'accéder pour modifier les choses sur le système ou ouvrir des ports inférieurs à 1024 (des ports plus élevés peuvent être utilisé par des utilisateurs non système / non root). Même si vous «faites confiance» à votre propre code, cela ne signifie pas que vous n’avez pas commis d’erreur qui lerm -rf / ou quelque chose de similaire destructeur où vous écrasez certaines configurations / binaires sur lesquels votre ordinateur s'appuie pour démarrer et fonctionner normalement.
shaunhusain
32

Vous devez créer un certificat et signer gdb:

  • Ouvrez l'application «Keychain Access» (/ Applications / Utilities / Keychain Access.app)
  • Ouvrir le menu / Accès au trousseau / Assistant de certificat / Créer un certificat ...
  • Choisissez un nom (gdb-cert dans l'exemple), réglez «Type d'identité» sur «Racine auto-signée», réglez «Type de certificat» sur «Signature de code» et sélectionnez «Permettez-moi de remplacer les valeurs par défaut». Cliquez sur «Continuer». Vous souhaiterez peut-être étendre la période prédéfinie de 365 jours à 3650 jours.
  • Cliquez plusieurs fois sur «Continuer» jusqu'à ce que vous arriviez à l'écran «Spécifier un emplacement pour le certificat», puis réglez «Trousseau sur le système».
  • Si vous ne pouvez pas stocker le certificat dans le trousseau «Système», créez-le dans le trousseau «login», puis exportez-le. Vous pouvez ensuite l'importer dans le trousseau «Système».
  • Dans les porte-clés, sélectionnez «Système» et vous devriez trouver votre nouveau certificat. Utilisez le menu contextuel du certificat, sélectionnez «Get Info», ouvrez l'élément «Trust» et réglez «Code Signing» sur «Always Trust».
  • Vous devez quitter l'application «Keychain Access» pour utiliser le certificat et redémarrer le service «taskgated» en supprimant le processus «taskgated» en cours d'exécution. Vous pouvez également redémarrer votre ordinateur.
  • Enfin, vous pouvez signer gdb:

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

    sudo ggdb ./myprog

qed
la source
4
note que la mise à mort de taskgated n'a pas redémarré le processus. nécessaire pour: sudo launchctl load /System/Library/LaunchDaemons/com.apple.taskgated.plist
Ben
La tâche ci-dessus a redémarré - mais cela ne fonctionnait toujours pas sans un redémarrage sur sierra, malheureusement.
Neil McGill
16

Le problème est que vous n'êtes pas connecté en tant qu'utilisateur root (ce que vous ne voulez pas). Vous devez créer un certificat pour que gdb soit autorisé à accéder. Suivez ce tutoriel et vous devriez être prêt à partir ...

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

Si tout le reste échoue, utilisez simplement: sudo gdb executableFileName

Sam Ruberti
la source
4
Le tutoriel présenté ici a fonctionné le mieux. Je devais simplement exécuter codesign -s gdb-cert $(which gdb)pour signer l' gdbapplication.
cevaris
En confirmant simplement pour quiconque essaie ceci sur OSX 10.12.5, vous devez à la fois suivre les étapes décrites dans le lien BuildingOnDarwin ET exécuter gdb après le passage à l'utilisateur root.
AdjunctProfessorFalcon
7

Ce lien avait l'étape par étape la plus claire et la plus détaillée pour faire disparaître cette erreur pour moi.

Dans mon cas, je devais avoir la clé en tant que clé "Système", sinon cela ne fonctionnait pas (ce que toutes les URL ne mentionnent pas).

Tuer taskgatedest également une alternative viable (et plus rapide) au redémarrage.

J'ai également désinstallé MacPorts avant de commencer ce processus et désinstallé le gdb actuel en utilisant brew uninstall gdb.

Hans Roggeman
la source
Cela a fonctionné pour moi. +1 pour référence qui utilise brew.
trigoman
3

J'avais besoin de cette commande pour le faire fonctionner sur El Capitan:

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

J'ai suivi ce tutoriel, et tout va bien.

ray6080
la source
2

Sur MacOSX, lldb doit être signé en code. Les versions Debug et Release sont définies sur la signature de code à l'aide d'un certificat de signature de code nommé 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.

[Remarque: - lldb est utilisé dans mac comme gdb.]

Pantalon Bhupesh
la source
2

Voici un guide vraiment utile qui a résolu mon problème (OSX 10.13.6).

  1. Ouvrir l'accès au trousseau
  2. Dans le menu, ouvrez Accès au trousseau> Assistant de certificat> Créer un certificat
  3. Donnez-lui un nom (par exemple gdbc)
    • Type d'identité: racine auto-signée
    • Type de certificat: Signature de code
    • Vérifier: laissez-moi remplacer les valeurs par défaut
  4. Continuez jusqu'à ce qu'il vous demande: "spécifier un emplacement pour ..."
  5. Définir l'emplacement du trousseau sur Système
  6. Créez un certificat et fermez l'assistant.
  7. Recherchez le certificat dans les porte-clés système, cliquez dessus avec le bouton droit de la souris> obtenir des informations (ou double-cliquez dessus)
  8. Développez la confiance, définissez la signature de code pour toujours faire confiance
  9. Redémarrez taskgated dans le terminal: killall taskgated
  10. Exécuter codesign -fs gdbc /usr/local/bin/gdbdans le terminal: cela demande le mot de passe root
Yihe
la source
1

Ces instructions fonctionnent pour OSX High Sierra et évitent d'exécuter gdb en tant que root (beurk!). J'ai récemment mis à jour OSX 10.13.2 vers 10.3.3. Je pense que c'est à ce moment que gdb 8.0.1 (installé avec homebrew) a commencé à échouer pour moi.

J'ai eu du mal avec les instructions des autres. Après des instructions différentes, tout était en désordre. Alors j'ai commencé une nouvelle. J'ai plus ou moins suivi ces instructions .

Nettoyez le désordre:

  1. brew uninstall --force gdb # This deletes _all_ versions of gdb on the machine
  2. Dans Applications-> Utilities-> Keychain Access, j'ai supprimé tous les certificats et clés gdb précédents (assurez-vous de savoir ce que vous faites ici!). On ne sait pas si cela est nécessaire, mais comme j'avais essayé de créer ces certificats et clés en utilisant d'autres instructions, je les ai quand même éliminés. J'avais des clés et des certificats à la fois dans la connexion et dans le système.

Maintenant, réinstallez gdb.

  1. brew install gdb
  2. À l'intérieur Keychain Access, allez dans le menu Keychain Access-> Certificate Assistant->Create a Certificate
  3. Cochez "Permettez-moi de remplacer les valeurs par défaut" et définissez
Name : gdb-cert
Identity Type: Self Signed Root
Certificate Type : Code Signing

[X] Let me override defaults
  1. Sur la première page d'informations sur le certificat:
Serial Number : 1
Validity Period (days): 3650
  1. Sur la 2ème page d'informations sur le certificat, j'ai laissé tous les champs vides sauf ceux déjà remplis.

  2. Sur la page Informations sur la paire de clés, j'ai laissé les valeurs par défaut

Key Size : 2048
Algorithm : RSA
  1. Sur la page Extension d'utilisation de clé, j'ai laissé les valeurs par défaut cochées.
[X] Include Key Usage Extension
[X] This extension is critical
Capabilities:
[X] Signature
  1. Sur la page Extended Key Usage Extension, j'ai laissé les valeurs par défaut cochées.
[X] Include Extended Key Usage Extension
[X] This extension is critical
Capabilities:
[X] Code Signing
  1. Sur la page d'extension des contraintes de base, rien n'a été vérifié (par défaut).

  2. Sur la page Extension de nom alternatif du sujet, j'ai laissé la valeur par défaut cochée et je n'ai rien ajouté d'autre.

[X] Include Subject Alternate Name Extension
  1. Sur Spécifier un emplacement pour la page de certificat, je définis
Keychain: System
  1. J'ai cliqué sur Créer et j'ai été invité à entrer mon mot de passe.

  2. De retour dans l' Keychain Accessapplication, je suis allé Systemet j'ai cliqué avec le bouton droit sur gdb-certet sous le menu déroulant Trust, j'ai changé tous les champs en Always Trust.

  3. Ordinateur redémarré.

  4. Au terminal, j'ai couru codesign -s gdb-cert /usr/local/bin/gdb. J'ai entré mon mot de passe à l'invite.

  5. Au terminal, j'ai couru echo "set startup-with-shell off" >> ~/.gdbinit

  6. J'ai couru gdb myprogram, puis startdans la console gdb. Ici, je crois, cela m'a demandé mon mot de passe. Après cela, toutes les exécutions suivantes, il n'a pas demandé mon mot de passe.

irritable_phd_syndrom
la source
Malheureusement, j'ai fait la réponse la plus votée et votre réponse, et je vois toujours le même message d'erreur. J'ai macOS Catalina version 10.15.4 et gdb 9.1.
Jay Sullivan
@JaySullivan +1. J'ai aussi le même problème.
irsis
1

C'est une approche étrange mais cela a fonctionné pour moi (MacOs HighSierra 10.13.3). Installez CLion. Il est livré avec gdb. Une fois exécutez le gdb en utilisant Terminal. Copiez le programme gdb dans votre usr / local / bin /. Aucun problème de connexion, sudo etc.

Sparsh Gupta
la source
1

Suivre les instructions ici Codesign gdb sur macOS semblait résoudre ce problème, pour moi, sur macOS High Sierra (10.13.3).

Gino
la source