"Bitte überprüfen Sie, ob gdb codiert ist - siehe taskgated (8)" - Wie wird gdb mit signiertem Homebrew-Code installiert?


107

Ich bin unter OSX 10.8.4 und habe GDB 7.5.1 mit Homebrew installiert (Motivation, eine neue GDB mit neuen Funktionen wie --with-Python usw. zu bekommen ...)

Lange Rede, kurzer Sinn, wenn ich ein Debugging in einem C ++ - Eclipse-Projekt ausführe, bekomme ich:

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

Ich habe verschiedene Vorschläge zur Codesignatur befolgt

So tat ich:

  1. Richten Sie das Zertifikat ein
  2. Signieren Sie die gdb -> Codesign -s gdb-cert / usr / local / bin / gdb

Wenn ich das Debuggen in Eclipse erneut ausführe, erhalte ich den gleichen Fehler wie oben "(Bitte überprüfen Sie, ob gdb mit einem Codesign versehen ist - siehe taskgated (8))".

Wenn ich die GDB auf die ältere GDB zurücksetze (in den GDB-Einstellungen von Eclipse) / usr / libexec / gdb / gdb-i386-apple-darwin, wird das Debugging wie erwartet ausgeführt.

Irgendwelche Lösungen / Hinweise da draußen?

Vielen Dank

Pelle


Ist dies keine "Sicherheitsfunktion" - mit anderen Worten, Ihr System ist so konfiguriert, dass nur Software akzeptiert wird, die offiziell signiert wurde? Wenn ja, gibt es hoffentlich eine Möglichkeit, diese Funktion auszuschalten ...
Mats Petersson

ok, danke für dein Feedback - ich verstehe deinen Sicherheitsmerkmalspunkt, aber mein Problem ist dann, wie man signiert ... es gibt einen ähnlichen Beitrag stackoverflow.com/questions/12050257/gdb-fails-on-mountain-lion, der es nicht getan hat. Ich löse es noch nicht für mich
Pellekrogholt

Antworten:


136

Dieser Fehler tritt auf, weil OSX eine PID-Zugriffsrichtlinie implementiert, für die Binärdateien eine digitale Signatur benötigen, um auf PIDs anderer Prozesse zugreifen zu können. Um den GDB-Zugriff auf andere Prozesse zu ermöglichen, müssen wir zuerst die Binärdatei mit einem Code signieren. Diese Signatur hängt von einem bestimmten Zertifikat ab, das der Benutzer erstellen und beim System registrieren muss.

Öffnen Sie die Anwendung Keychain Access, um ein Codesignaturzertifikat zu erstellen. Wählen Sie das Menü Schlüsselbundzugriff -> Zertifikatassistent -> Zertifikat erstellen…

Wählen Sie einen Namen für das Zertifikat (z. B. gdb-cert), setzen Sie Identity Type auf Self Signed Root, setzen Sie Certificate Type auf Code Signing und wählen Sie die Standardeinstellung Let me override. Klicken Sie mehrmals auf Weiter, bis Sie zum Bildschirm Speicherort für das Zertifikat angeben gelangen, und setzen Sie den Schlüsselbund auf System.

Doppelklicken Sie auf das Zertifikat, öffnen Sie den Abschnitt "Vertrauen" und setzen Sie die Codesignatur auf "Immer vertrauen". Beenden Sie die Anwendung Keychain Access.

Starten Sie den Taskgated-Dienst neu und signieren Sie die Binärdatei.

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

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

Unter macOS 10.12 (Sierra) und höher müssen Sie dies ebenfalls tun

Verwenden Sie gdb 7.12.1 oder höher. Verhindern Sie außerdem, dass gdb eine Shell verwendet, um das zu debuggende Programm zu starten. Sie können den folgenden Befehl in gdb verwenden:

set startup-with-shell off

Sie können diesen letzten Befehl auch in eine Datei mit dem Namen .gdbinit in Ihrem Home-Verzeichnis einfügen. In diesem Fall wird er bei jedem Start von gdb automatisch angewendet

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

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


