“Verifique se o gdb está codificado - veja taskgated (8)” - Como instalar o gdb com o código do homebrew assinado?


107

Estou no osx 10.8.4 e instalei o gdb 7.5.1 com homebrew (motivação para obter um novo gdb com novos recursos, como --with-python etc ...)

Resumindo, quando executo a depuração em um projeto Eclipse c ++, recebo:

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

Tenho seguido várias sugestões para assinatura de código

Então eu fiz:

  1. Configure o certificado
  2. Assine o gdb -> codesign -s gdb-cert / usr / local / bin / gdb

Quando executo novamente a depuração no Eclipse, recebo o mesmo erro acima "(verifique se o gdb está codificado - consulte taskgated (8))".

Se eu restaurar o gdb para o gdb mais antigo (nas preferências do gdb do Eclipse) / usr / libexec / gdb / gdb-i386-apple-darwin, a depuração será executada conforme o esperado.

Alguma solução / sugestão por aí?

THX

Pelle


Isso não é um "recurso de segurança" - em outras palavras, seu sistema está configurado para aceitar apenas software que foi oficialmente assinado? Se sim, espero que haja uma maneira de desativar esse recurso ...
— Mats Petersson

ok, obrigado por seus comentários - eu entendo seu ponto de recurso de segurança, mas meu problema é então como fazer a assinatura ... há uma postagem semelhante stackoverflow.com/questions/12050257/gdb-fails-on-mountain-lion que não não resolva para mim ainda
— pellekrogholt

Respostas:


136

Este erro ocorre porque o OSX implementa uma política de acesso pid que requer uma assinatura digital para binários acessarem outros processos pids. Para habilitar o acesso do gdb a outros processos, devemos primeiro assinar o código do binário. Essa assinatura depende de um certificado específico, que o usuário deve criar e registrar no sistema.

Para criar um certificado de assinatura de código, abra o aplicativo Keychain Access. Escolha o menu Acesso às Chaves -> Assistente de Certificado -> Criar um Certificado ...

Escolha um nome para o certificado (por exemplo, gdb-cert), defina o Tipo de identidade como Raiz autoassinada, defina o Tipo de certificado como Assinatura de código e selecione Deixe-me substituir os padrões. Clique várias vezes em Continuar até chegar à tela Especificar um local para o certificado e defina as Chaves como Sistema.

Clique duas vezes no certificado, abra a seção Trust e defina Code Signing como Always Trust. Saia do aplicativo Keychain Access.

Reinicie o serviço taskgated e assine o binário.

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

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

No macOS 10.12 (Sierra) e posterior, você também deve

Use gdb 7.12.1 ou posterior Além disso, evite que o gdb use um shell para iniciar o programa a ser depurado. Você pode usar o seguinte comando para isso dentro do gdb:

set startup-with-shell off

Você também pode colocar este último comando em um arquivo chamado .gdbinit em seu diretório inicial, caso em que ele será aplicado automaticamente toda vez que você iniciar o gdb

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

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


6
Funciona como um encanto. Obrigado.
— pceccon

14
Como o OP apontou, isso não funcionou para ele (e nem para mim).
— PVitt

6
Parece que não funciona macOS Sierracom certificados autoassinados.
— Loretoparisi

sudo killall taskgatedé a chave para resolver meu problema
— Karthikeyan Vaithilingam

Segui as etapas com precisão e funcionou perfeitamente para mim no macOS Sierra.
— jdg

29

Fiz o gdb funcionar no OSX 10.9 sem codificar desta forma (descrito aqui ):

  1. Instale o gdb com macports. (pode ser que você pode pular)

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

    altere a string de opção de -spara -spna linha 22, coluna 27.

  3. Reinicie o computador.

  4. Use gdb. Se você instalou com portas mac, então você deve usar o ggdbcomando. Ou criou um alias em seu arquivo de configuração:

alias gdb='ggdb'

e use o comando 'gdb' então.


Eu já estava enfrentando esse problema há algum tempo e achava outros procedimentos inúteis. Isso funcionou como um encanto.
— Bill DeRose

@BillDeRose, o mesmo para mim.
— klm123

@nimrodm, você quer dizer "sudo gdb"? deve ser "ggdb" com
— macports

1
Ugh. Eu não quero ter que correr gdbcomo sudo. Isso parece um risco de segurança desnecessário.
— Autumnsault

2
Não vou reiniciar o computador. Deve haver um comando para reiniciar algo!
— Michael

27

Fiz o upgrade para gdb 8.3e não consegui fazer as coisas funcionarem. Isso me ajudou:

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

Onde o conteúdo de gdb.xmlé:

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

Encontrei essa solução aqui: https://timnash.co.uk/getting-gdb-to-semi-reliably-work-on-mojave-macos/

