Просмотр локальных переменных в GDB без остановки выполнения - PullRequest
0 голосов
/ 06 ноября 2018

Я пытаюсь, чтобы GDB печатал значение переменной при ее изменении.

Учитывая пример программы, я хотел бы получить значение x в func при его изменении, но для продолжения программы без запроса:

#include <stdio.h>
#include <stdlib.h>

int func(int x, int y);

int main(void) {

   int x = 5;
   int y;

   y = func(x, 4);

   printf("%d\n", x);
   printf("%d\n", y);
   return EXIT_SUCCESS;
}

int func(int x, int y) {
   y *= 2;
   x += y;
   return x;
}

Что я пытался:

break func
commands
 silent
 watch x
 commands
  continue
  end
 continue
 end

Хотя это успешно получит значение x, когда оно изменится, проблема в том, что при выходе из области действия x, gdb перестанет сообщать мне, что он покидает область действия x и что он удаляет точку наблюдения. Есть ли способ настроить GDB на продолжение и продолжить выполнение без запроса пользователя при автоматическом удалении точки наблюдения?

Я сталкивался с таким вопросом: gdb: не прерываться, когда точка наблюдения локальной переменной выходит из области видимости Однако он так и не получил решения.

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Вы можете дать команде watch GDB опцию -l, и точка наблюдения не будет удалена (или выполнение остановлено), когда переменная выйдет из области видимости.

Но с этим типом точки наблюдения GDB будет воспринимать изменения, которые другие функции вносят в этот же адрес в стеке. Таким образом, вы можете добавить квалификацию if $_caller_is("func", 0) к точке наблюдения, так что GDB будет уведомлять вас, только если переменная изменится в func.

(gdb) <b>list func</b>
18      int func(int x, int y) {
19         y *= 2;
20         x += y;
21         return x;
22      }
(gdb) <b>b func</b>
Breakpoint 1 at 0x400580: file s2.c, line 19.
(gdb) <b>set $funcbp = $bpnum</b>
(gdb) <b>commands</b>
Type commands for breakpoint(s) 1, one per line.
End with a line saying just "end".
><b># We can only set a watchpoint on a local var</b>
><b># when it's visible, so we'll set it on entry to func.</b>
><b># But we don't want to set it more than once</b>
><b># if func is called more than once,</b>
><b># so we disable the func breakpoint on first use.</b>
><b>disable $funcbp</b>
><b>watch -l x if $_caller_is("func", 0)</b>
><b>commands</b>
 ><b>continue</b>
 ><b>end</b>
><b>continue</b>
><b>end</b>
(gdb) <b>r</b>
Starting program: /home/mp/s2

Breakpoint 1, func (x=5, y=4) at s2.c:19
19         y *= 2;
Hardware watchpoint 2: -location x

Hardware watchpoint 2: -location x

Old value = 5
New value = 13
func (x=13, y=8) at s2.c:21
21         return x;
5
13
[Inferior 1 (process 29495) exited normally]
0 голосов
/ 07 ноября 2018

Есть ли способ настроить GDB на продолжение и продолжить выполнение без запроса пользователя при автоматическом удалении точки наблюдения?

номер

Однако вы можете добавить точку останова по возвращении и добавить к ней команды для удаления точки наблюдения и продолжения. Тогда не будет активной точки наблюдения для автоматического удаления GDB, и поэтому она не остановится, когда функция вернется.

...