2013-06-01 3 views
6

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

Я посмотрел на логику и ожидаемый результат, и между ними нет корреляции. Разумеется, это не логическая ошибка, если она работает на 2 из 3 компьютеров.

Когда я попросил профессора отметить задание, основанное на компьютере школы, он не согласен и не говорит о реальном мире, что, если он не работает только на одном компьютере, моя программа глючит.

Так что я хочу спросить у профессионалов реального мира, что они будут делать в этой ситуации? Как вы можете отлаживать программу, если программа не работает на инструменте, предоставленном вам для тестирования? То есть, если клиент сообщает об ошибке, которую вы не можете воспроизвести самостоятельно, что вы можете сделать? Или как вы собираетесь реплицировать ошибку?

FYI, мой компьютер - это окна, компьютер школы - это Linux, а компьютер профессора - Mac.

+4

«Конечно, это не логическая ошибка, если она работает на 2 из 3 компьютеров». - Не уверен. – Elazar

+2

Если вы предоставите конкретную информацию о программном коде или его выходе, это поможет нам вам помочь. – Havenard

+1

@Havenard Я думаю, что это более интересно как общий вопрос. – Elazar

ответ

5

Я рассмотрел логику и ожидаемый результат, и между ними нет корреляции. Разумеется, это не логическая ошибка, если она работает на 2 из 3 компьютеров.

Добро пожаловать в Undefined Behavior: к сожалению, тот факт, что ваша программа дает правильные результаты на двух (или на двух тысячах, если на то пошло), компьютеров ничего не доказывает. Языковой стандарт пытался дать разработчикам компилятора большую свободу для оптимизации, чтобы эффективность программ на C++ могла оставаться конкурентоспособной с программами, написанными на ассемблере. К сожалению, это оставляет много места для несовместимости между платформами: разные компиляторы и среды исполнения могут генерировать совершенно разные результаты для программ с ошибками. Хуже всего то, что программы с ошибками могут приводить к поведению, которое вы можете разумно ожидать на некоторых платформах, и круто крушить других!

Единственный способ защитить от неопределенного поведения - написать правильные программы. Компиляторы разумно помогают вам, создавая предупреждения в тех местах, где, по их мнению, может возникнуть неопределенное поведение. Включите все предупреждения на самом высоком уровне, скомпилируйте свою программу и исправьте все предупреждения, сообщаемые компилятором. Скорее всего, некоторые из предупреждений объяснят различия между выходом на вашем компьютере и компьютером вашего профессора.

Для отслеживания распространенных ошибок используйте valgrind. Эта программа поможет вам выявить проблемы, связанные с памятью, такие как запись за выделенную область, использование выпущенной памяти, освобождение одного и того же фрагмента памяти несколько раз и т. Д.

+2

Кроме того, может потребоваться написать файл журнала, который документирует действия, выполняемые вашей программой, и внутренние значения (= состояние). – SJuan76

+0

Включение оптимизации может помочь. Поскольку компиляторы могут удалять код, как неправильную проверку NULL. – Alex

+0

@ SJuan76 Идея журнала звучит великолепно. Я напишу свою программу для регистрации состояний и значений переменных на этом пути и попрошу профессора отправить мне файл журнала. – chaser

1

Я ceratinly не «реальный мир профессионального», но я постараюсь (и получить комментарий, я уверен):

Во-первых, я хотел бы посмотреть через код, и попытаться увидеть, является ли существуют ли какие-то «неопределенные поведенческие поведения». см. ответ @ dasblinkenlight.

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

В-третьих, я попытался бы найти аналогичную машину. Конечно, это может быть оригинальный, но поскольку он недоступен, вы можете искать изображения виртуальной машины или проверять, может ли Amazon дать вам что-то подобное (они делают, но я не знаю, какие ОС доступны; предположим, что OS X нет).

Forth, я бы попытался построить версию, загруженную с помощью помощников отладки и протоколирование, и передал ее клиенту, если он готов дать руку.

2

1) Оборонительное программирование. Не думайте, что все будет работать. Вам нужно открыть файл? Убедитесь, что он существует. Вы загружаете структуру данных? Проверьте правильность структуры данных.

1a) Значительные ошибки пользователя: Если файл отсутствует, покажите пользователю «Не удалось найти файл« file.txt »в пути C: \ items». Не продолжайте идти вперед.

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

2a) Учитывая тесную связь, вы можете определить тестовый пример для профессора для запуска на своем компьютере. Проверьте свой журнал против вашего.

Смежные вопросы