9 Stimmen

Mit gdb, mehrere Variablen in einer Zeile anzeigen?

Wie kann ich verlangen, dass Anzeige mehrere vars in einer Zeile? Ich möchte also eine Ausgabe erhalten wie:

30      if(s[i] != '\0')
5: s[i] = 101 'e'
4: exp = 14
3: val = 123.45
2: sign = 1
1: i = 6

Ich habe disp s[i] ENTER disp exp ENTER (usw.) eingegeben, und ich weiß einfach, dass es eine bessere Möglichkeit geben muss, dies in einer Zeile zu tun.

11voto

Employed Russian Punkte 180738

Um mehrere aktive "variable Anzeigen" einzurichten, ohne jede von ihnen neu eingeben zu müssen display i , display s[i] usw. jedes Mal, wenn Sie GDB neu starten, verwenden Sie eine GDB "canned command sequence".

Fügen Sie zum Beispiel Folgendes zu Ihrer ~/.gdbinit :

define disp_vars
  disp i
  disp sign
  disp val
  disp exp
  disp s[i]
end

Jetzt können Sie alle Anzeigen auf einmal hinzufügen, indem Sie Folgendes eingeben disp_vars an der GDB-Eingabeaufforderung.

4voto

Rob Punkte 4013

Employed Russian gab die richtige Lösung, aber für diejenigen, die es in einem Beispiel sehen wollen, siehe unten. Wenn Sie sich nicht sicher sind, ob Sie die .gdbinit-Datei in Ihr Home-Verzeichnis legen wollen, können Sie sie auch in das Verzeichnis legen, aus dem Sie das Programm ausführen, um zu experimentieren.

$ gcc -g atof_ex4.2.c 
$ gdb ./a.out
(gdb) b 30
Breakpoint 1 at 0x1907: file atof_ex4.2.c, line 30.
(gdb) h user-defined 
List of commands:
disp_vars -- User-defined
(gdb) disp_vars  #this will enable the user defined canned sequence (but I haven't done run yet! So I'll this actually doesn't work yet.)
No symbol "i" in current context.
(gdb) r
Starting program: a.out 
Breakpoint 1, atof (s=0xbffff028 "123.45e-6") at atof_ex4.2.c:30
30      if(s[i] != '\0')
(gdb) s # No disp_vars output yet because I have to do it AFTER 'run' command
32          if(s[i] == 'e' || s[i] == 'E') 
(gdb) disp_vars # Now it will work ;)
(gdb) s
35              sign = (s[i] == '-') ? -1 : 1;
5: s[i] = 45 '-'
4: exp = 14
3: val = 123.45
2: sign = 1
1: i = 7

Natürlich steht 'r' für run, 's' für step, 'b' für break, usw. Ich habe auch einige Ausgaben weggelassen. Beachten Sie, dass ich den Befehl 'disp_vars' nach 'run' erneut eingeben musste. Vielen Dank an Employed Russian.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X