Сбой кода в MS Visual Studio 2005 в конфигурации ВЫПУСКА

StackOverflow https://stackoverflow.com/questions/8612

  •  08-06-2019
  •  | 
  •  

Вопрос

У меня есть рабочее пространство для запуска видеокодера H.263 в цикле 31 раз, т.е.основной выполняется 31 раз для генерации 31 различных кодированных битовых потоков.Это рабочее пространство MS Visual Studio 2005 содержит все исходные файлы языка C.Когда я создаю "отладочную" конфигурацию для рабочей области, создаю и выполняю ее, она работает нормально, т.е.он генерирует все 31 выходной файл, как и ожидалось.Но когда я устанавливаю конфигурацию рабочей области на "RELEASE" mdoe и повторяю процесс, кодировщик выходит из строя при каком-то запуске тестового примера.

Теперь для отладки это проверяется следующим образом:

  1. Проанализировал код, чтобы увидеть, не пропускалась ли какая-либо инициализация переменной при каждом запуске кодировщика
  2. Проверил различные параметры рабочей области (Решения) в обоих режимах (DEBUG и RELEASE).

Есть некоторые очевидные различия, но я сделал параметры, связанные с оптимизацией, явно одинаковыми в обоих режимах.

Но все еще не мог разобраться в проблеме и найти решение для этого.Есть какие-нибудь указания?

-Аджит.

Это было полезно?

Решение

Трудно сказать, в чем может заключаться проблема, не внимательно изучив код.Однако...

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

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

Другие советы

Это может быть проблема параллелизма двух потоков.Конфигурация ОТЛАДКИ замедляет выполнение, поэтому проблема не возникает.Но это только предположение.

Интересная проблема..Вы уверены, что у вас нет скрытого кода условной компиляции, который не компилируется в режиме выпуска?т.е.:

#if (DEBUG)
// Debug Code here
#else
// Release Code here
#endif

Это единственное, о чем я действительно могу думать..Сам никогда не испытывал ничего подобного..

Можете ли вы добавить символы отладки в сборку выпуска и запустить ее в отладчике, чтобы увидеть, где и почему произошел сбой?

Да, эти ублюдочные сбои труднее всего исправить.К счастью, вы можете выполнить несколько шагов, которые дадут вам подсказки, прежде чем вы прибегнете к ручному просмотру кода в надежде найти иглу.

Когда он выходит из строя?На каждом тестировании?На каком-то конкретном тесте?Что этот тест делает такого, чего не делают другие?

В чем ошибка?Если это нарушение доступа, есть ли закономерность, по которой это происходит?Если адреса низкие, это может означать, что где-то есть неинициализированный указатель.

Происходит ли сбой программы с конфигурацией отладки, но без подключенного отладчика?Если это так, то, скорее всего, это проблема синхронизации потоков, как указал Джон Смитерс.

Вы пробовали запускать код через анализатор, такой как Purify?Это медленно, но обычно стоит того, чтобы подождать.

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

Вы работаете на архитектуре Intel?Если нет, следите за ошибками выравнивания памяти, они жестко вылетают без предупреждения на некоторых архитектурах, и эти алгоритмы кодека, как правило, часто создают такие ситуации, поскольку они чрезмерно оптимизированы.

Вы уверены, что нет директив предварительной компиляции, которые, скажем, игнорируют какой-то действительно важный код в режиме выпуска, но допускают их при отладке?

Кроме того, реализовали ли вы какое-либо ведение журнала, которое могло бы указать на точную сборку, выдающую ошибку?

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

Еще одна вещь, которую следует учитывать:в режиме отладки переменные инициализируются значением 0XCCCCCCCCCC вместо нуля.Это может иметь неприятные побочные эффекты.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top