Как сделать точку останова сразу после цикла? - PullRequest
1 голос
/ 15 декабря 2011
#include <iostream>
#include <vector>

using namespace std; 
int in;

bool isPrime(int n) {
    for (int i = 3; i <= n; i ++) {
        if (n%i != 0) {
            return false;
        }
    }
    return true;
}

vector<int>* generateVector(int n) {
    vector<int> v;
    for (int i = 2; i < 20; i ++) {
        if (i == n) {
            continue;
        }

        if (isPrime(i+n)) {
            v.push_back(i);
        }
    }
}

int main()
{
    while(1) {
        cin >> in;
        vector<int>* nVectors[21];
        for (int i = 1; i <= 20; i ++) {
            nVectors[i] = generateVector(i);
        } <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    }
}

Это какой-то код C ++. И я хотел бы сделать точку останова сразу после цикла for (стрелка показывает положение). Я нашел один способ решить эту проблему, добавив оператор после того, как он сделал точку останова в этом утверждении. Но добавление высказываний без смысла приводит к плохому самочувствию. Так есть ли лучшее решение?

Я использую GDB для отладки.

PS: я уже знал, как установить точку останова в GDB. Мое намерение состоит в том, чтобы прерваться после завершения цикла for и отобразить его в nVectors. Спасибо.

Извините за все. Дело не в навыке gdb или отладке, но в моем коде есть ошибка. Поэтому, когда я печатаю nVectors, ничего не печаталось. После исправления все предоставленные вами методы работают нормально. Спасибо.

Ответы [ 7 ]

2 голосов
/ 15 декабря 2011

Вы можете использовать точку останова сборки, просто нужно понимать код сборки цикла.

gdb <your_bin>
layout split
break *0x80488ad              #assmebly code will look like 
                              #0x80488ad     jmp    0x8048874 <main+18>     
1 голос
/ 15 декабря 2011

Я не думаю, что есть способ сделать то, что вы хотите напрямую, но вы все равно можете это сделать. Установите точку останова в последнем утверждении цикла. Когда отладчик ломается, переключите вид разборки и прокрутите вниз, пока не найдете место, где вы хотите разместить реальную точку останова. Это будет эффективно устанавливать точку останова по определенному адресу, а не по номеру строки в исходном файле.

1 голос
/ 15 декабря 2011

Нет, для отладчика должна быть какая-то инструкция, чтобы можно было установить точку останова.

1 голос
/ 15 декабря 2011

GDB имеет команду для добавления точек останова

Есть несколько способов, но я думаю, что вам может помочь:

(gdb) перерыв в имени файла: linenumber

так, например, я хочу разбить строку 10 в main.c

перерыв main.c: 10

вы можете попробовать учебник http://www.yolinux.com/TUTORIALS/GDB-Commands.html

0 голосов
/ 15 декабря 2011

Если бы это был я, я бы установил точку останова сборки, как сказали другие.Но если вы не хотите вдаваться в это, есть более простой способ: так как вы знаете количество циклов (20), и оно не очень большое, вы можете установить точку останова для последнего оператора внутри цикла (в вашем случае(единственный оператор внутри цикла), с условием

if (i == 19)

В качестве альтернативы, вы можете установить счетчик игнорирования:

ignore bnum 19

, где bnum - номер точки останова.Возможно, это быстрее, но в вашем случае разница будет незначительной.

См. Точки останова, точки наблюдения и точки перехвата в документации gdb для получения дополнительной информации.

0 голосов
/ 15 декабря 2011

Попробуйте использовать команду until. Полезно избегать одиночного пошагового прохождения цикла. Также из Руководство по GDB :

до тех пор, пока программа не остановится, если она попытается выйти из текущего кадр стека.

0 голосов
/ 15 декабря 2011

Вы можете указать исходный файл и строку конца цикла, например, в командной строке GDB:

b file.c:123

Если вы хотите перейти сразу после цикла for, выя хочу установить разрыв строки закрывающей скобки цикла while ().Но вы можете попробовать оба и посмотреть, что дает желаемый результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...