2009-11-06 5 views
3

Ma question concerne le débogage à distance d'une application sur un processeur de bras incorporé à l'aide de gdb/gdbserver.Débogage de bibliothèques partagées à distance avec gdb/gdbserver

Je peux déboguer l'application elle-même, mais l'application est liée dynamiquement à une bibliothèque partagée qui implémente un protocole de communication interne. Je veux être en mesure de définir des points d'arrêt dans les fonctions de la bibliothèque partagée afin d'essayer de comprendre certains problèmes de découverte de périphériques. Je me suis assuré que la bibliothèque est compilée avec des symboles de débogage et est chargée par gdb côté hôte, je peux lister les fonctions dans la bibliothèque et même définir les points d'arrêt mais dès que j'essaie d'exécuter l'application, je reçois un message d'erreur à l'effet de:

Cannot insert breakpoint X.
Error accessing memory address : Input/output error.

où X est le nombre de points d'arrêt et gdb est une adresse bien petite pour être valide.
J'utilise la nouvelle bibliothèque sur la machine cible et sur la machine hôte, mais via mount -o bind newlib oldlib sur la cible à partir d'un montage nfs.
Est-ce que quelqu'un a une idée de ce qui pourrait être faux? Merci d'avance.

+0

double possible de [bibliothèques partagées avec débogage gdbserver] (https://stackoverflow.com/questions/8611194/debugging-shared-libraries-with-gdbserver) –

Répondre

0

Wild devinez: vous avez chargé la bibliothèque partagée dans l'hôte GDB à l'adresse incorrecte.

lieu de le charger explicitement dans GDB, utilisez "set stop-on-solib-event on", attendez la bibliothèque pour obtenir chargé (info shared vous indiquera la liste actuelle des bibliothèques chargées) et puis définir les points d'arrêt.

0

Utilisez la commande suivante pour définir des points d'arrêt en attente qui seront résolus après la bibliothèque d'objet partagé est chargé

set breakpoint pending on 

Malheureusement vous ne pouvez pas utiliser « set stop-sur-solib-événement » pour gdbserver débogage à distance puisque gdbserver ne reconnaît/envoie pas les événements solib. J'ai juste dû émettre une commande set solib-search-path ou set sysroot pour que gdb charge tous les symboles de la bibliothèque partagée après avoir touché un point d'arrêt sur main.

6

Je vois cette question est de 2009, mais les réponses actuelles sont hors jour, alors voici une mise à jour:

@Employed russe a suggéré que vous devez utiliser stop-on-solib-event. Ce n'est plus vrai; NDK r8d prend en charge les points d'arrêt en attente dans les solibs encore à charger.

@Brent Piddy dit que stop-on-solib-event ne fonctionne pas avec gdbserver. Ce n'est plus vrai non plus depuis au moins r8c. Mon entreprise a un produit qui repose sur ce comportement NDK de GDB, nous aurions de gros problèmes sans cela.

0

exécuter jusqu'à main puis set solib-search-path .

Sinon, gdbserver arrête au chargeur dynamique, avant que les bibliothèques sont chargées. Au main, ils devraient être prêts pour GDB.

Plus de détails: Debugging shared libraries with gdbserver

Questions connexes