Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Опять debug & release

24K
18 января 2007 года
Northwood
3 / / 18.01.2007
Добрый день!

Имеется такая проблема:
У меня приложение работает с сетью по TCP/IP протоколу.
Для этого при инициализации создаётся новый поток, назовём его "A", с помощью функции AfxBeginThread. Все параметры, такие как размер стека, приоритет, по умолчанию (0).
При успешном подключении по сети, из потока "A" создаётся ещё один поток "B", который в цикле принимает по сети от сервера информацию с помощью recv(), и обрабатывает её.
Далее у меня прорабатывается такая ситуация: сервер, к которому подключилось моё приложение, сначала посылает строку со своим титульным наименованием, затем посылает инфу об ошибке и разрывает соединение (так нужно по сценарию, прорабатываю ошибочную ситуацию).
Приложение в этом случае закрывает сокет, и полученное от сервера сообщение об ошибке выдаёт на экран, после чего завершает оба созданных потока "A" и "B".

Проблема в следующем:
В дебаге всё работает прекрасно,
в релизе - мало того что сразу после разрыва соединения, две локальные переменные int и CString, в которых записалась полученная от сервера инфа об ошибке, оказываются перетёртыми мусоросм, так ещё, в момент завершения потока "B" приложение слетает выдавая сразу две ошибки:
"The instruction "0x7c5737ec" referenced memory at "0xf120f3e0". The memory could not be "written".
"The instruction "0x7c5737ec" referenced memory at "0xeceeede0". The memory could not be "written".

Расставляя в разные точки функции потока MessageBox, выяснил, что программа вылетает именно в момент, когда в функции потока "B" встречается команда retun 0;

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

Помогите, что делать ?
355
18 января 2007 года
<SCORP>
786 / / 21.10.2006
на вопрос вряд ли отвечу, но всё-таки дай лучше кусок кода -- так хоть будет понятно о чём речь
24K
18 января 2007 года
Northwood
3 / / 18.01.2007
Всё, уже поборол проблему.

Оказалось дело просто. Размер двух массивов char для хранения разной текстовой информации я сделал маловатым. Чуть-чуть не расчитал. При копировании в них строк длинее чем сам массив, в режиме релиз происходило перетирание других переменных и самого стека, чего не происходило в режиме дебаг.
284
19 января 2007 года
michael_is_98
587 / / 25.02.2005
Обратите внимание на параметр Default Char Unsigned подраздела Language раздела C/C++ окна свойств проекта
562
19 января 2007 года
tarekon
175 / / 19.08.2003
Цитата: michael_is_98
Обратите внимание на параметр Default Char Unsigned подраздела Language раздела C/C++ окна свойств проекта



А это к чему тут?

284
19 января 2007 года
michael_is_98
587 / / 25.02.2005
Если в debug поставлен Default Char Unsigned Yes, то присваивание русских букв переменной типа char не будет вызывать исключения.

Если в release эта опция отключена и используется присваивание русских букв переменной типа char, то выдается подобное сообщение об ошибке.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог