Depuração de bibliotecas compartilhadas remotamente com GDB/GDBSERVER
-
18-09-2019 - |
Pergunta
Minha pergunta é sobre a depuração remota de um aplicativo em um processador de ARM incorporado usando o GDB/GDBSERVER.
Posso depurar o aplicativo em si, mas o aplicativo links dinamicamente a uma biblioteca compartilhada que implementa um protocolo de comunicação interna. Quero poder definir pontos de interrupção nas funções compartilhadas da biblioteca, então tente descobrir alguns problemas de descoberta de dispositivos.
Eu certifiquei -me de que a biblioteca fosse compilada com símbolos de depuração e seja carregada pelo GDB no lado do host, posso listar funções na biblioteca e até definir os pontos de interrupção, mas assim que tentar executar o aplicativo, recebo uma mensagem de erro para o efeito de:
Cannot insert breakpoint X.
Error accessing memory address : Input/output error.
onde x é o número do ponto de interrupção no GDB e é um endereço muito pequeno a ser válido.
Estou usando a nova biblioteca no alvo e na máquina host, mas via mount -o bind newlib oldlib
no alvo de uma montagem NFS.
Alguém tem uma ideia sobre o que poderia estar errado? Desde já, obrigado.
Solução
Wild Guess: você carregou a biblioteca compartilhada no host GDB
em endereço incorreto.
Em vez de carregá -lo explicitamente no GDB, use "set stop-on-solib-event on"
, espere a biblioteca ser carregada (info shared
dirá a você a lista atual de bibliotecas carregadas) e então Defina os pontos de interrupção.
Outras dicas
Vejo que essa pergunta é de 2009, mas as respostas atuais estão desatualizadas, então aqui está uma atualização:
@Russo empregado sugeriu que você deva usar stop-on-solib-event
. Isso não é mais verdadeiro; O NDK R8D suporta pontos de interrupção pendentes em solibs ainda a ser carregados.
@Brent Piddy diz que stop-on-solib-event
Não funciona com o GDBSERVER. Isso também não é mais verdadeiro, pois pelo menos R8C. Minha empresa tem um produto que depende desse comportamento do NDK do GDB, estaríamos com grandes problemas sem ele.
Use o seguinte comando para definir pontos de interrupção pendentes que serão resolvidos depois que a biblioteca de objetos compartilhada for carregada
set breakpoint pending on
Infelizmente, você não pode usar o "Stop-on-Solib-Event em" para o gdbserver depuração remota, já que o GDBServer não reconhece/envia eventos do Solib. Eu tive que apenas emitir um comando Solib-Search-Path ou definir o Sysroot para obter o GDB para carregar todos os símbolos da biblioteca compartilhada depois de atingir um ponto de interrupção no Main.
Correr até main
e depois set solib-search-path .
Por outro lado, gdbserver
Paradas no carregador dinâmico, antes que as bibliotecas sejam carregadas. No main
, eles devem estar prontos para o GDB.
Mais detalhes: Depuração de bibliotecas compartilhadas com gdbserver