“Por favor, compruebe que gdb esté firmado en código - consulte taskgated (8)” - ¿Cómo instalar gdb con el código homebrew firmado?

107

Estoy bajo osx 10.8.4 y he instalado gdb 7.5.1 con homebrew (la motivación es obtener un nuevo gdb con nuevas características como --with-python, etc.)

En pocas palabras, cuando ejecuto la depuración dentro de un proyecto de C ++ Eclipse, obtengo:

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

He seguido varias sugerencias para la firma de código.

Así que lo hice:

  1. Configurar el certificado
  2. Firme el gdb -> codesign -s gdb-cert / usr / local / bin / gdb

Cuando vuelvo a ejecutar la depuración en Eclipse, aparece el mismo error que el anterior "(compruebe que gdb esté codificado; consulte taskgated (8))".

Si configuro el gdb al gdb anterior (en las preferencias de gdb de Eclipse) / usr / libexec / gdb / gdb-i386-apple-darwin, la depuración se ejecuta como se esperaba.

¿Alguna solución / sugerencia por ahí?

Gracias

Pelle

pellekrogholt
fuente
¿No es esta una "función de seguridad", en otras palabras, su sistema está configurado para aceptar únicamente software que ha sido firmado oficialmente? Si es así, es de esperar que haya una manera de desactivar esa función ...
Mats Petersson
ok, gracias por sus comentarios, entiendo su punto de característica de seguridad, pero mi problema es cómo hacer la firma ... hay una publicación similar stackoverflow.com/questions/12050257/gdb-fails-on-mountain-lion que no lo hizo ' t solucionarlo para mí todavía
pellekrogholt

Respuestas:

136

Este error ocurre porque OSX implementa una política de acceso pid que requiere una firma digital para que los binarios accedan a otros procesos pids. Para habilitar el acceso de gdb a otros procesos, primero debemos firmar el código binario. Esta firma depende de un certificado en particular, que el usuario debe crear y registrarse en el sistema.

Para crear un certificado de firma de código, abra la aplicación Keychain Access. Elija el menú Acceso a llaveros -> Asistente de certificados -> Crear un certificado ...

Elija un nombre para el certificado (por ejemplo, gdb-cert), establezca el Tipo de identidad en Raíz autofirmado, establezca el Tipo de certificado en Firma de código y seleccione Permítame anular los valores predeterminados. Haga clic varias veces en Continuar hasta llegar a la pantalla Especificar una ubicación para el certificado, luego configure Llavero en Sistema.

Haga doble clic en el certificado, abra la sección Confianza y configure Firma de código en Confiar siempre. Salga de la aplicación Keychain Access.

Reinicie el servicio asignado a tareas y firme el binario.

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

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

En macOS 10.12 (Sierra) y posteriores, también debe

Use gdb 7.12.1 o posterior Además, evite que gdb use un shell para iniciar el programa a depurar. Puede usar el siguiente comando para esto dentro de gdb:

set startup-with-shell off

También puede poner este último comando en un archivo llamado .gdbinit en su directorio de inicio, en cuyo caso se aplicará automáticamente cada vez que inicie gdb

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

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

maximizador
fuente
6
Funciona de maravilla. Gracias.
pceccon
14
Como señaló el OP, esto no funcionó para él (y para mí tampoco).
PVitt
6
Parece que no funciona macOS Sierracon certificados autofirmados.
loretoparisi
sudo killall taskgatedes la clave para resolver mi problema
Karthikeyan Vaithilingam
Seguí los pasos con precisión, y esto funcionó muy bien para mí en macOS Sierra.
jdg
29

Hice que gdb funcionara en OSX 10.9 sin codificar de esta manera (descrito aquí ):

  1. Instale gdb con macports. (puede ser que puedas omitirlo)

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

    cambie la cadena de opciones de -sa -spen la línea 22, col 27.

  3. Reinicia la computadora.

  4. Utilice gdb. Si lo instaló con puertos mac, debe usar el ggdbcomando. O hizo un alias en su archivo de configuración:

alias gdb='ggdb'

y use el comando 'gdb' entonces.

klm123
fuente
Me había estado encontrando con este problema por un tiempo y había encontrado que otros procedimientos no eran útiles. Funcionó como por arte de magia.
Bill DeRose
@BillDeRose, lo mismo para mí.
klm123
@nimrodm, ¿te refieres a "sudo gdb"? debería ser "ggdb" con macports
klm123
1
Ugh. No quiero tener que correr gdbcomo sudo. Eso parece un riesgo de seguridad innecesario.
Autumnsault
2
No voy a reiniciar la computadora. ¡Debe haber un comando para reiniciar algo!
Michael
27

Actualicé gdb 8.3y no pude hacer que las cosas funcionaran. Esto me ayudó:

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

Donde el contenido de gdb.xmles:

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

Encontré esta solución aquí: https://timnash.co.uk/getting-gdb-to-semi-reliably-work-on-mojave-macos/

Nota: Sin el derecho, gdbsolo pude ejecutar sudo.

