Загадочная проблема с отладкой при попытке использовать printfs - PullRequest
0 голосов
/ 12 января 2011

Хорошо, ребята.Я никогда не сталкивался с этим раньше, и это уму непостижимо и нелогично.У меня есть несколько сложный цикл, и я хочу попробовать и посмотреть, все ли работает, поместив несколько операторов printf.Я смотрю промежуточные продукты, используя printf, и проверяю, что ответ в порядке.Затем, когда я закомментирую printf для промежуточных продуктов, ответ будет НЕПРАВИЛЬНЫМ.Кто-нибудь когда-нибудь сталкивался с этим?Это сводит меня с ума, и я не понимаю, как printfs может изменить ответ .... X_x Если это помогает, я использую компилятор ac / c ++ для DSP.Спасибо за любой совет ..

Вот фрагмент ...

printf("splitBackground = %d, numWindowPoints = %d\n", splitBackground, numWindowPoints);
splitBackground = splitBackground/numWindowPoints;
printf("%d ", splitBackground);

Это хорошо, но когда я закомментирую первую строку кода, это оказывается чрезвычайно неправильно.(

Ответы [ 4 ]

7 голосов
/ 12 января 2011

Скорее всего, вы допустили ошибку в коде, что привело к неопределенному поведению.И «неопределенный» подразумевает, что «он может работать при некоторых обстоятельствах».

Почему вставка printf заставляет его работать?Некоторые возможности:

Он изменяет временные отношения между различными частями вашей программы или между вашей программой и остальным миром.

Вызов printf запрещает оптимизацию компилятора, которая в противном случае могла бы иметь место.

Вызов printf изменяет внутреннее состояние стандартной библиотеки таким образом, чтобы предотвратить возникновение ошибки.

Вызов printf взаимодействует с оборудованием таким образом, чтобы предотвратить возникновение ошибки..

(Обратите внимание, что многие из тех же соображений верны и при работе под отладчиком - таким образом, термин «heisenbug»: ошибка, которая возникает, только если вы не наблюдаете за ней.)

1 голос
/ 12 января 2011

Лично я бы печатал на stderr, а не на stdout.

Если вы используете IDE, я бы в полной мере воспользовался отладчиком, чтобы попытаться решить ваши проблемы. Как и в Visual Studio 2010, Eclipse или Netbeans, добавьте точки останова и медленно перемещайтесь по строкам кода.

0 голосов
/ 12 января 2011

Возможно, это повреждение стека, и ваши printf как-то расширяют стек или вызывают защитную страницу или что-то в этом роде.Но трудно сказать что-либо без остального кода.

0 голосов
/ 12 января 2011

ваш printf может иметь побочные эффекты (изменить некоторые данные, чтобы получить правильные результаты). в любом случае было бы очень полезно взглянуть на упрощенный пример проблемного кода

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