c++ - "Compruebe que gdb está codificado-vea taskgated(8)"-¿Cómo se instaló gdb con el código de homebrew firmado?
eclipse macos (7)
Estoy bajo osx 10.8.4 y he instalado gdb 7.5.1 con homebrew (motivación para obtener un nuevo gdb con nuevas funciones como --with-python, etc ...)
Para resumir, 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
- https://sourceware.org/gdb/wiki/BuildingOnDarwin
- en parte http://www.noktec.be/archives/1251 con varios ajustes
Así que lo hice:
- Configura el certificado
- Firme el gdb -> codesign -s gdb-cert / usr / local / bin / gdb
Cuando vuelvo a ejecutar la depuración en Eclipse obtengo el mismo error que el anterior "(compruebe que gdb esté codificado - vea taskgated (8))".
Si restablezco 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
Este error se produce 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 codificar el signo del binario. Esta firma depende de un certificado particular, que el usuario debe crear y registrar con el sistema.
Para crear un certificado de firma de código, abra la aplicación de acceso de llavero. Elija el menú Acceso a Llaveros -> Asistente de Certificado -> Crear un Certificado ...
Elija un nombre para el certificado (p. Ej., Gdb-cert), establezca Identity Type en Self-Signed Root, establezca Certificate Type en Code Signing y seleccione la opción Allow anride defaults. Haga clic varias veces en Continuar hasta que llegue a la pantalla Especificar una ubicación para el certificado, luego configure Keychain en System.
Haga doble clic en el certificado, abra la sección Trust y establezca la firma de código en Always Trust. Salga de la aplicación de Acceso a Llaveros.
Reinicie el servicio de taskgated 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 más tarde, también debe
Use gdb 7.12.1 o posterior. Además, evite que gdb use un intérprete de comandos para iniciar la depuración del programa. Puede usar el siguiente comando para esto dentro de gdb:
set startup-with-shell off
También puede colocar 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
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
Experimenté el mismo problema con GDB. Estoy corriendo bajo Mac OS X 10.8.5
aka Mountain Lion. Estoy usando la versión 7.7.1
GDB.
Recopilé mi programa de prueba con el siguiente comando:
g++ -o gdb-sample.out -g gdb-sample.cpp
Si gdb sample.out
el comando gdb sample.out
, recibo 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 el acuse de superusuario:
sudo gdb sample.out.
Eso funciona bien para mí.
Y que desde ese punto podría ejecutar GDB example.out sin usar sudo.
Espero que esto ayude y funcione para otros. Confirme si no lo hace.
Hice que gdb funcionara en OSX 10.9 sin necesidad de codificar de esta manera (que se describe here ):
Instala gdb con macports. (puede ser que se lo salte)
sudo nano /System/Library/LaunchDaemons/com.apple.taskgated.plist
cambie la cadena de opciones de
-s
a-sp
en la línea 22, col 27.reinicia la computadora.
Use gdb. Si lo instaló con puertos Mac, entonces debe usar el comando ''ggdb''. O hizo un alias en su archivo de configuración:
alias gdb = ''ggdb''
y luego use el comando ''gdb''.
Me pregunto si el cambio global en la respuesta más votado 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, sería mejor obtener un certificado firmado para gdb, similar a la respuesta aquí .
Después de esto, pude sudo
usar gdb. Si necesita usar gdb sin sudo, quizás este enlace ayude , descargo de responsabilidad, aún no lo he probado porque el uso de sudo
es una solución válida por ahora.
Nada de esto funcionó para mí y tuve que irme con una carrera larga. Aquí hay una lista completa de los pasos que he hecho para que funcione.
- Crea un certificado para firmar el gdb.
Desafortunadamente, el certificado del sistema me dio Unknown Error = -2,147,414,007
que es muy útil, así que tuve que ir con una solución alternativa. KeyChain Assistant -> Create certificate ->
Seleccione login
, gdb-cert
, Code Signing
Copie / mueva el certificado al llavero del sistema (ingrese la contraseña)
- Seleccionar certificado (
gdb-cert
) haga clic enGet info
->Trust Always
- Deshabilitar
startup-with-shell
Ingrese en la consola: set startup-with-shell off
Recuerde la configuración: echo "set startup-with-shell off" >> ~/. gdbinit
echo "set startup-with-shell off" >> ~/. gdbinit
- 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
-
sudo killall taskgated
- Finalmente, firme gdb
codesign -fs gdb-cert "$(which gdb)"
- Deshabilitar usuario raíz (paso 4)
- Reinicie si todavía no funciona. (si nada más funciona, lo más probable es que ya funcione)
PD. lldb
usando lldb
porque simplemente funciona ( tutorial )
Para cualquiera que use Sierra 10.12.6 (y superior) y Homebrew, /usr/local/bin/gdb
es un enlace simbólico a /usr/local/Cellar/gdb/8.0/bin/gdb
(o cualquier versión, por ejemplo, 8.0.1
).
Necesita codificar el enlace y el objetivo:
codesign -fs gdb-cert /usr/local/bin/gdb
codesign -fs gdb-cert "/usr/local/Cellar/gdb/8.0/bin/gdb"
O bien, 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))