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.

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top