Wie kann ich gdb dazu bringen, den Befehlsverlauf zu speichern?


195

Wie kann ich einrichten, gdbdass der Befehlsverlauf gespeichert wird? Beim Starten einer neuen gdbSitzung möchte ich die Pfeiltasten verwenden, um auf die Befehle der vorherigen Sitzungen zuzugreifen.


1
Hinweis: Die .gdbinitDatei muss von anderen als Ihnen unter Linux schreibgeschützt sein.
Urzeit

@urzeit - Ich denke, das ist eine verlorene Sache bei Distributionen wie Ubuntu. Sie erlauben standardmäßig jedem, in das Home-Verzeichnis eines anderen zu gelangen.
JWW

@jww Die .gdbinitDatei wird nicht verarbeitet, wenn die Berechtigungen nicht korrekt eingerichtet sind, unabhängig davon, welche Standardeinstellung dies ist oder welche anderen Einschränkungen für Home-Verzeichnisse vom System verwendet werden.
Urzeit

@urzeit Wenn Sie eine .gdbinitDatei erstellen und dies nicht der Fall ist, bedeutet dies, dass Sie umaskkeinen vernünftigen Wert wie haben 022. In einem Mehrbenutzersystem haben Sie dann größere Probleme als nur Ihre .gdbinitDatei.
Kaz

Antworten:


283

Kurze Antwort: echo 'set history save on' >> ~/.gdbinit && chmod 600 ~/.gdbinit


Lange Antwort:

Der Befehlsverlauf wird im GDB-Handbuch 22.3 Befehlsverlauf behandelt . Erstellen Sie eine Datei $HOME/.gdbinit, ändern Sie ihre Berechtigungen in 0600und fügen Sie den folgenden Inhalt hinzu:

set history save on

Sie können die Anzahl der in der Vergangenheit gespeicherten Befehle wie folgt festlegen. Der Befehl wird als "Festlegen der Anzahl der Befehle, die gdb in seiner Verlaufsliste aufbewahrt" beschrieben. Der Standardwert ist der Wert der Umgebungsvariablen GDBHISTSIZE oder 256, wenn diese Variable nicht festgelegt ist. Nicht numerische Werte von GDBHISTSIZE werden ignoriert Größe ist unbegrenzt oder wenn GDBHISTSIZE entweder eine negative Zahl oder die leere Zeichenkette ist, dann ist die Anzahl von Befehlen gDB in der History - Liste hält unbegrenzt“ .

set history size <size>

Ein verwandter Befehl ist set history remove-duplicates <count>. Der Befehl wird beschrieben als "Steuern Sie das Entfernen doppelter Verlaufseinträge in der Befehlsverlaufsliste. Wenn count nicht ungleich Null ist, blickt gdb auf die letzten Zählverlaufseinträge zurück und entfernt den ersten Eintrag, der ein Duplikat des aktuellen Eintrags ist in die Kommando - History - Liste hinzugefügt. Wenn count diese Lookbehind unbegrenzt ist dann unbegrenzt. Wenn count 0 ist, dann Entfernung der doppelten Historieneinträge deaktiviert ist“ .

set history remove-duplicates <count>

Standardmäßig speichert gdb den Verlauf in der Datei ./.gdb_history im aktuellen Verzeichnis . Wenn Sie möchten, dass Ihr Befehlsverlauf nicht von dem Verzeichnis abhängt, in dem Sie sich befinden, geben Sie außerdem Folgendes an:

set history filename ~/.gdb_history

4
Ich habe es gerade selbst herausgefunden und dachte, ich würde es auf SO teilen.
Frank

3
Für das nächste Mal ist es absolut legitim, selbst beantwortete Fragen wie Nicht-Community-Wiki zu erstellen. :)
Greg Hewgill

@Frank Wie wäre es, wenn ich tippe und ndann die Pfeiltaste nach oben drücke , erhalte ich alle vorherigen Befehle, die mit beginnen n.
SIFE

Unter GDB 8.0.1 scheint dies ohne die speziellen Dateiberechtigungen zu funktionieren.
Ryan1729

7

Wenn Sie immer noch Probleme haben, stellen Sie sicher, dass Ihre HISTSIZE-Umgebungsvariable eine entsprechend hohe Zahl ist. Meins war leer, was dazu führte, dass die "Verlaufsgröße" von gdb standardmäßig auf 0 eingestellt war.

Hinzugefügt

export HISTSIZE=100000000

zu meinem ~ / .bashrc und alles ist gut

Sie können Ihre GDB-Verlaufseinstellungen überprüfen, indem Sie (innerhalb von GDB) "Verlauf anzeigen" ausführen:

gdb$ show history
expansion:  History expansion on command input is off.
filename:  The filename in which to record the command history is "/home/xiao/.gdb_history".
save:  Saving of the history record on exit is on.
size:  The size of the command history is 100000000.

Aus den Dokumenten :

set Geschichte Größe Größe
Set Geschichte Größe unbegrenzt
Stellen Sie die Anzahl von Befehlen , die GDB in seiner Geschichte Liste hält. Der Standardwert ist der Wert der Umgebungsvariablen HISTSIZE oder 256, wenn diese Variable nicht festgelegt ist. Wenn die Größe unbegrenzt ist, ist die Anzahl der Befehle, die GDB in der Verlaufsliste speichert, unbegrenzt.


Ich hatte das gleiche Problem. Trotz set history size 100des Einfügens der .gdbinit-Datei verursachte die Umgebungsvariable HISTSIZE immer noch, dass die Verlaufsgröße auf Null gesetzt wurde. Das Problem ist, dass gdb nicht versteht, dass HISTSIZE auf unbegrenzt gesetzt werden kann
DavidW

Der HISTSIZE-Fehler in gdb wurde ab Juni 2015 behoben , nicht dass diese Änderung wahrscheinlich noch auf Ihrem System vorhanden ist. In der Zwischenzeit muss if HISTSIZE> 0 sein, sonst wird gdb den Verlauf deaktivieren.
Nate R.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.