VS 2005 - Сбои программы командной строки - PullRequest
2 голосов
/ 06 марта 2012

Существует программа командной строки, разработанная в VS 2005. Она обрабатывает некоторый файл и создает выходной файл.Существует входной файл, который вызывает сбой, но только в некоторых случаях.Если программа запущена с использованием командной строки (выпущена версия или отладочная сборка), то происходит сбой во время обработки этого файла.Но, если он запускается из VS 2005, нажав F5 (режим отладки), он работает нормально, не вылетает и результат правильный.Любой намек?Спасибо.

Ответы [ 2 ]

0 голосов
/ 06 марта 2012

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

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

Мы страдаем от них в устаревшей системе C, над которой мы работаем. Я бы сказал, что примерно в 80% случаев, когда мы сталкиваемся с такими ситуациями в однопоточном коде, это происходит из-за неинициализированной памяти некоторого вида (обычно неинициализированной переменной). Для многопоточного кода, который имеет тенденцию вызывать проблемы, связанные с синхронизацией, это чаще всего гонка данных.

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

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

0 голосов
/ 06 марта 2012

Вы можете посмотреть на деструкторы или копировать конструкторы.

Сборка в режиме выпуска может оптимизировать такие вещи, как ненужные копии объектов.

Что происходит, когда вы запускаете программу из командной строки и присоединяетесь к нейпотом?

...