#gcc #gdb #conditional-statements #break #watch
#gcc #gdb #условные операторы #перерыв #Смотреть
Вопрос:
Во-первых, у меня есть бесконечный цикл, подобный этому:
#include<stdio.h>
int main(){
int i=0;
int b=1;
while(b)
{
i;
printf("%dn",i);
}
return 0;
}
Я попытался скомпилировать его, запустить внутри gdb и прервать, когда «i == 10», поэтому я:
gcc 5.c -g amp;amp; gdb a.out
(gdb) b main
Breakpoint 1 at 0x4005a3: file 5.c, line 3.
(gdb) r
Starting program: /home/console/a.out
Breakpoint 1, main () at 5.c:3
3 int i=0;
(gdb) watch i==10
Hardware watchpoint 2: i==10
(gdb) r
The program being debugged has been started already.
Ну, программа, похоже, завершается после «r». Почему он не прерывается, когда «i == 10»?
Спасибо.
Ответ №1:
Когда вы просматриваете свою auto
переменную, отладчику должен быть доступен контекст.
При повторной попытке run
запуска программы gdb предупреждает вас: вы потеряете контекст и, следовательно, свою аппаратную контрольную точку (автоматические переменные будут освобождены и перераспределены).
r/run
команда запускает программу с самого начала. Вы путаете это с continue
. Просто точки наблюдения HW для автоматических переменных очищаются с действительно неясным предупреждением, и после этого он запускается как бесконечный цикл
Чтобы избежать этого, существует несколько альтернатив, каждая из которых имеет свои плюсы и минусы:
- просто выполните
c
(продолжить) вместоr
: ваша точка наблюдения hw будет работать: минусы: вы не можете вводитьr
(вы выживете) - замените вашу аппаратную точку останова на условную точку останова:
b 5.c:9 if i==10
(строка 9 — это строкаprintf
). минусы: производительность будет снижаться, потому что точка останова будет срабатывать каждый раз, и gdb решает прерывать или нет в зависимости от условия - сделать g
i
глобальным: позволяет делать то, что вы хотели (перезапуск) без предупреждения, потому что в этом случаеi
это не автоматическая переменная. минусы: глобальные переменные — не лучшая вещь (особенно при именованииi
:))
Комментарии:
1. Спасибо, они работают для меня. Я просто смутился, почему после установки watch или «if» программа будет завершена, если я использую команду «r» без какой-либо печати. Я полагаю, «r» будет запускать бесконечный цикл и печатать много сообщений?
2. если вы используете
r/run
command, она запускает программу с самого начала. Вы путаете это сcontinue
. Просто точки наблюдения HW для автоматических переменных очищаются с действительно неясным предупреждением, и после этого он запускается как бесконечный цикл.