6
Klappt wunderbar. Danke dir.
Pceccon

14
Wie der OP betonte, hat dies für ihn (und für mich auch nicht) nicht geholfen.
PVitt

6
Es scheint, dass es macOS Sierramit selbstsignierten Zertifikaten nicht funktioniert .
Loretoparisi

sudo killall taskgatedist der Schlüssel zur Lösung meines Problems
Karthikeyan Vaithilingam

Ich habe die Schritte genau befolgt und dies hat unter macOS Sierra wunderbar für mich funktioniert.
JDG

29

Ich habe gdb unter OSX 10.9 zum Laufen gebracht, ohne auf diese Weise zu codieren ( hier beschrieben ):

  1. Installieren Sie gdb mit macports. (Vielleicht können Sie es überspringen)

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

    Ändern Sie die Optionszeichenfolge von -sin -spZeile 22, Spalte 27.

  3. Starten Sie den Computer neu.

  4. Verwenden Sie gdb. Wenn Sie es mit Mac-Ports installiert haben, müssen Sie den ggdbBefehl verwenden. Oder haben Sie einen Alias ​​in Ihrer Konfigurationsdatei erstellt:

alias gdb='ggdb'

und verwenden Sie dann den Befehl 'gdb'.


Ich war schon eine Weile auf dieses Problem gestoßen und hatte andere Anleitungen als nicht hilfreich empfunden. Das hat wie ein Zauber gewirkt.
Bill DeRose

@ BillDeRose, das gleiche für mich.
klm123

@nimrodm, meinst du "sudo gdb"? es sollte "ggdb" mit macports sein
klm123

1
Pfui. Ich möchte nicht laufen müssen gdbals sudo. Das scheint ein unnötiges Sicherheitsrisiko zu sein.
Autumnsault

2
Der Computer wird nicht neu gestartet. Es muss einen Befehl geben, um etwas neu zu starten!
Michael

27

Ich habe ein Upgrade auf durchgeführt gdb 8.3und konnte die Dinge nicht zum Laufen bringen. Das hat mir geholfen:

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

Wo Inhalt von gdb.xmlist:

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

Ich habe diese Lösung hier gefunden: https://timnash.co.uk/getting-gdb-to-semi-reliably-work-on-mojave-macos/

Hinweis: Ohne die Berechtigung konnte ich gdbnur mit ausführen sudo.


2
Was machst du, wenn duerror: The specified item could not be found in the keychain.
Sridhar Sarnobat

@SridharSarnobat Verwenden Sie zuerst die Pipeline dieser Antwort stackoverflow.com/a/32727069/339146
Panayotis

Fehlgeschlagen, nachdem die Antwort von @maximser versucht wurde. Dann funktioniert das bei mir. macOS 10.15.4, gdb 9.2 über brau installiert.
Weaming

@SridharSarnobat: Sie müssen das Zertifikat zuerst erstellen stackoverflow.com/questions/35020236/…
Akansha

26

Ich habe das gleiche Problem mit GDB erlebt. Ich laufe unter Mac OS X 10.8.5aka Mountain Lion. Ich benutze die GDB-Version 7.7.1.

Ich habe mein Testprogramm mit folgendem Befehl kompiliert:

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

Wenn ich den Befehl eingegeben gdb sample.outhabe, wird dieselbe kryptische Fehlermeldung angezeigt:

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

Diese Fehlermeldung ist jedoch ein roter Hering.

Die Lösung, die für mich funktioniert hat, bestand darin, GDB einfach mit dem Superuser-Konto aufzurufen:

sudo gdb sample.out. 

Das funktioniert gut für mich.

Und von diesem Punkt an konnte ich GDB example.out ausführen, ohne sudo zu verwenden.

Hoffe das hilft und funktioniert für andere. RSVP wenn nicht.


1
Ich bin mir nicht sicher, warum dies abgelehnt wurde. Ich habe den Befehl als root (mit sudo) ausgeführt und es hat funktioniert.
iProgramm

6

