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.

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top