Просмотр локальных переменных в GDB без остановки выполнения

Я пытаюсь, чтобы 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 ответа

Решение

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

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

(GDB) список функций18 int func (int x, int y) {
19 лет *= 2;
20 х += у;
21 возврат х;
22      }
(GDB) B Func Точка останова 1 в 0x400580: файл s2.c, строка 19.
(gdb) установить $ funcbp = $ bpnum(GDB) команды Введите команды для точки останова (ов) 1, по одной на строку.
Конец строки с надписью "конец".
># Мы можем установить точку наблюдения только на локальную переменную># когда он виден, поэтому мы установим его при входе в func.># Но мы не хотим устанавливать его более одного раза># если func вызывается более одного раза,># поэтому мы отключаем точку останова func при первом использовании.>отключить $ funcbp>посмотреть -lx if $ _caller_is ("func", 0)>команды
 >продолжить
 >конец>продолжить>конец(GDB) R Запуск программы: /home/mp/s2

Точка останова 1, func (x=5, y=4) на s2.c:19
19 лет * = 2;
Аппаратная точка наблюдения 2: -расположение x

Аппаратная точка наблюдения 2: -расположение x

Старое значение = 5
Новое значение = 13
func (x=13, y=8) на s2.c:21
21 возврат х;
5
13
[Нижний 1 (процесс 29495) вышел нормально]

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

Нет.

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

Другие вопросы по тегам