O gdb falha com o erro "Não foi possível encontrar a porta de tarefas Mach para identificação do processo"

138

Meu aplicativo funciona bem, mas o gdb falha ao depurá-lo com o seguinte erro

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

Estou no OS X Lion. A versão do GDB é

$ 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".
SB
fonte
Acho que este post pode ajudar: stackoverflow.com/questions/10221448/… .
Codie CodeMonkey

Respostas:

64

No Snow Leopard e versões posteriores do Mac OS, não é suficiente assinar o código do gdbexecutável.

Você deve seguir este guia para fazê-lo funcionar: http://www.opensource.apple.com/source/lldb/lldb-69/docs/code-signing.txt

O guia explica como fazer isso lldb, mas o processo é exatamente o mesmo gdb.

Tyilo
fonte
12
Essas instruções não funcionou para mim no OSX 10.9.2 com MacPorts, mas isso fez: sourceware.org/gdb/wiki/BuildingOnDarwin
simpleuser
Funciona! Mas você pode explicar o que a sudo security add-trustlinha está fazendo? Posso excluir o .cerarquivo da minha área de trabalho agora?
Sreejith Ramakrishnan
9
codesign -s gdb_codesign `which gdb` ajuda após este guia
synther
Ou sudo codesign -s gdb_codesign `which gdb-apple` no macOS sierra.
Sdive
3
Para o mais recente sistema operacional, ligação trabalhou
Yuxuan
144

Funciona quando mudo para sudo gdb executableFileName! :)

Mengyuan
fonte
2
Obrigado. Essa assinatura de código positivo era necessária para que o gdb funcionasse. Eu dei acesso root ao gdb (como descrito aqui stackoverflow.com/questions/10476154/… ), então não precisei digitar sudo toda vez. Edit - Encontrei uma abordagem melhor aqui: stackoverflow.com/a/10441587/305149
Aneil Mallavarapu
14
Executá-lo como root? Você está falando sério? A pior "solução".
Equidamóide
7
@ Equidamoid Por que seria tão ruim rodar gdbcomo root? Eu só estava curioso porque é apenas um depurador.
ESTE USUÁRIO PRECISA DE AJUDA
O que aconteceria se você o executasse como raiz? É o código que você escreveu, e eu não compreender as consequências
COLD ICE
4
@COLDICE em geral, você não deseja executar processos com privilégios escalados (especialmente escalados para o topo como raiz), pois geralmente eles não precisam de acesso para modificar coisas no sistema ou abrir portas inferiores a 1024 (portas mais altas podem ser usado por usuários que não são do sistema / não-root). Mesmo que você "confie" em seu próprio código, isso não significa que você não cometeu um erro que o cause rm -rf /ou algo destrutivo similar ao substituir alguns binários de configuração / binários nos quais seu computador confia para iniciar e operar normalmente.
211118 shaunhusain
32

Você precisa criar um certificado e assinar o gdb:

  • Abra o aplicativo “Keychain Access” (/ Aplicativos / Utilitários / Keychain Access.app)
  • Abrir menu / Acesso ao chaveiro / Assistente de certificado / Criar um certificado ...
  • Escolha um nome (gdb-cert no exemplo), defina "Tipo de identidade" como "Raiz autoassinada", defina "Tipo de certificado" como "Assinatura de código" e selecione "Deixe-me substituir os padrões". Clique em "Continuar". Convém estender o período predefinido de 365 dias para 3650 dias.
  • Clique várias vezes em "Continuar" até chegar à tela "Especificar um local para o certificado" e defina "Chaveiro para sistema".
  • Se você não conseguir armazenar o certificado no chaveiro "Sistema", crie-o no chaveiro "login" e exporte-o. Você pode importá-lo para o chaveiro "Sistema".
  • Nos chaveiros, selecione "Sistema" e você deverá encontrar seu novo certificado. Use o menu de contexto do certificado, selecione "Obter informações", abra o item "Confiança" e defina "Assinatura de código" para "Confiar sempre".
  • Você deve sair do aplicativo "Keychain Access" para usar o certificado e reiniciar o serviço "taskgated" matando o processo atual "taskgated" em execução. Como alternativa, você pode reiniciar o seu computador.
  • Finalmente, você pode assinar o gdb:

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

    sudo ggdb ./myprog

qed
fonte
4
note que matar tarefas não reiniciou o processo. necessário para: sudo launchctl load /System/Library/LaunchDaemons/com.apple.taskgated.plist #
Ben Ben
As tarefas acima foram reiniciadas - mas ainda assim não funcionou sem uma reinicialização no sierra, infelizmente.
Neil McGill
16

O problema é que você não está logado como usuário root (o que não deseja). Você precisa criar um certificado para o gdb ter acesso permitido. Siga este tutorial e você deve estar pronto para ir ...

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

Se tudo mais falhar, basta usar: sudo gdb executableFileName

Sam Ruberti
fonte
4
O tutorial ilustrado aqui funcionou melhor. Só tive que executar codesign -s gdb-cert $(which gdb)Para assinar o gdbaplicativo.
Cevaris 08/03
Apenas confirmando se alguém está tentando fazer isso no OSX 10.12.5, é necessário seguir as etapas descritas no link BuildingOnDarwin E executar o gdb após mudar para o usuário root.
AdjunctProfessorFalcon
7

Esse link tinha o passo a passo mais claro e detalhado para fazer com que esse erro desaparecesse para mim.

No meu caso, eu tinha que ter a chave como uma chave "Sistema", caso contrário não funcionaria (o que nem todo URL menciona).

