web-dev-qa-db-fra.com

Comment recommencez-vous l'exécution du programme dans gdb avec "cible distante"?

Lorsque vous effectuez une session gdb habituelle sur un fichier exécutable sur le même ordinateur, vous pouvez donner la commande run et le programme redémarrera.

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?

25
jfm3
10
pdileepa

Malheureusement, je ne connais pas de 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 function

ou 

set $pc=address.

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

Modifier:

La méthode ci-dessus pose quelques problèmes de mise en garde.

  • Si vous êtes dans un programme multi-threadé, le saut au thread principal passe du thread actuel au principal, tous les autres threads restent. Si le thread en cours a verrouillé ... alors vous avez quelques problèmes.
  • Fuites 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 lors du saut.
  • Les fichiers ouverts resteront toujours ouverts. Si vous écrivez des fichiers ou une adresse, l’appel échouera probablement.

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

6
Drew Frezell

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

Vous pouvez lui demander de redémarrer votre programme au lieu de quitter avec target extended-remote

4
Employed Russian

"jump _start" est la méthode habituelle.

2
Michael Snyder

Pour moi, la méthode décrite dans 21.2 Exemple de démarrage de session GDB fonctionne très bien. Lorsque je saisis monitor reset halt plus tard à 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.

1
hermannk

Procédure pas à pas

Éloigné:

# 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 supprime le besoin de set remote exec-file ./myexec, mais présente les inconvénients suivants:

Passer les variables d'environnement et changer 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.

0
Jehandad

Sur EFM32 Happy Gecko, aucune des suggestions ne fonctionnerait 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 lorsque vous appuyez sur reset depuis l'IDE.

0
Steven Eckhoff