Вопрос об отказе сегментации

Просто для уточнения что-то многие люди, кажется, отсутствует:

TDD, в смысле "тест проваливающего записи, пишет код, чтобы сделать тестовую передачу, осуществить рефакторинг, повториться" , Является обычно самым эффективным и полезным, когда Вы пишете единица тесты.

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

"Автоматизированное" тестирование обычно относится к высокоуровневой интеграции/принятию/функциональным испытаниям - Вы можете делать TDD вокруг этого уровня тестирования, и это часто - единственная опция для в большой степени ui-driven код, но необходимо знать, что этот вид тестирования более хрупок, тяжелее к тесту записи сначала и никакой замене для поблочного тестирования.

10
задан Martin B 25 November 2010 в 07:42
поделиться

6 ответов

Это потому, что вывод из printf () буферизован. Вы можете добавить fflush (stdout); сразу после вашего printf , и он будет печатать.

Также вы можете сделать это:

fprintf(stderr, "error string");

, поскольку stderr является не буферизован.

Есть также связанный с этим вопрос .

20
ответ дан 3 December 2019 в 14:11
поделиться

Если ошибка сегментации возникает слишком скоро после printf, и выходной буфер не был очищен, вы не увидите эффекта printf.

5
ответ дан 3 December 2019 в 14:11
поделиться

Большинство реализаций libc буферизуют вывод printf. Обычно достаточно добавить новую строку (\ n) к выходной строке, чтобы заставить ее очистить содержимое буферов.

5
ответ дан 3 December 2019 в 14:11
поделиться

Вы можете очистить выходной буфер сразу после printf, чтобы убедиться, что это произойдет до ошибки seg. Например. fflush (стандартный вывод)

3
ответ дан 3 December 2019 в 14:11
поделиться

Случайный совет: если вы пытаетесь отладить ошибки сегментации, обязательно попробуйте valgrind . Так становится намного проще!

3
ответ дан 3 December 2019 в 14:11
поделиться

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

Хорошо это или плохо, но это далеко не единственная возможность. Ошибка сегментации означает, что ОС обнаружила, что вы сделали что-то не так, как правило, записано вне выделенной памяти. К лучшему или худшему (в основном, к худшему) выполнение почти чего-либо в такой ситуации может достаточно изменить то, что программа делает внутри, чтобы предотвратить обнаружение проблемы, по крайней мере, в то время / в ситуации, когда она была обнаружен ранее.

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

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

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

0
ответ дан 3 December 2019 в 14:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: