Отладка прикрепленного процесса с помощью gdb - как выйти из цикла - PullRequest
5 голосов
/ 05 марта 2011

Я отлаживаю код, который выглядит так:

while (true){
   // do something ...
   size_t i = foo();  // <- bp set here
   if (flag_set) break;
}

// More code follows here ...

Я хочу прервать вызов функции foo (), вызвать ее несколько раз, а затем полностью выпрыгнуть из цикла while (допустим, мы уверены, что флаг будет установлен - поэтому мы можем выйти из цикл.

Как мне полностью выйти из цикла? финиш просто переходит к следующей итерации. То, что я хочу сделать, это выйти из текущего «фрагмента кода» (в данном случае цикла while)

Ответы [ 5 ]

2 голосов
/ 06 марта 2011

Вам нужна команда advance, которая принимает те же аргументы, что и команда break.Используя ваш код в качестве примера (но с добавленными номерами строк):

10 while (true){
11   // do something ...
12   size_t i = foo();  // <- bp set here
13   if (flag_set) break;
14 }
15 
16 // More code follows here ...
17 someFunction();

Скажем, ваша исходная точка останова в строке 12 была точкой останова 1, и после нескольких разрывов вы захотели перейти к строке 17, вы бывведите что-то вроде:

отключить 1

продвижение 17

, что приведет к отключению точки останова 1 (так что она не попадет в остаток цикла), а затем продолжит выполнениепрограмма до тех пор, пока не достигнет строки 17.

1 голос
/ 05 марта 2011

Установите точку останова перед циклом. Затем наведите курсор на вызов foo () и используйте Debug|Run to Line. Это так полезно, что я выделил ему функциональную клавишу.

0 голосов
/ 06 марта 2011

Что вам нужно, это до команды.Это самый простой способ избежать обхода цикла.Начиная с gdb manual :

Продолжайте работать до тех пор, пока не будет достигнута строка источника за текущей строкой в ​​текущем кадре стека.Эта команда используется, чтобы избежать одного шага по циклу более одного раза.Это похоже на следующую команду, за исключением того, что до тех пор, пока, пока не встретится переход, она автоматически продолжит выполнение, пока счетчик программ не станет больше адреса перехода.

0 голосов
/ 05 марта 2011

Попробуйте использовать команду jump.За gdb помощь, в этой системе не менее:

jump -- Continue program being debugged at specified line or address
0 голосов
/ 05 марта 2011

Установите вторую точку останова после цикла. disable точка останова внутри цикла. cont. enable снова точка останова.

Я не знаю более простого способа.

...