Используя GDB, отображать несколько переменных в одной строке? - PullRequest
8 голосов
/ 24 января 2009

Как я могу попросить отобразить несколько переменных в одной строке? Поэтому я хочу получить вывод как:

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

Я набираю в disp s [i] ENTER disp exp ENTER (и т. Д., И т. Д.), И я просто знаю, что должен быть лучший способ сделать это в одной строке ввода.

Ответы [ 2 ]

9 голосов
/ 25 января 2009

Чтобы установить несколько активных «переменных дисплеев» без повторного ввода каждого из display i, display s[i] и т. Д. Каждый раз, когда вы перезапускаете GDB, используйте GDB «постоянная последовательность команд».

Например, добавьте это к вашему ~/.gdbinit:

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

Теперь вы можете добавить все дисплеи одновременно, набрав disp_vars в приглашении GDB.

4 голосов
/ 26 января 2009

Занятый русский дал правильное решение, но для тех, кто хочет увидеть его, используйте пример, см. Ниже. Если вы не уверены, хотите ли вы поместить файл .gdbinit в свой домашний каталог, вы также можете поместить его в каталог, из которого вы запускаете программу, для эксперимента.

$ 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

Конечно, 'r' для запуска, 's' для шага, 'b' для перерыва и т. Д. Я также пропустил некоторые выходные данные. Обратите внимание, что мне пришлось снова ввести команду «disp_vars» после «run». Спасибо Занятый русский.

...