Проблема с отладкой в ​​Eclipse CDT - PullRequest
2 голосов
/ 17 октября 2010

Я пытаюсь отладить простую программу Hello World, которая поставляется с Eclipse CDT. Запуск программы обычно работает нормально, но при запуске в режиме отладки puts() ничего не выводит на консоль.

Я попытался запустить ту же самую программу с GDB напрямую, и она работает нормально, печатая "!!!Hello World!!!", как и ожидалось.

Почему puts() ничего не печатает при работе в режиме отладки через Eclipse?

Я в Windows с установленным MinGW, работаю с gcc 4.5.0, gdb 7.2 и CDT 7.0.1

Ответы [ 3 ]

4 голосов
/ 12 апреля 2011

Благодаря швейцарцу указал верное направление.
Добавление fflush(stdout) после каждого предложения printf, puts не подходит для большого проекта, когда отладка (Когда освобождает , лучше использовать fflush() в соответствующем время).
Затем мы можем использовать директивы препроцессора #ifdef && setbuf().
В Eclipse ваш проект на C -> свойства -> сборка C / C ++ -> настройки: Confgiguration = "Debug [Active]" -> Настройки инструмента -> Компилятор GCC C -> Символы -> Добавить "_DEBUG",

Затем в вашем main (), используя:

#ifdef _DEBUG
setbuf(stdout,NULL); // this disables buffering for stdout.
#endif
1 голос
/ 18 октября 2010

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

ОДНАКО! Eclipse CDT запускает GDB с STDOUT в режиме блочной буферизации, что означает, что он будет сбрасывать STDOUT, только когда достигнет определенного размера, или если он сбрасывается вручную Поскольку строка "!!! Hello World !!!" так коротко, буфер для STDOUT никогда не будет сброшен, пока не будет сделан вызов fflush().

Мне удалось решить эту проблему, добавив fflush(stdout); после вызова puts().

Вот полученный код:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    puts("Hello World!"); /* prints !!!Hello World!!! */
    fflush(stdout);
    return EXIT_SUCCESS;
}
1 голос
/ 18 октября 2010

Вы пытались добавить \ n в оператор пут? То есть ставит ("Hello World! \ n"); Иногда терминалу требуется \ n для очистки потока.

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