Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using gdb, display multiple vars in one line?

Tags:

debugging

gdb

How can I ask to display multiple vars in one line? So I want to get output like:

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

I've been typing in disp s[i] ENTER disp exp ENTER (etc, etc) and I just know there's got to be a better way to do this in one line of typing.

like image 958
Rob Avatar asked Jan 24 '09 17:01

Rob


People also ask

How to print multiple variables in GDB?

You can print multiple values using printf command in gdb. To use it in future, you can either define a gdb-function or use gdb-history feature. Then you can use print_all as a command. and get it using ctrl+r same like in bash.

What is print in GDB?

GDB prints memory addresses showing the location of stack traces, structure values, pointer values, breakpoints, and so forth, even when it also displays the contents of those addresses.


2 Answers

To establish multiple active "variable displays" without re-typing each of display i, display s[i], etc. every time you restart GDB, use a GDB "canned command sequence".

For example, add this to your ~/.gdbinit:

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

Now you can add all the displays at once by typing disp_vars at the GDB prompt.

like image 68
Employed Russian Avatar answered Oct 13 '22 10:10

Employed Russian


Employed Russian gave the correct solution but for those that want see it used in an example see below. If you're not sure if you want to commit to putting the .gdbinit in your home directory, you can also put it in the directory you're executing the program from to experiment.

$ 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

Of course 'r' is for run, 's' is for step, 'b' is for break, etc. I've also omitted some output. Notice that I had to enter the 'disp_vars' command again after 'run'. Thanks Employed Russian.

like image 38
Rob Avatar answered Oct 13 '22 09:10

Rob