“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

Pellekrogholt
fonte
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

maximser
fonte
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.

klm123
fonte
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.

Johnny Thunderman
fonte
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.

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

Taras Matsyk
fonte
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))
Larry Song
fonte
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.

JnBrymn
fonte
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

Kaituo Li
fonte
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};
Iurii Vasylenko
fonte
-1

gdb 8.3;

Meu problema é o mesmo do cara acima, resolvido por

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