Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Проблема с release версией !


Автор: DigitSphinx 25.5.2007, 22:03
При запуске проги возникает ошибка (обнаружена ошибка. Приложение будет закыто …) я нажимаю на (отладка) , запускается Visual Studio 2005 и открывает мне код с Break Point’ом на этой строке :
Код

str.Format(_T("%d"), int’овская переменная );

str объявленна как CString str;
в Debug все отл. Работает !
в чем может быть проблема ?
сорри что не в том разделе !

Автор: Hurricane 25.5.2007, 23:40
Так вот навскидку не скажу, что именно не так.

Разница между Debug и Release в том, что в Debug все объявленные переменные инициализирутся нулями, а в Release - нет, в них будет находится какой-то мусор. Проверь, есть ли где-то неинициализированные переменные.


Автор: DigitSphinx 26.5.2007, 00:29
Все разобрался !, проблема была в int’овской переменной !
Но теперь я вообще офигел , как в Debug’е работало .
Потому что переменная берется с указателя 
Код

str.Format(_T("%d"), SHeap[i].SHEET->ParentSegment->ParentTask->TaskNum);
 
при запуске этот указатель пустой,
(в конструкторе явно указанно) 
Код

SHeap[i].SHEET = NULL;

По этому и вылизала ошибка типа “Access violation”.
а в дебаге он игнорирует ошибку и работает по алгоритму , т.е. фигня !
P.S. Надо поразбираться !
Спасибо Hurricane, может в дебаге и работало потому что он инициализирует переменные нулями !

Автор: Ln78 26.5.2007, 04:16
Цитата(Hurricane @  25.5.2007,  23:40 Найти цитируемый пост)
Разница между Debug и Release в том, что в Debug все объявленные переменные инициализирутся нулями

В данном случае это непринципиально, но всё же уточню - не нулями, а фиксированными значениями, чередующимися парами нулей и единиц. Например, для целой переменной это значение 0xCCCCCCCC

Автор: dumb 26.5.2007, 11:56
Цитата(Ln78 @  26.5.2007,  04:16 Найти цитируемый пост)
не нулями, а фиксированными значениями, чередующимися парами нулей и единиц. Например, для целой переменной это значение 0xCCCCCCCC

то, что значение CC представляет из себя в бинарном виде "11001100", в данном случае не имеет никакого значения. все неинициализированные данные и "охранные зоны" забиваются CC для того, чтобы в случае перехода выполнения на данные, сразу сработало отладочное исключение - int 3, опкод которого и есть CC. smile

Автор: Любитель 28.5.2007, 00:59
[немного_оффтоп]
Цитата(dumb @  26.5.2007,  11:56 Найти цитируемый пост)
для того, чтобы в случае перехода выполнения на данные

А не проще это сделать через атрибуты секций? Да и вообще очень специфичная ситуация. Разумней было бы забивать данными, более осмысленными с точки зрения данных, а не кода. ИМХО, конечно.
[/немного_оффтоп]

Автор: dumb 28.5.2007, 04:41
Цитата(Любитель @  28.5.2007,  00:59 Найти цитируемый пост)
А не проще это сделать через атрибуты секций?

smile не совсем понял о каких секциях речь - если о PE, то стек, например, не сопоставляется ни с какими секциями. а основным препятствием является невозможность назначения "правильного" набора атрибутов ввиду их инклюзивности(до появления DEP): PAGE_READONLY и PAGE_READWRITE разрешает выполнение, PAGE_EXECUTE - чтение(к рассматриваемому моменту не относится). т.е. до появления DEP запретить выполнять данные было невозможно.

Цитата(Любитель @  28.5.2007,  00:59 Найти цитируемый пост)
Разумней было бы забивать данными, более осмысленными с точки зрения данных, а не кода.

более осмысленные с точки зрения данных значения(типа 0 или -1) могут скрывать ошибки "неинициализированности", с чем, собственно, и боремся... smile а так(CC) - сразу двух зайцев: и отладочное исключение в случае выполнения, и "достаточно мусорное" значение для неинициализированных переменных.

Автор: Любитель 28.5.2007, 07:39
Цитата(dumb @  28.5.2007,  04:41 Найти цитируемый пост)
до появления DEP

Ну, во-первых DEP существует уже давно. Во-вторых, я в принципе не пойму - будет выброшено int 3 при нашей зверской (и так часто встречающейся smile ) попытке выполнения кода локальной переменной. Мы разве сможем что-то толком понять.?

Цитата(dumb @  28.5.2007,  04:41 Найти цитируемый пост)
огут скрывать ошибки "неинициализированности", с чем, собственно, и боремся

Юлин, а я думал наоборот. Хотя, конечно, такое объяснение гораздо логичнее smile Только тогда получается, что (в целом) дебаг должен работать хуже релиза smile Если мы непроинитили нашу переменную, которая легла на место старой, заиниченной и нормально юзаемой в свое время переменной, то, вероятно (не более того, конечно), что в релизе там будет осмысленное значение и может с ним прога сработает. В дебаге же всегда будут одни це-це-це...

Почему же на релиз обычно больше ругаются? smile Хотя, если честно у меня почему-то или работает и то, и то (я даже не про VC++ - а вообще). Или не работает ничего. За исключением очень исключительных случаев, когда очень агрессивная оптимизация чтой-то ломала. Но у меня такое было буквально несколько раз. И то при выяснении (ради любопытства) обычно находился в bug notes компилера подобный случай.

Автор: Hurricane 28.5.2007, 09:14
Цитата(Любитель @  27.5.2007,  23:39 Найти цитируемый пост)
Юлин, а я думал наоборот. Хотя, конечно, такое объяснение гораздо логичнее  Только тогда получается, что (в целом) дебаг должен работать хуже релиза  Если мы непроинитили нашу переменную, которая легла на место старой, заиниченной и нормально юзаемой в свое время переменной, то, вероятно (не более того, конечно), что в релизе там будет осмысленное значение и может с ним прога сработает. В дебаге же всегда будут одни це-це-це...

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

Пытаюсь сообразить, почему я написал про инициализацию нулями. Ничего в голову не приходит  smile  Конечно же, что там не нули (ну, скажем, вперемешку с единичками  smile ).

Автор: nickless 28.5.2007, 16:20
В дебаге по другому расположены переменные в памяти, между ними может быть место для дебажных переменных итд, а в релизе включается оптимизация на полную, переменные сдвигаются поближе, меняются местами и небольшие вылезы за пределы массивов становятся гораздо заметнее  smile 

Автор: dumb 29.5.2007, 00:38
Цитата(nickless @  28.5.2007,  16:20 Найти цитируемый пост)
в релизе ... небольшие вылезы за пределы массивов становятся гораздо заметнее

в дебаге между переменными кладутся "охранные зоны", которые проверяются при выходе из области видимости объявленных переменных: если будет выход за пределы, отладчик будет "ругаться" - заметнее, imho, некуда... smile

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

Автор: Любитель 2.6.2007, 12:37
dumb, эти CD, CC - это конкретно к VC++ относится? Я сомневаюсь, что все компилеры следуют столь интуитивно понятным правилам  smile 

Автор: dumb 2.6.2007, 13:45
Цитата(Любитель @  2.6.2007,  12:37 Найти цитируемый пост)
эти CD, CC - это конкретно к VC++ относится?

smile тема вроде как именно о VC и была...

Цитата(Любитель @  2.6.2007,  12:37 Найти цитируемый пост)
Я сомневаюсь, что все компилеры следуют столь интуитивно понятным правилам

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)