Вы можете дать команде 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]