gdb schlägt mit dem Fehler "Mach-Task-Port für Prozess-ID kann nicht gefunden werden" fehl

138

Meine App läuft einwandfrei, aber gdb kann sie nicht mit dem folgenden Fehler debuggen

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

Ich bin auf OS X Lion. GDB-Version ist

$ 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
quelle
Ich denke, dieser Beitrag kann helfen: stackoverflow.com/questions/10221448/… .
Codie CodeMonkey

Antworten:

64

In Snow Leopard und späteren Mac OS-Versionen reicht es nicht aus, die gdbausführbare Datei zu codieren .

Sie müssen diesem Handbuch folgen, damit es funktioniert: http://www.opensource.apple.com/source/lldb/lldb-69/docs/code-signing.txt

In der Anleitung wird erklärt, wie es geht lldb, aber der Vorgang ist genau der gleiche gdb.

Tyilo
quelle
12
Diese Anweisungen funktionierten nicht für mich unter OSX 10.9.2 mit MacPorts, aber dies tat: sourceware.org/gdb/wiki/BuildingOnDarwin
simpleuser
Es klappt! Aber können Sie bitte erklären, was die sudo security add-trustLeitung tut? Kann ich die .cerDatei jetzt von meinem Desktop löschen ?
Sreejith Ramakrishnan
9
codesign -s gdb_codesign `which gdb` hilft nach dieser Anleitung
Synther
Oder sudo codesign -s gdb_codesign `which gdb-apple` auf macOS sierra.
Tauchen
3
Für das neueste Betriebssystem funktionierte Link
Yuxuan
144

Es funktioniert, wenn ich zu wechsle sudo gdb executableFileName! :) :)

Mengyuan
quelle
2
Vielen Dank. Diese Plus-Codesignatur war erforderlich, damit gdb funktioniert. Ich habe gdb root-Zugriff gewährt (wie hier beschrieben, stackoverflow.com/questions/10476154/… ), damit ich nicht jedes Mal sudo eingeben musste . Bearbeiten - Hier einen besseren Ansatz gefunden: stackoverflow.com/a/10441587/305149
Aneil Mallavarapu
14
Als root ausführen? Sind Sie im Ernst? Die schlechteste "Lösung".
Equidamoid
7
@Equidamoid Warum sollte es so schlecht sein, gdbals Root zu laufen ? Ich war nur neugierig, weil es nur ein Debugger ist.
DIESER BENUTZER BRAUCHT HILFE
Was würde passieren, wenn Sie es als Root ausführen? Es ist der Code, den Sie geschrieben haben, und ich verstehe die Konsequenzen nicht
COLD ICE
4
@COLDICE Im Allgemeinen möchten Sie keine Prozesse mit eskalierten Berechtigungen ausführen (insbesondere als Root nach oben eskaliert), da sie im Allgemeinen keinen Zugriff benötigen, um Änderungen am System vorzunehmen oder Ports unter 1024 zu öffnen (höhere Ports können sein) von Nicht-System- / Nicht-Root-Benutzern verwendet). Selbst wenn Sie Ihrem eigenen Code "vertrauen", bedeutet dies nicht, dass Sie keinen Fehler gemacht haben, der ihn verursacht, rm -rf /oder etwas ähnlich Zerstörerisches, bei dem Sie einige Konfigurationen / Binärdateien überschreiben, auf die sich Ihr Computer stützt, um normal zu starten und zu arbeiten.
Shaunhusain
32

Sie müssen ein Zertifikat erstellen und gdb signieren:

  • Öffnen Sie die Anwendung "Schlüsselbundzugriff" (/ Applications / Utilities / Keychain Access.app).
  • Menü öffnen / Schlüsselbundzugriff / Zertifikatassistent / Zertifikat erstellen ...
  • Wählen Sie einen Namen (im Beispiel gdb-cert), setzen Sie "Identity Type" auf "Self Signed Root", setzen Sie "Certificate Type" auf "Code Signing" und wählen Sie "Let me override defaults". Klicken Sie auf "Weiter". Möglicherweise möchten Sie den vordefinierten Zeitraum von 365 Tagen auf 3650 Tage verlängern.
  • Klicken Sie mehrmals auf "Weiter", bis Sie zum Bildschirm "Speicherort für das Zertifikat angeben" gelangen, und setzen Sie dann "Schlüsselbund auf System".
  • Wenn Sie das Zertifikat nicht im Schlüsselbund "System" speichern können, erstellen Sie es im Schlüsselbund "Login" und exportieren Sie es. Sie können es dann in den Schlüsselbund „System“ importieren.
  • Wählen Sie in Schlüsselketten "System" und Sie sollten Ihr neues Zertifikat finden. Verwenden Sie das Kontextmenü für das Zertifikat, wählen Sie "Info abrufen", öffnen Sie das Element "Vertrauen" und setzen Sie "Codesignatur" auf "Immer vertrauen".
  • Sie müssen die Anwendung "Schlüsselbundzugriff" beenden, um das Zertifikat verwenden und den "Taskgated" -Dienst neu starten zu können, indem Sie den aktuell ausgeführten "Taskgated" -Prozess beenden. Alternativ können Sie Ihren Computer neu starten.
  • Endlich können Sie gdb unterschreiben:

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

    sudo ggdb ./myprog

