Comment recommencez-vous l’exécution du programme dans gdb avec 'target remote'?

StackOverflow https://stackoverflow.com/questions/75255

  •  09-06-2019
  •  | 
  •  

Question

Lorsque vous effectuez une session gdb habituelle sur un fichier exécutable sur le même ordinateur, vous pouvez donner la commande run afin que le programme redémarre à nouveau.

Lorsque vous exécutez gdb sur un système intégré, comme avec la commande target localhost: 3210 ', comment relancez le programme sans quitter et redémarrer votre session gdb?

Était-ce utile?

Autres conseils

Malheureusement, je ne connais aucun moyen de redémarrer l'application tout en maintenant votre session. Une solution de contournement consiste à ramener le PC au point d'entrée de votre programme. Vous pouvez le faire en appelant:

jump fonction

ou

set $ pc = adresse .

Si vous avez associé les arguments à main , vous devrez peut-être les configurer à nouveau.

Modifier:

La méthode ci-dessus pose quelques problèmes qui pourraient poser problème.

  • Si vous êtes dans un programme multi-threadé, le fait de passer au principal fait passer le thread actuel au principal, tous les autres restent. Si le thread en cours a verrouillé ... alors vous avez des problèmes.
  • Fuite de mémoire, si le flux de programme alloue des éléments lors de l'initialisation, il vous suffit de perdre beaucoup de mémoire avec le saut.
  • Les fichiers ouverts resteront toujours ouverts. Si vous mappez des fichiers ou une adresse, l’appel risque d’échouer.

Donc, utiliser jump ne signifie pas redémarrer le programme.

Vous utilisez probablement gdbserver sur le système intégré.

Vous pouvez lui demander de redémarrer votre programme au lieu de quitter cible télécommande étendue

" jump _start " est la manière habituelle.

Pour moi, la méthode décrite dans 21.2 Exemple de démarrage de session GDB fonctionne très bien. Lorsque j'entre la réinitialisation du moniteur, l'arrêt ultérieurement à l'invite «(gdb)», le matériel cible est réinitialisé et je peux redémarrer l'application avec c (= continuer).

La commande load peut être omise entre les exécutions, car il n'est pas nécessaire de flasher le programme encore et encore.

Procédure détaillée

Télécommande:

# pwd contains cross-compiled ./myexec
gdbserver --multi :1234

Local:

# pwd also contains the same cross-compiled ./myexec
gdb -ex 'target extended-remote 192.168.0.1:1234' \
    -ex 'set remote exec-file ./myexec' \
    --args ./myexec arg1 arg2
(gdb) r
[Inferior 1 (process 1234) exited normally]
(gdb) r
[Inferior 1 (process 1235) exited normally]
(gdb) monitor exit

Testé sous Ubuntu 14.04.

Il est également possible de transmettre des arguments CLI au programme en tant que:

gdbserver --multi :1234 ./myexec arg1 arg2

et la partie ./ myexec suppriment la nécessité de définir le fichier exec distant ./myexec , mais présente les inconvénients suivants:

Transmettez les variables d'environnement et modifiez le répertoire de travail sans redémarrer: Comment modifier les variables d’environnement et le répertoire de travail de gdbserver --multi sans le redémarrer?

Si vous utilisez gdb standard, vous pouvez taper 'run', raccourci 'r' et gdb vous demande si vous souhaitez redémarrer le programme

Sur EFM32 Happy Gecko, aucune des suggestions ne fonctionnait pour moi. Voici donc ce que j'ai appris de la documentation sur l'intégration de GDB dans l'environnement Eclipse.

(gdb) mon reset 0
(gdb) continue
(gdb) continue

Cela me met dans l'état auquel je m'attendais lors de la réinitialisation de l'EDI.

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