Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Debug и Release VS отладка 
V
    Опции темы
Zeit
Дата 12.6.2007, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 5.5.2007

Репутация: нет
Всего: нет



Код

int numberOfPagesBefore = (int)aDoc.Content.get_Information(WdInformation.wdActiveEndAdjustedPageNumber);
<бла-бла>
int numberOfPagesAfter = (int)aDoc.Content.get_Information(WdInformation.wdActiveEndAdjustedPageNumber);
if ((numberOfPagesBefore) != (numberOfPagesAfter))
{
      бла-бла
}

Проблема в том, что при отладке, через ф10 все работает нормально и когда numberOfPagesBefore не равно numberOfPagesAfter, то в цикл в иф заходит, а когда запускаю релиз, то входит не всегда. хоть убейте, но я не пойму почему((
входные данные одинаковые, а результат при ф10 и релизе разный!
PM MAIL   Вверх
tol05
Дата 13.6.2007, 08:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



В релизе работает оптимизатор кода...
компилятор просчитывает варианты оптимизации, он видит, что numberOfPagesBefore == numberOfPagesAfter, поэтому просто убирает все эти проверки из кода...
Тоже самое, кстати, часто случается в ситуациях типа
Код

int SomeFunction()
{
...
...
...
...
int i =0;
return i; //компилятор не будет выделять память для i, он просто напишет "return 0" (переменной i на 4 байта вообще не будет)
}

код типа 
Код

int SomeFunction()
{
...
string str ="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
return 5;

превратится в 
Код

int SomeFunction()
{
...
return 5;

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


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
stab
Дата 13.6.2007, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 22
Всего: 48



Цитата(tol05 @  13.6.2007,  12:47 Найти цитируемый пост)
компилятор просчитывает варианты оптимизации, он видит, что numberOfPagesBefore == numberOfPagesAfter, поэтому просто убирает все эти проверки из кода...

проблема точно не в этом, компилятор не может такой вариант просчитать, aDoc.Content.get_Information мало того что не может возвращать гарантированно константное значение, так плюс к этому вообще взаимодействует с внешним active-x объектом, по отношению к среде .net. JIT-компилятор тоже такое упразднить не может.


Zeit, что за код на месте "<бла-бла>"?


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
tol05
Дата 13.6.2007, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



если в <бла-бла> numberOfPagesBefore не получает нового значения (а это компилятор может просчитать), то
Код

(int)aDoc.Content.get_Information(WdInformation.wdActiveEndAdjustedPageNumber) == (int)aDoc.Content.get_Information(WdInformation.wdActiveEndAdjustedPageNumber)

smile
т.е. компилятор даже не будет анализировать (да он и не умеет этого) вызовы функций, просто х.MyFunction(y) всегда равно х.MyFunction(y) если х и y не изменились. smile

Это сообщение отредактировал(а) tol05 - 13.6.2007, 09:31


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Naum
Дата 13.6.2007, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 743
Регистрация: 7.9.2005
Где: Саратов, ул. Поса дского, 298

Репутация: 8
Всего: 15



Zeit, отлаживать все-таки нужно в Debug-конфигурации. Release - он на то и Release, что его не нужно уже отлаживать. smile Самое главное, реультат работы метода правильный?
tol05, насчет последнего высказвания позволь не согласится smile. Как раз из-за того, что 
Цитата(tol05 @  13.6.2007,  10:15 Найти цитируемый пост)
да он и не умеет этого

компилятор вызовы этих функций не выкидывает. Иначе
Код

dateBefore = System.DateTime.Now;
dateAfter = System.DateTime.Now;
if (dateBefore != dateAfter)
{
DoSomething();
}

компилятор опять будет считать, что dateBefore == dateAfter? ;)


--------------------
У нас всего два праздника Новый год и ТЯПница.
PM MAIL ICQ   Вверх
Zeit
Дата 13.6.2007, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 5.5.2007

Репутация: нет
Всего: нет



Код на месте <бла-бла> такой:
Код

int numberOfPagesBefore = (int)aDoc.Content.get_Information(WdInformation.wdActiveEndAdjustedPageNumber);//количество страниц до создании записи
                start = aDoc.Sentences[aDoc.Sentences.Count].End - 1;
                //вставка и изменение шаблона
                CopyTemplate(tDoc, aDoc);
                SearchAndReplace(aDoc, "<cons>", string.Format("{0}", CreateVarNumber(k)));
                str = files[i].Remove(0, files[i].LastIndexOf("\\") + 1);
                SearchAndReplace(aDoc, "<bmpFN>", str.Remove(str.Length - 4));
                PasteImage(aDoc, Find(aDoc, "<bmp>"), files[i]);
                int numberOfPagesAfter = (int)aDoc.Content.get_Information(WdInformation.wdActiveEndAdjustedPageNumber);//количество страниц после создании записи
                //если номер страницы, где находится начало шаблона больше номера страницы, где находится его конец, то измененный шаблон вырезается
                //и делается разрыв страницы, после чего измененный шаблон вставляется уже на новую страницу
                if ((numberOfPagesBefore) != (numberOfPagesAfter))
                {
                }

Дело в том, что numberOfPagesBefore и numberOfPagesAfter равны не всегда, на каждый, наверное, третий шаг они не равны. вот в этом-то вся и проблема(
Нет, вы немножко не поняли. Если без ф10, то он в дебаге некорректно работает.
PM MAIL   Вверх
tol05
Дата 13.6.2007, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



Цитата(Naum @  13.6.2007,  10:07 Найти цитируемый пост)
компилятор опять будет считать, что dateBefore == dateAfter? ;) 

Naum, компилятор C# - нет (MSIL версий Debug и Release в этом плане не сильно отличается), а JIT - компилятор - вполне smile
Ведь даже в дебаге, хоть релиз, хоть дебаг, а код-то через JIT пропускается, не так ли?

К тому же, разные версии компиляторов работают очень по-разному... 

Ну да ладно, я могу ошибаться smile В конце-концов, я вижу, что дело не в оптимизации... Подебагать еще надо...

P.S. Все, понял, нашел smile Рихтер, "C# via .Net"
Цитата

При создании неоптимизированного IL-кода компилятор С# создает в коде команды NOP (no-operation — «пустая команда») — они 
нужны для поддержки функции «редактирование и продолжение  выполнения» в процессе отладки. Также команды NOP облегчают отладку кода за счет расстановки точек останова на управляющих командах, таких как for, while, do, if, else, а также блоках try, catch и finally. Предполагают, что это дополнительная возможность платформы, но лично меня эти команды-пустышки часто раздражали, когда при пошаговой отладке кода приходилось выполнять их по одной. Создавая оптимизированный код, компилятор С# удаляет команды NOP. 


Вот почему в релизе нельзя остановится в цикле smile

Это сообщение отредактировал(а) tol05 - 13.6.2007, 12:31


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
archeg
Дата 13.6.2007, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 612
Регистрация: 6.1.2007
Где: Киев

Репутация: 11
Всего: 27



Цитата(tol05 @  13.6.2007,  12:10 Найти цитируемый пост)
Naum, компилятор C# - нет (MSIL версий Debug и Release в этом плане не сильно отличается), а JIT - компилятор - вполне 
Ведь даже в дебаге, хоть релиз, хоть дебаг, а код-то через JIT пропускается, не так ли?

JIT компилирует только один раз, после этого закомпиленый нейтив работает как в кеше - соответственно он не может быть уверен что (int)aDoc.Content.get_Information(WdInformation.wdActiveEndAdjustedPageNumber) не возвращает например рандомное значение - а значит может быть как равно так и не равно. Он не должен убирать условие.


Zeit, попробуй как-то код поменять, сделать чуть по-другому - всякое бывает, может баг JIT  smile 


--------------------
ИМХО задница есть универсальный интерфейс. Ибо через задницу можно сделать абсолютно ВСЕ (bash.org.ru)

Дядька всегда можно спросить в аське, если не задалбывать - не откажет smile
И вообще, на самом деле я студент, и ненавижу обращение на "Вы") Тут все свои  ;)
PM MAIL ICQ Jabber   Вверх
tol05
Дата 13.6.2007, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



Цитата(archeg @  13.6.2007,  12:50 Найти цитируемый пост)
JIT компилирует только один раз, после этого закомпиленый нейтив работает как в кеше
 пока процесс не будет выгружен из памяти  smile 
Каждый раз при дебаге создается новый процесс, что хорошо видно в студии через окошко "Output



--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
stab
Дата 13.6.2007, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 22
Всего: 48



Zeit, попробуй в качестве теста после строчки PasteImage(aDoc, Find(aDoc, "<bmp>"), files[i]) вставить Thread.Sleep(1000), а лучше:

Код

for (int i = 0; i < 10; i++)
{
    Thread.Sleep(100);
    Application.DoEvents();
}


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


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Zeit
Дата 14.6.2007, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 5.5.2007

Репутация: нет
Всего: нет



cully, спасибо! Проблема решена и можно смело сдавать курсовик =) 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0799 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.