it-swarm-eu.dev

Wie laufen Sie starten das Programm wieder über in gdb mit ‚Zielfern‘?

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?

25
jfm3
10
pdileepa

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.

  • Wenn Sie sich in einem Multithread-Programm befinden und zur Hauptansicht springen, wird der aktuelle Thread zur Hauptansicht gesprungen, alle anderen Threads bleiben erhalten. Wenn der aktuelle Thread eine Sperre hat ... dann haben Sie einige Probleme.
  • Speicherverluste: Wenn Sie während der Initialisierung im Programmablauf ein paar Dinge zuweisen, haben Sie mit dem Sprung nur eine Menge Speicherplatz verloren.
  • Geöffnete Dateien bleiben weiterhin geöffnet. Wenn Sie einige Dateien oder Adressen zuordnen, schlägt der Aufruf höchstwahrscheinlich fehl.

Die Verwendung von jump ist also nicht gleichbedeutend mit einem Neustart des Programms.

6
Drew Frezell

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.

4

"jump _start" ist der übliche Weg.

2
Michael Snyder

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.

1
hermannk

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:

Umgebungsvariablen ü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

0
Jehandad

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.

0
Steven Eckhoff