qed
quelle
4
Das Töten von Taskgated wurde nicht neu gestartet. benötigt, um: sudo launchctl load /System/Library/LaunchDaemons/com.apple.taskgated.plist
Ben
Das oben genannte Taskgated wurde neu gestartet - aber ohne einen Neustart auf Sierra funktionierte es leider immer noch nicht.
Neil McGill
16

Das Problem ist, dass Sie nicht als Root-Benutzer angemeldet sind (was Sie nicht möchten). Sie müssen ein Zertifikat erstellen, damit gdb Zugriff erhält. Folgen Sie diesem Tutorial und Sie sollten bereit sein zu gehen ...

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

Wenn alles andere fehlschlägt, verwenden Sie einfach: sudo gdb executableFileName

Sam Ruberti
quelle
4
Das hier abgebildete Tutorial hat am besten funktioniert. Musste nur laufen, codesign -s gdb-cert $(which gdb)um die gdbApp zu signieren .
Cevaris
Wenn Sie dies nur für jeden bestätigen, der dies unter OSX 10.12.5 versucht, müssen Sie beide die im BuildingOnDarwin-Link beschriebenen Schritte ausführen UND gdb ausführen, nachdem Sie zum Root-Benutzer gewechselt sind.
AdjunctProfessorFalcon
7

Dieser Link hatte die klarste und detaillierteste Schritt-für-Schritt-Anleitung, damit dieser Fehler für mich verschwindet.

In meinem Fall musste ich den Schlüssel als "System" -Schlüssel haben, sonst funktionierte er nicht (was nicht in jeder URL erwähnt wird).

Auch das Töten taskgatedist eine praktikable (und schnellere) Alternative zum Neustart.

Ich habe auch MacPorts deinstalliert, bevor ich diesen Prozess gestartet und die aktuelle GDB mit deinstalliert habe brew uninstall gdb.

Hans Roggeman
quelle
Das hat bei mir funktioniert. +1 als Referenz, die verwendet brew.
Trigoman
3

Ich brauchte diesen Befehl, damit er auf El Capitan funktioniert:

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

Ich habe dieses Tutorial befolgt und alles ist in Ordnung.

ray6080
quelle
2

Unter MacOSX muss lldb mit einem Code signiert sein. Die Builds Debug und Release sind so eingestellt, dass sie ein Codesignaturzertifikat mit dem Namen lldb_codesign signieren.

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.

[Hinweis: - lldb wird in mac als gdb verwendet.]

Bhupesh Pant
quelle
2

Hier ist eine wirklich nützliche Anleitung, die mein Problem gelöst hat (OSX 10.13.6).

  1. Öffnen Sie den Schlüsselbundzugriff
  2. Öffnen Sie im Menü Schlüsselbundzugriff> Zertifikatassistent> Zertifikat erstellen
  3. Gib ihm einen Namen (zB gdbc)
    • Identitätstyp: Selbstsignierte Wurzel
    • Zertifikatstyp: Codesignatur
    • Überprüfen Sie: Lassen Sie mich die Standardeinstellungen überschreiben
  4. Fahren Sie fort, bis Sie aufgefordert werden: "Geben Sie einen Speicherort für ... an."
  5. Setzen Sie den Schlüsselbundspeicherort auf System
  6. Erstellen Sie ein Zertifikat und schließen Sie den Assistenten.
  7. Suchen Sie das Zertifikat in den System-Schlüsselanhängern, klicken Sie mit der rechten Maustaste darauf> erhalten Sie Informationen (oder doppelklicken Sie einfach darauf).
  8. Erweitern Sie Vertrauen, und setzen Sie die Codesignatur so, dass sie immer vertraut
  9. Taskgated im Terminal neu starten: killall taskgated
  10. Führen Sie codesign -fs gdbc /usr/local/bin/gdbin Terminal: Das fragt das root - Passwort
Yihe
quelle
1

