команда gdb «watch» прерывает мой цикл?

#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 для автоматических переменных очищаются с действительно неясным предупреждением, и после этого он запускается как бесконечный цикл.