gdb falla con el error "No se puede encontrar el puerto de tareas de Mach para el id de proceso"


138

Mi aplicación funciona bien pero gdb no puede depurarla con el siguiente error

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

Estoy en OS X Lion. La versión de GDB es

$ 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".

Creo que esta publicación puede ayudar: stackoverflow.com/questions/10221448/… .
Codie CodeMonkey

Respuestas:


64

En Snow Leopard y versiones posteriores de Mac OS, no es suficiente codificar el gdbejecutable.

Debe seguir esta guía para que funcione: http://www.opensource.apple.com/source/lldb/lldb-69/docs/code-signing.txt

La guía explica cómo hacerlo lldb, pero el proceso es exactamente el mismo gdb.


12
Esas instrucciones no me funcionaron en OSX 10.9.2 con MacPorts, pero esto sí: sourceware.org/gdb/wiki/BuildingOnDarwin
simpleuser

¡Funciona! Pero, ¿puedes explicar qué hace la sudo security add-trustlínea? ¿Puedo eliminar el .cerarchivo de mi escritorio ahora?
Sreejith Ramakrishnan

9
codesign -s gdb_codesign `which gdb` ayuda después de esta guía
sintetizador

O sudo codesign -s gdb_codesign `which gdb-apple` en macOS sierra.
sdive

3
Para el último sistema operativo, el enlace funcionó
yuxuan

144

¡Funciona cuando me cambio a sudo gdb executableFileName! :)


2
Gracias. Esta firma de código plus era necesaria para que gdb funcionara. Le di acceso a gdb root (como se describe aquí stackoverflow.com/questions/10476154/… ), así que no tuve que escribir sudo cada vez. Editar - Encontré un mejor enfoque aquí: stackoverflow.com/a/10441587/305149
Aneil Mallavarapu

14
Ejecutarlo como root? ¿En serio? La peor "solución".
Equidamoid

77
@Equidamoid ¿Por qué sería tan malo ejecutarlo gdbcomo root? Solo tenía curiosidad porque es solo un depurador.
ESTE USUARIO NECESITA AYUDA

¿Qué pasaría si lo ejecutas como root? Es el código que escribió, y no entiendo las consecuencias
HIELO FRÍO

44
@COLDICE en general, no desea ejecutar procesos con privilegios escalados (especialmente escalados a la parte superior como raíz) ya que en general no necesitan acceso para modificar cosas en el sistema o abrir puertos inferiores a 1024 (pueden ser puertos más altos utilizado por usuarios que no son del sistema / no root). Incluso si "confía" en su propio código, no significa que no haya cometido un error que lo provoque rm -rf /o algo similarmente destructivo en el que sobrescribe algunas configuraciones / binarios en los que se basa su computadora para arrancar y operar normalmente.
shaunhusain

32

Necesita crear un certificado y firmar gdb:

  • Abra la aplicación "Keychain Access" (/ Aplicaciones / Utilidades / Keychain Access.app)
  • Abrir menú / Acceso a llavero / Asistente de certificado / Crear un certificado ...
  • Elija un nombre (gdb-cert en el ejemplo), establezca "Tipo de identidad" en "Raíz autofirmado", establezca "Tipo de certificado" en "Firma de código" y seleccione "Permitir anular valores predeterminados". Haga clic en "Continuar". Es posible que desee extender el período predefinido de 365 días a 3650 días.
  • Haga clic varias veces en "Continuar" hasta llegar a la pantalla "Especificar una ubicación para el certificado", luego configure "Llavero al sistema".
  • Si no puede almacenar el certificado en el llavero "Sistema", créelo en el llavero "inicio de sesión" y luego expórtelo. Luego puede importarlo al llavero "Sistema".
  • En llaveros seleccione "Sistema", y debería encontrar su nuevo certificado. Utilice el menú contextual para el certificado, seleccione "Obtener información", abra el elemento "Confianza" y configure "Firma de código" en "Confiar siempre".
  • Debe salir de la aplicación "Acceso a llavero" para usar el certificado y reiniciar el servicio "asignado" eliminando el proceso actual "asignado". Alternativamente, puede reiniciar su computadora.
  • Finalmente puedes firmar gdb:

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

    sudo ggdb ./myprog


44
tenga en cuenta que matar a taskgate no reinició el proceso. necesario para: sudo launchctl load /System/Library/LaunchDaemons/com.apple.taskgated.plist
Ben

Lo anterior se reinició con la tarea asignada, pero todavía no funcionó sin un reinicio en la sierra, lamentablemente.
Neil McGill

16

El problema es que no ha iniciado sesión como usuario root (que no desea). Debe crear un certificado para que se permita el acceso a gdb. Sigue este tutorial y deberías estar listo para comenzar ...

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

Si todo lo demás falla, solo use: sudo gdb executableFileName


44
El tutorial ilustrado aquí funcionó mejor. Solo tenía que correr codesign -s gdb-cert $(which gdb)para firmar la gdbaplicación.
cevaris

Simplemente confirmando que cualquiera que intente esto en OSX 10.12.5, debe seguir los pasos descritos en el enlace BuildingOnDarwin Y ejecutar gdb después de cambiar al usuario root.
AdjunctProfessorFalcon

7

Este enlace tenía el paso a paso más claro y detallado para que este error desapareciera.

