2017-02-11 16 views
-1

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

В моем случае, в точке A, программа скомпилирована и работает правильно. После некоторой работы, в точке B, она скомпилировалась, но разбилась во время выполнения в режиме деблокирования, а не в режиме отладки, я вернулся к точке A, комментируя мою работу между A и B, она имеет такое же поведение, что и точка B, она компилируется, но сбой только в режиме деблокирования. Я думаю, что это ошибка, которую я сделал намного раньше точки А, которая спала. Это заставляет меня не хотеть закончить мою программу, так как это бесплатная программа, которую я хотел бы поделиться в open source.

+7

Неопределенное поведение является вероятной причиной. Обратите внимание на все предупреждения компилятора. если вы не получили никаких предупреждений, увеличьте уровень предупреждения вашего компилятора и посмотрите, есть ли после него увеличение. – drescherjm

+1

Есть ли у вас примеры кода? Текущие возможности ответа - это путь к широкому (для меня, по крайней мере). –

ответ

1

Любое неопределенное поведение может вызвать такой тип проблемы. Наиболее вероятная причина - запись за границу массива/вектора или чтение оттуда. Это может быть уничтожение объекта, который уже уничтожен. Или проблема многопоточности, которая воспроизводится только тогда, когда выполнение выполняется быстро в режиме деблокирования. Это может быть неинициализированная структура или поле типа POD, не назначенного в конструкторе.

В режиме отладки память распределяется по-разному и в некоторых случаях может содержать нули (когда они переданы вашей программе), а не случайный мусор. Это часто приводит к сбоям только в режиме Release.

Я настоятельно рекомендую вам настроить конфигурацию «RelWithDebInfo» для отладки этой проблемы, например. минуя -g вариант для GCC при создании в выпуске. Таким образом, вы сможете остановиться в отладчике, когда приложение выйдет из строя и определит причину.

В противном случае лучше всего сделать что-то вроде «бинарного поиска» над вашим кодом, чтобы найти точное местоположение аварии. Например, прокомментируйте половину кода, посмотрите, все ли он сбой и т. Д.

Я знаю, что это объяснение немного расплывчато, но надеюсь, что это поможет!

+2

_ «Я знаю, что это объяснение немного расплывчато ...» Ну, что можно было ожидать от слишком расплывчатого и широкого вопроса? –

+0

«В режиме отладки память распределяется по-разному и в некоторых случаях может содержать нули (когда они передаются вашей программе), а не случайный мусор». на самом деле, как правило, это наоборот; куча отладки заполняет освобожденные страницы фиксированным шаблоном, чтобы помочь выявить ошибки неинициализированной памяти. –

+0

@MatteoItalia Я думаю, что вы, возможно, также будете правы в целом, я просто рассказываю из своего опыта. Существуют ли какие-либо корреляционные ссылки? :) –

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

  • Нет связанных вопросов^_^