Diese Anweisungen funktionieren für OSX High Sierra und vermeiden es, gdb als root auszuführen (yuck!). Ich habe kürzlich von OSX 10.13.2 auf 10.3.3 aktualisiert. Ich denke, dies war der Zeitpunkt, an dem GDB 8.0.1 (installiert mit Homebrew) für mich fehlschlug.

Ich hatte Schwierigkeiten mit den Anweisungen anderer Leute. Nach verschiedenen Anweisungen war alles ein Chaos. Also habe ich einen neuen angefangen. Ich habe diese Anweisungen mehr oder weniger befolgt .

Reinigen Sie das Chaos:

  1. brew uninstall --force gdb # This deletes _all_ versions of gdb on the machine
  2. In Applications-> Utilities-> habe Keychain Accessich alle vorherigen GDB-Zertifikate und -Schlüssel gelöscht (stellen Sie sicher, dass Sie wissen, was Sie hier tun!). Es ist unklar, ob dies notwendig ist, aber da ich versucht hatte, diese Zertifikate und Schlüssel mithilfe anderer Anweisungen zu erstellen, habe ich sie trotzdem beseitigt. Ich hatte Schlüssel und Zertifikate sowohl im Login als auch im System.

Installieren Sie jetzt gdb neu.

  1. brew install gdb
  2. Keychain AccessGehen Sie innerhalb zu Menü Keychain Access-> Certificate Assistant->Create a Certificate
  3. Aktivieren Sie "Lassen Sie mich die Standardeinstellungen überschreiben" und stellen Sie ein
Name : gdb-cert
Identity Type: Self Signed Root
Certificate Type : Code Signing

[X] Let me override defaults
  1. Auf der Seite mit den ersten Zertifikatsinformationen:
Serial Number : 1
Validity Period (days): 3650
  1. Auf der zweiten Seite mit den Zertifikatinformationen habe ich alle Felder außer den bereits ausgefüllten leer gelassen.

  2. Auf der Seite Informationen zu Schlüsselpaaren habe ich die Standardeinstellungen beibehalten

Key Size : 2048
Algorithm : RSA
  1. Auf der Seite Key Usage Extension habe ich die Standardeinstellungen aktiviert gelassen.
[X] Include Key Usage Extension
[X] This extension is critical
Capabilities:
[X] Signature
  1. Auf der Seite Extended Key Usage Extension habe ich die Standardeinstellungen aktiviert gelassen.
[X] Include Extended Key Usage Extension
[X] This extension is critical
Capabilities:
[X] Code Signing
  1. Auf der Erweiterungsseite für grundlegende Einschränkungen wurde nichts aktiviert (Standard).

  2. Auf der Seite Betreff Alternative Namenserweiterung habe ich die Standardeinstellung aktiviert und nichts anderes hinzugefügt.

[X] Include Subject Alternate Name Extension
  1. Unter Angeben eines Speicherorts für die Zertifikatseite habe ich festgelegt
Keychain: System
  1. Ich habe auf Erstellen geklickt und wurde zur Eingabe meines Passworts aufgefordert.

  2. Zurück in der Keychain AccessApp ging ich zu Systemund klickte mit der rechten Maustaste darauf gdb-certund Truständerte im Dropdown-Menü alle Felder in Always Trust.

  3. Computer neu gestartet.

  4. Am Terminal rannte ich codesign -s gdb-cert /usr/local/bin/gdb. Ich habe mein Passwort eingegeben, als ich dazu aufgefordert wurde.

  5. Am Terminal rannte ich echo "set startup-with-shell off" >> ~/.gdbinit

  6. Ich lief gdb myprogramund dann startin der GDB-Konsole. Hier, glaube ich, wurde ich aufgefordert, mein Passwort einzugeben. Danach wurde bei allen nachfolgenden Läufen nicht mehr nach meinem Passwort gefragt.

irritable_phd_syndrom
quelle
Leider habe ich sowohl die Antwort mit der höchsten Abstimmung als auch Ihre Antwort gegeben und sehe immer noch dieselbe Fehlermeldung. Ich habe macOS Catalina Version 10.15.4 und gdb 9.1.
Jay Sullivan
@ JaySullivan +1. Ich habe auch das gleiche Problem.
Irsis
1

Dies ist ein seltsamer Ansatz, aber er hat bei mir funktioniert (MacOs HighSierra 10.13.3). Installieren Sie CLion. Es kommt mit gdb. Führen Sie die GDB einmal mit Terminal aus. Kopieren Sie das GDB-Programm in Ihre usr / local / bin /. Kein Problem von Anmeldung, Sudo etc.

Sparsh Gupta
quelle
1

Das Befolgen der Anweisungen hier Codesodes gdb unter macOS schien dieses Problem für mich unter macOS High Sierra (10.13.3) zu lösen.

Gino
quelle