En mi caso, tenía que tener la clave como clave del "Sistema"; de lo contrario, no funcionaba (lo cual no todas las URL mencionan).

También matar taskgatedes una alternativa viable (y más rápida) a tener que reiniciar.

También desinstalé MacPorts antes de comenzar este proceso y desinstalé el gdb actual usando brew uninstall gdb.


Esto funcionó para mí. +1 para referencia que utiliza brew.
trigoman

3

Necesitaba este comando para que funcione en El Capitan:

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


2

En MacOSX, lldb debe estar firmado por código. Las compilaciones Debug and Release están configuradas para firmar con código utilizando un certificado de firma de código llamado 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.

[Nota: - lldb se usa en mac como gdb.]


2

Aquí hay una guía realmente útil que resolvió mi problema (OSX 10.13.6).

  1. Acceso a llavero abierto
  2. En el menú, abra Acceso a llaveros> Asistente de certificados> Crear un certificado
  3. Ponle un nombre (por ejemplo, gdbc)
    • Tipo de identidad: raíz autofirmada
    • Tipo de certificado: firma de código
    • Comprobar: déjame anular los valores predeterminados
  4. Continúe hasta que le solicite: "especifique una ubicación para ..."
  5. Establecer la ubicación del llavero en Sistema
  6. Crea un certificado y un asistente cercano.
  7. Encuentre el certificado en Llaveros del sistema, haga clic derecho> obtener información (o simplemente haga doble clic en él)
  8. Expanda Confianza, configure la firma de Código para confiar siempre
  9. Reiniciar taskgated en terminal: killall taskgated
  10. Ejecutar codesign -fs gdbc /usr/local/bin/gdben terminal: esto solicita la contraseña de root

1

Estas instrucciones funcionan para OSX High Sierra y evitan ejecutar gdb como root (¡qué asco!). Recientemente actualicé de OSX 10.13.2 a 10.3.3. Creo que esto es cuando gdb 8.0.1 (instalado con homebrew) comenzó a fallar para mí.

Tuve dificultades con las instrucciones de otras personas. Después de diferentes instrucciones, todo fue un desastre. Entonces comencé un nuevo. Más o menos seguí estas instrucciones .

Limpia el desorden:

  1. brew uninstall --force gdb # This deletes _all_ versions of gdb on the machine
  2. En Applications-> Utilities-> Keychain Access, eliminé todos los certificados y claves gdb anteriores (¡asegúrese de saber lo que está haciendo aquí!). No está claro si esto es necesario, pero dado que me había equivocado tratando de crear esos certificados y claves usando otras instrucciones, los eliminé de todos modos. Tenía claves y certificados tanto en inicio de sesión como en sistema.

Ahora reinstale gdb.

  1. brew install gdb
  2. Dentro Keychain Access, ve al menú Keychain Access-> Certificate Assistant->Create a Certificate
  3. Marque "Permitir que anule los valores predeterminados" y establezca
Name : gdb-cert
Identity Type: Self Signed Root
Certificate Type : Code Signing

[X] Let me override defaults
  1. En la primera página de información del certificado:
Serial Number : 1
Validity Period (days): 3650
  1. En la segunda página de información del certificado, dejé todos los campos en blanco, excepto los que ya se completaron.

  2. En la página de información de par clave, dejé los valores predeterminados

Key Size : 2048
Algorithm : RSA
  1. En la página Key Usage Extension, dejé marcados los valores predeterminados.
[X] Include Key Usage Extension
[X] This extension is critical
Capabilities:
[X] Signature
  1. En la página Extensión de uso de clave extendida, dejé marcados los valores predeterminados.
[X] Include Extended Key Usage Extension
[X] This extension is critical
Capabilities:
[X] Code Signing
  1. En la página de extensión de restricciones básicas, no se marcó nada (predeterminado).

  2. En la página de Extensión de nombre alternativo del sujeto, dejé la opción predeterminada marcada y no agregué nada más.

[X] Include Subject Alternate Name Extension
  1. En Especificar una ubicación para la página del certificado, configuré
Keychain: System
  1. Hice clic en Crear y se me solicitó mi contraseña.

  2. De vuelta en la Keychain Accessaplicación, fui Systemy hice clic derecho en gdb-certy en el menú desplegable Trust, cambié todos los campos a Always Trust.

  3. Computadora reiniciada.

  4. En la terminal, corrí codesign -s gdb-cert /usr/local/bin/gdb. Ingresé mi contraseña cuando se me solicitó.

  5. En la terminal, corrí echo "set startup-with-shell off" >> ~/.gdbinit

  6. Corrí gdb myprogramy luego startdentro de la consola gdb. Aquí, creo, me solicitó mi contraseña. Después de eso, en todas las ejecuciones posteriores, no solicitó mi contraseña.


Lamentablemente, hice la respuesta más votada y su respuesta, y aún veo el mismo mensaje de error. Tengo macOS Catalina versión 10.15.4 y gdb 9.1.
Jay Sullivan

@JaySullivan +1. También tengo el mismo problema.
irsis

1

Este es un enfoque extraño, pero funcionó para mí (MacOs HighSierra 10.13.3). Instalar CLion. Viene con gdb. Una vez que ejecute el gdb usando Terminal. Copie el programa gdb a su usr / local / bin /. No hay problema de inicio de sesión, sudo, etc.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.