GDB проблема с перенаправлением стандартного ввода - PullRequest
6 голосов
/ 02 июня 2010

Я пишу программу для реализации алгоритма максимального потока Dinic по сети.Сети могут быть написаны вручную или загружены из файла с использованием перенаправления stdin.Я был в состоянии использовать GDB для отладки программы с небольшими файлами (около 30 строк), но у меня возникают проблемы, когда я пытаюсь отладить программу с большими файлами (> 1000 строк).Сам код выглядит так:

uint32_t read_lines = 0;
while(!feof(stdin))
{
    err = fscanf(stdin, "%u %u %u\n", &n1, &n2, &c);
    if (err != 3)
    {
         printf("read_lines=%u\n", read_lines); /*for debugging purposes*/
    }
    read_lines += 1;
    /* write to debug file */
    fprintf(debug, "line %u: %u %u %u\n", read_lines, n1, n2, c);
}

Если я запускаю программу без GDB, она запускается, не в порядке, так как генерирует ошибку сегментации (именно поэтому я пытаюсь использовать GDB), но этопроходит через эту часть «разбора» входного файла (и записи его в выходной файл отладки).Однако, если я набираю:

gdb --args ./dinic --mode=NUM --verbose=LOW
(gdb) b 61
(gdb) run < tests/numterc.in

, я получаю:

(gdb) Program exited with 01 code.

, и когда я открываю файл отладки, это около 2000 строк, когда оно должно быть не более 1000, чтодлина входного файла.

Повторяю, это происходит с "большими" файлами, это работает правильно с маленькими.Вопрос в том, что я что-то упускаю при использовании gdb или это ошибка gdb?

Ответы [ 2 ]

7 голосов
/ 02 июня 2010

Хорошо, я мог бы наконец обойти это. Кажется, опция --args не работает, по крайней мере, в моем случае. У меня есть GDB 6.8-Debian и Debian 5.0.4.

Мне нужно было запустить gdb без опции --args:

$gdb ./dinic
(gdb) b 61
(gdb) run --mode=NUM --verbose=LOW < tests/numterc.in

и это сработало хорошо. Может быть, кто-то может найти это полезным.

3 голосов
/ 14 марта 2013

У меня была та же проблема, и я предложил то же решение, чтобы указать аргументы в прогоне. Опция --args может только передавать аргументы, но не может выполнять перенаправление stdin, которое обычно (в контексте без отладки) перенаправляется для вас оболочкой, вызывающей команду. В сеансе отладки ваша команда вызывается gdb, где и список аргументов , и перенаправления задаются значением переменной args. Используя опцию --args, вы инициализируете эту переменную (и файл программы для отладки). Просто сделай

(gdb) show args

и это должно быть инициализировано --mode=NUM --verbose=LOW в вашем случае. Но перенаправления нет, поэтому вы указываете их с помощью run, который переопределяет аргументы! Итак, у вас есть два варианта:

  1. Укажите также перенаправление в аргументах:

    (gdb) set args --mode=NUM --verbose=LOW < tests/numterc.in
    
  2. Укажите также перенаправление при вызове run

...