Débogage bibliothèques partagées à distance avec gdb / gdbserver
-
18-09-2019 - |
Question
Ma question concerne à distance le débogage d'une application sur un processeur embarqué bras avec gdb / gdbserver.
Je peux déboguer l'application elle-même, mais l'application lie dynamiquement à une bibliothèque partagée qui met en œuvre un protocole de communication dans la maison. Je veux être en mesure de définir des points d'arrêt dans les fonctions des bibliothèques partagées afin d'essayer de comprendre certains problèmes de découverte de l'appareil.
Je me suis assuré que la bibliothèque est compilé avec les symboles de débogage et est chargé par gdb du côté hôte, je peux énumérer les fonctions de la bibliothèque et même définir les points d'arrêt, mais dès que je tente de lancer 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 à la fois la cible et la machine hôte, mais par l'intermédiaire mount -o bind newlib oldlib
sur la cible d'un nfs support.
Est-ce que quelqu'un a une idée de ce qui pourrait se tromper?
Merci à l'avance.
La solution
guess sauvage. Vous avez chargé la bibliothèque partagée dans GDB
hôte à l'adresse incorrecte
Au 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.
Autres conseils
Je vois cette question est de 2009, mais les réponses actuelles sont hors jour, voici donc 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 des points d'arrêt en attente dans solibs encore à être chargées.
@Brent Piddy dit que stop-on-solib-event
ne fonctionne pas avec gdbserver. C'est plus vrai depuis au moins R8C. Mon entreprise a un produit qui repose sur ce comportement NDK de GDB, nous serions en grande difficulté sans elle.
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 depuis gdbserver ne reconnaît pas / envoyer des événements solib. J'ai dû émettre seulement un ensemble solib-recherche-chemin ou commande set sysroot pour obtenir gdb pour charger tous les symboles de la bibliothèque partagée après avoir atteint un point d'arrêt sur principal.
Exécuter jusqu'à main
puis set solib-search-path .
Dans le cas contraire, gdbserver
arrête au chargeur dynamique, avant que les bibliothèques sont chargées. A main
, ils devraient être prêts pour GDB.
Plus de détails: Débogage bibliothèques partagées avec gdbserver