Nichts davon funktionierte für mich und ich musste auf lange Sicht gehen. Hier ist eine vollständige Liste der Schritte, die ich unternommen habe, um es zum Laufen zu bringen.

  1. Erstellen Sie ein Zertifikat, um die GDB zu signieren.

Leider gab mir Unknown Error = -2,147,414,007das Systemzertifikat, was sehr hilfreich ist, so dass ich eine Problemumgehung durchführen musste. KeyChain Assistant -> Create certificate ->

Wählen Sie login, gdb-cert,Code Signing

Zertifikat in den Systemschlüsselbund kopieren / verschieben (Passwort eingeben)

  1. Zertifikat auswählen ( gdb-cert) Klicken Sie auf Get info->Trust Always
  2. Deaktivieren startup-with-shell

In Konsole eingeben: set startup-with-shell off

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

  1. Root-Benutzer aktivieren

Gehen Sie zu System Preferences-> Users & Groups-> Unlock it-> Login Options-> Network Account Server-> Join-> Unlock it-> Edit(Menü) ->Enable Root User

  1. sudo killall taskgated
  2. Zum Schluss gdb unterschreiben

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

  1. Root-Benutzer deaktivieren (Schritt 4)
  2. Starten Sie neu, wenn dies immer noch nicht funktioniert. (Wenn nichts anderes funktioniert, funktioniert es höchstwahrscheinlich bereits)

PS. Ich benutze am Ende, lldbweil es einfach funktioniert ( Tutorial )


5

Für alle, die Sierra 10.12.6 (und höher) und Homebrew verwenden, /usr/local/bin/gdbist dies ein symbolischer Link zu /usr/local/Cellar/gdb/8.0/bin/gdb(oder einer anderen Version, z 8.0.1. B. ).

Sie müssen sowohl den Link als auch das Ziel codieren:

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

Oder wenn Sie greadlink(installiert über brew install coreutils):

codesign -fs gdb-cert $(which gdb)
codesign -fs gdb-cert $(greadlink -f $(which gdb))

1
Hast du das in High Sierra versucht? Es funktionierte nicht für mich auf O / S: 10.13.6
rustyMagnet

3

Ich frage mich, ob der globale Wandel in der Antwort mit der höchsten Stimmenzahl einige unbeabsichtigte Konsequenzen hat.

Anstatt die alte Tiger-Konvention zu aktivieren, kann mit taskgated signierter Code ausgeführt werden. Daher ist es möglicherweise besser, nur ein signiertes Zertifikat für gdb zu erhalten, ähnlich der Antwort hier .

Danach konnte ich sudogdb verwenden. Wenn Sie gdb ohne sudo verwenden müssen, hilft dieser Link vielleicht , Haftungsausschluss, ich habe es noch nicht ausprobiert, da die Verwendung sudovorerst eine gute Lösung ist.


3

Dies kann nicht verwandt sein. Sie können lldb auf macos anstelle von gdb verwenden. Sie brauchen diesen Aufwand nicht, um gdb zu installieren.

lldb ( http://lldb.llvm.org ) ist in High Sierra bereits standardmäßig installiert


0

Ich kann empfehlen, diesem Kern zu folgen: https://gist.github.com/gravitylow/fb595186ce6068537a6e9da6d8b5b96d#file-codesign_gdb-md

Mit Trick zu überwinden: unknown error = -2,147,414,007während der Zertifikatserstellung hier beschrieben: https://apple.stackexchange.com/a/309123

Anmerkungen:

Der Pfad für die als homebrewPaket installierte GDB sollte ungefähr so lauten:/usr/local/Cellar/gdb/9.2/bin/gdb

Und csrutil enable --without debugwird eine Nachricht verursachen requesting unsupported configuration, wie hier: https://totalfinder.binaryage.com/system-integrity-protection

Prüfung:

  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};

-1

gdb 8,3;

Mein Problem ist das gleiche wie der Typ oben, gelöst von

codesign --entitlements gdb.xml -fs gdb-cert /usr/local/bin/gdb
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.