views:

989

answers:

2

Sorry in advanced gdb gurus, but 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 ;) Thanks in advanced.

+4  A: 

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.

Employed Russian
Thanks, but display continues to display vars as I step through. I'd have to cut n past the printf for each step through!
Rob
Disregard my comment above as you've changed the answer from a simple printf to the solution. Thanks. I'm marking your answer as a solution!
Rob
+1  A: 

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.

Rob