Просмотр локальных переменных в 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, и поэтому она не остановится, когда функция вернется.