Também matar taskgatedé uma alternativa viável (e mais rápida) para ter que reiniciar.

Também desinstalei o MacPorts antes de iniciar esse processo e desinstalei o gdb atual usando brew uninstall gdb.

Hans Roggeman
fonte
Isso funcionou para mim. +1 para referência que usa brew.
trigoman
3

Eu precisava desse comando para fazê-lo funcionar no El Capitan:

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

Eu segui este tutorial, e está tudo bem.

ray6080
fonte
2

No MacOSX, o lldb precisa ser assinado por código. As versões Debug and Release são definidas para assinar código usando um certificado de assinatura de código chamado 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 é usado no mac como gdb.]

Bhupesh Pant
fonte
2

Aqui está um guia realmente útil que resolveu meu problema (OSX 10.13.6).

  1. Acesso ao chaveiro aberto
  2. No menu, abra Acesso ao chaveiro> Assistente de certificado> Criar um certificado
  3. Dê um nome a ele (por exemplo, gdbc)
    • Tipo de identidade: Raiz autoassinada
    • Tipo de certificado: assinatura de código
    • Verificar: deixe-me substituir os padrões
  4. Continue até que você solicite: "especifique um local para ..."
  5. Defina o local do chaveiro como Sistema
  6. Crie um certificado e feche o assistente.
  7. Encontre o certificado em Chaveiros do sistema, clique com o botão direito do mouse> obtenha informações (ou clique duas vezes nele)
  8. Expanda Confiança, defina a assinatura de código para sempre confiar
  9. Reiniciar tarefas em terminal: killall taskgated
  10. Executar codesign -fs gdbc /usr/local/bin/gdbno terminal: solicita a senha root
Yihe
fonte
1

Essas instruções funcionam no OSX High Sierra e evitam executar o gdb como root (eca!). Atualizei recentemente do OSX 10.13.2 para 10.3.3. Acho que foi quando o gdb 8.0.1 (instalado com homebrew) começou a falhar para mim.

Eu tive dificuldade com as instruções de outras pessoas. Depois de instruções diferentes, tudo estava uma bagunça. Então eu comecei um novo. Eu mais ou menos segui estas instruções .

Limpe a bagunça:

  1. brew uninstall --force gdb # This deletes _all_ versions of gdb on the machine
  2. Em Applications-> Utilities-> Keychain Access, apaguei todos os certificados e chaves gdb anteriores (certifique-se de saber o que está fazendo aqui!). Não está claro se isso é necessário, mas desde que eu estraguei a tentativa de criar esses certificados e chaves usando outras instruções, eu os eliminei de qualquer maneira. Eu tinha chaves e certificados no login e no sistema.

Agora reinstale o gdb.

  1. brew install gdb
  2. Dentro Keychain Access, vá ao menu Keychain Access-> Certificate Assistant->Create a Certificate
  3. Marque "Deixe-me substituir os padrões" e defina
Name : gdb-cert
Identity Type: Self Signed Root
Certificate Type : Code Signing

[X] Let me override defaults
  1. Na primeira página de informações do certificado:
Serial Number : 1
Validity Period (days): 3650
  1. Na segunda página Informações do certificado, deixei todos os campos em branco, exceto os que já foram preenchidos.

  2. Na página Informações do par de chaves, deixei os padrões

Key Size : 2048
Algorithm : RSA
  1. Na página Extensão de uso de chave, deixei os padrões marcados.
[X] Include Key Usage Extension
[X] This extension is critical
Capabilities:
[X] Signature
  1. Na página Extensão de uso de chave estendida, deixei os padrões marcados.
[X] Include Extended Key Usage Extension
[X] This extension is critical
Capabilities:
[X] Code Signing
  1. Na Página de Extensão de Restrições Básicas, nada foi verificado (padrão).

  2. Na página Extensão de Nome Alternativo por Assunto, deixei o padrão marcado e não adicionei mais nada.

[X] Include Subject Alternate Name Extension
  1. Em Especificar um local para a página de certificado, defino
Keychain: System
  1. Cliquei em Criar e minha senha foi solicitada.

  2. De volta ao Keychain Accessaplicativo, Systemcliquei com o botão direito do mouse gdb-certe, no menu suspenso Trust, alterei todos os campos para Always Trust.

  3. Computador reiniciado.

  4. No terminal, eu corri codesign -s gdb-cert /usr/local/bin/gdb. Digitei minha senha quando solicitado.

  5. No terminal, eu corri echo "set startup-with-shell off" >> ~/.gdbinit

  6. Eu corri gdb myprograme depois startno console gdb. Aqui, acredito, solicitou minha senha. Depois disso, todas as execuções subseqüentes não solicitaram minha senha.

irritable_phd_syndrom
fonte
Infelizmente, eu fiz a resposta mais votada e a sua resposta e ainda vejo a mesma mensagem de erro. Eu tenho o macOS Catalina versão 10.15.4 e o gdb 9.1.
Jay Sullivan
@JaySullivan +1. Eu também tenho o mesmo problema.
irsis 23/05
1

Essa é uma abordagem estranha, mas funcionou para mim (MacOs HighSierra 10.13.3). Instale o CLion. Ele vem com gdb. Uma vez execute o gdb usando o Terminal. Copie o programa gdb para o seu usr / local / bin /. Não há problema de login, sudo etc.

Sparsh Gupta
fonte
1

Seguindo as instruções aqui, a codificação do gdb no macOS pareceu resolver esse problema, para mim, no macOS High Sierra (10.13.3).

Gino
fonte