Wenn Sie eine gewöhnliche GDB-Sitzung für eine ausführbare Datei auf demselben Computer durchführen, können Sie den Befehl run eingeben, und das Programm wird erneut gestartet.
Wenn Sie gdb auf einem eingebetteten System ausführen, wie mit dem Befehl target localhost: 3210 ', wie können Sie das Programm erneut starten, ohne die gdb-Sitzung zu beenden und neu zu starten?
Sie suchen Multi-Process Mode für gdbserver und set remote exec-file filename
Leider kenne ich keine Möglichkeit, die Anwendung neu zu starten und trotzdem Ihre Sitzung aufrechtzuerhalten. Eine Problemumgehung besteht darin, den PC auf den Einstiegspunkt Ihres Programms zurückzusetzen. Sie können dies tun, indem Sie entweder anrufen:
jump function
oder
set $pc=address
.
Wenn Sie die Argumente auf main
gesetzt haben, müssen Sie sie möglicherweise erneut einrichten.
Bearbeiten:
Es gibt ein paar Einschränkungen bei der obigen Methode, die Probleme verursachen können.
Die Verwendung von jump ist also nicht gleichbedeutend mit einem Neustart des Programms.
Vermutlich führen Sie gdbserver auf dem eingebetteten System aus.
Sie können es auffordern, Ihr Programm neu zu starten, anstatt es mit target extended-remote zu beenden.
"jump _start" ist der übliche Weg.
Für mich funktioniert die in 21.2 Beispiel für den Start einer GDB-Sitzung beschriebene Methode hervorragend. Wenn ich monitor reset halt
später bei der Eingabeaufforderung "(gdb)" eingebe, wird die Zielhardware zurückgesetzt und ich kann die Anwendung mit c
neu starten (= fortsetzen).
Der Befehl load
kann zwischen den Läufen weggelassen werden, da das Programm nicht immer wieder geflasht werden muss.
Schrittweise Anleitung
Fernbedienung:
# pwd contains cross-compiled ./myexec
gdbserver --multi :1234
Lokal:
# 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
Getestet in Ubuntu 14.04.
Es ist auch möglich, CLI-Argumente wie folgt an das Programm zu übergeben:
gdbserver --multi :1234 ./myexec arg1 arg2
und der ./myexec
Teil beseitigt die Notwendigkeit für set remote exec-file ./myexec
, aber dies hat die folgenden Belästigungen:
show args
nicht angezeigt und bleibt auch nach Neustarts nicht erhalten: https://sourceware.org/bugzilla/show_bug.cgi?id=21980Umgebungsvariablen übergeben und Arbeitsverzeichnis ohne Neustart ändern: Wie können die Umgebungsvariablen und das Arbeitsverzeichnis von gdbserver --multi ohne Neustart geändert werden?
Wenn Sie reguläres gdb ausführen, können Sie 'run' shortcut 'r' eingeben und gdb fragt Sie, ob Sie das Programm neu starten möchten
Auf EFM32 Happy Gecko würde keiner der Vorschläge für mich funktionieren, daher habe ich Folgendes aus der Dokumentation zur Integration von GDB in die Eclipse-Umgebung gelernt.
(gdb) mon reset 0
(gdb) continue
(gdb) continue
Dies versetzt mich in den Zustand, den ich erwartet hätte, wenn ich von der IDE zurückgesetzt wurde.