Johnny Thunderman
fuente
2
¿Qué haces si obtienes?error: The specified item could not be found in the keychain.
Sridhar Sarnobat
@SridharSarnobat Use la canalización primero de esta respuesta stackoverflow.com/a/32727069/339146
Panayotis
Falló después de probar la respuesta de @maximser. Entonces esto funciona para mí. macOS 10.15.4, gdb 9.2 instalado a través de brew.
weaming
@SridharSarnobat: Primero debe crear el certificado stackoverflow.com/questions/35020236/…
Akansha
26

Experimenté el mismo problema con GDB. Estoy corriendo bajo el Mac OS X 10.8.5también conocido como Mountain Lion. Estoy usando la versión GDB 7.7.1.

Compilé mi programa de prueba con el siguiente comando:

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

Si ingresé el comando gdb sample.out, obtengo el mismo mensaje de error críptico:

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

Sin embargo, este mensaje de error es una pista falsa.

La solución que encontré que funcionó para mí fue simplemente invocar GDB usando la cuenta de superusuario:

sudo gdb sample.out. 

Eso funciona bien para mí.

Y que desde ese punto pude ejecutar GDB example.out sin usar sudo.

Espero que esto ayude y funcione para otros. RSVP si no lo hace.

mickster99
fuente
1
No estoy seguro de por qué se votó en contra. Ejecuté el comando como root (con sudo) y funcionó.
iPrograma
6

Nada de esto funcionó para mí y tuve que ir con una carrera larga. Aquí hay una lista completa de los pasos que he realizado para que funcione.

  1. Cree un certificado para firmar el gdb.

Desafortunadamente, el certificado del sistema me dio, lo Unknown Error = -2,147,414,007cual es muy útil, así que tuve que buscar una solución. KeyChain Assistant -> Create certificate ->

Recoger login, gdb-cert,Code Signing

Copie / mueva el certificado al llavero del sistema (ingrese la contraseña)

  1. Seleccione certificado ( gdb-cert) haga clic en Get info->Trust Always
  2. Inhabilitar startup-with-shell

Entrar en consola: set startup-with-shell off

Recuerde la configuración: echo "set startup-with-shell off" >> ~/. gdbinit

  1. Habilitar usuario raíz

Vaya a System Preferences-> Users & Groups-> Unlock it-> Login Options-> Network Account Server-> Join-> Unlock it-> Edit(menú) ->Enable Root User

  1. sudo killall taskgated
  2. Finalmente firme gdb

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

  1. Deshabilitar usuario raíz (paso 4)
  2. Reinicie si aún no funciona. (si nada más funciona, lo más probable es que ya funcione)

PD. Termino usando lldbporque simplemente funciona ( tutorial )

Taras Matsyk
fuente
5

Para cualquiera que use Sierra 10.12.6 (y superior) y Homebrew, /usr/local/bin/gdbhay un enlace simbólico a /usr/local/Cellar/gdb/8.0/bin/gdb(o cualquier versión, por ejemplo 8.0.1).

Debe codificar tanto el enlace como el destino:

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

O, si tiene greadlink(instalado a través de brew install coreutils):

codesign -fs gdb-cert $(which gdb)
codesign -fs gdb-cert $(greadlink -f $(which gdb))
Larry Song
fuente
1
¿Intentaste esto en High Sierra? No funcionó para mí en O / S: 10.13.6
rustyMagnet
3

Me pregunto si el cambio global en la respuesta más votada aquí tiene algunas consecuencias no deseadas.

En lugar de habilitar la antigua convención de Tiger, taskgated permite ejecutar código firmado. Por lo tanto, podría ser mejor obtener un certificado firmado para gdb, similar a la respuesta aquí .

Después de esto, pude sudousar gdb. Si necesitas usar gdb sin sudo, entonces quizás este enlace te ayude , descargo de responsabilidad, todavía no lo he probado porque usarlo sudoes una buena solución por ahora.

JnBrymn
fuente
3

Esto puede no estar relacionado. Puede usar lldb en macos en lugar de gdb. No necesita esta molestia para instalar gdb.

lldb ( http://lldb.llvm.org ) ya está instalado por defecto en High Sierra

Kaituo Li
fuente
0

Puedo recomendar seguir esta esencia: https://gist.github.com/gravitylow/fb595186ce6068537a6e9da6d8b5b96d#file-codesign_gdb-md

Con truco para superar: unknown error = -2,147,414,007durante la creación del certificado que se describe aquí: https://apple.stackexchange.com/a/309123

Notas:

La ruta para gdb instalado como homebrewpaquete debería ser algo como:/usr/local/Cellar/gdb/9.2/bin/gdb

Y csrutil enable --without debugprovocará un mensaje sobre requesting unsupported configuration, como aquí: https://totalfinder.binaryage.com/system-integrity-protection

Prueba:

  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};
Iurii Vasylenko
fuente
-1

gdb 8,3;

Mi problema es el mismo que el del chico de arriba, resuelto por

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