Nota: Sem o direito, eu era capaz de executar gdbapenas sudo.


2
O que você faria se recebesseerror: The specified item could not be found in the keychain.
— Sridhar Sarnobat

@SridharSarnobat Use o pipeline primeiro desta resposta stackoverflow.com/a/32727069/339146
— Panayotis

Falha após tentar a resposta de @maximser. Então isso funciona para mim. macOS 10.15.4, gdb 9.2 instalado via brew.
— dia

@SridharSarnobat: Você deve criar o certificado primeiro stackoverflow.com/questions/35020236/…
— Akansha

26

Eu tive o mesmo problema com o GDB. Estou correndo sob o Mac OS X 10.8.5nome de Mountain Lion. Estou usando a versão GDB 7.7.1.

Compilei meu programa de teste com o seguinte comando:

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

Se eu inserir o comando gdb sample.out, recebo a mesma mensagem de erro criptografada:

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

Essa mensagem de erro, entretanto, é uma pista falsa.

A solução que descobri que funcionou para mim foi simplesmente invocar o GDB usando a conta de superusuário:

sudo gdb sample.out. 

Isso funciona bem para mim.

E a partir desse ponto eu poderia executar GDB example.out sem usar sudo.

Espero que isso ajude e funcione para outros. RSVP se isso não acontecer.


1
Não tenho certeza por que isso foi rejeitado. Executei o comando como root (com sudo) e funcionou.
— iPrograma de

6

Nada disso funcionou para mim e eu tive que ir com uma longa corrida. Aqui está uma lista completa das etapas que executei para fazê-lo funcionar.

  1. Crie um certificado para assinar o gdb.

Infelizmente, o certificado do sistema me forneceu o Unknown Error = -2,147,414,007que é muito útil, então eu tive que ir com uma solução alternativa. KeyChain Assistant -> Create certificate ->

Escolha login, gdb-cert,Code Signing

Copiar / mover o certificado para as chaves do sistema (digite a senha)

  1. Selecione o certificado ( gdb-cert) clique Get info->Trust Always
  2. Desabilitar startup-with-shell

Entre no console: set startup-with-shell off

Lembre-se da configuração: echo "set startup-with-shell off" >> ~/. gdbinit

  1. Habilitar usuário raiz

Vá para System Preferences-> Users & Groups-> Unlock it-> Login Options-> Network Account Server-> Join-> Unlock it-> Edit(menu) ->Enable Root User

  1. sudo killall taskgated
  2. Finalmente assine o gdb

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

  1. Desativar usuário raiz (etapa 4)
  2. Reinicie se ainda não funcionar. (se nada mais funcionar, provavelmente já funciona)

PS. lldbAcabo usando porque simplesmente funciona ( tutorial )


5

Para quem usa Sierra 10.12.6 (e superior) e Homebrew, /usr/local/bin/gdbé um link simbólico para /usr/local/Cellar/gdb/8.0/bin/gdb(ou qualquer versão, por exemplo 8.0.1).

Você precisa codificar o link e o destino:

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

Ou, se você tiver greadlink(instalado via brew install coreutils):

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

1
você tentou fazer isso em High Sierra? Não funcionou para mim no O / S: 10.13.6
— rustyMagnet

3

Eu me pergunto se a mudança global na resposta mais votada aqui tem algumas consequências não intencionais.

Em vez de habilitar a antiga convenção Tiger, o taskgated permite que o código assinado seja executado. Portanto, pode ser melhor apenas obter um certificado assinado para gdb, semelhante à resposta aqui .

Depois disso, consegui sudousar o gdb. Se você precisar usar gdb sem sudo, talvez este link ajude , porém, isenção de responsabilidade, ainda não tentei porque usar sudoé uma solução ok por enquanto.


3

Isso pode não estar relacionado. Você pode usar lldb em macos em vez de gdb. Você não precisa deste incômodo para instalar o gdb.

lldb ( http://lldb.llvm.org ) já está instalado por padrão no High Sierra


0

Eu posso recomendar seguir esta essência: https://gist.github.com/gravitylow/fb595186ce6068537a6e9da6d8b5b96d#file-codesign_gdb-md

Com truques para superar: unknown error = -2,147,414,007durante a criação do certificado descrito aqui: https://apple.stackexchange.com/a/309123

Notas:

O caminho para gdb instalado como homebrewpacote deve ser algo como:/usr/local/Cellar/gdb/9.2/bin/gdb

E csrutil enable --without debugvai causar uma mensagem sobre requesting unsupported configuration, como aqui: https://totalfinder.binaryage.com/system-integrity-protection

Teste:

○ → 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;

Meu problema é o mesmo do cara acima, resolvido por

codesign --entitlements gdb.xml -fs gdb-cert /usr/local/bin/gdb
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.