Отличие компиляции Debug и Release

  • Автор темы ivs4
  • Дата начала
Статус
Закрыто для дальнейших ответов.
I

ivs4

#1
Здравствуйте. Возник такой вопрос. Делаю проект. в котором работаю с Windows Socket. Для обработки подключений к серверу использую оконные сообщения при помощи функции

Код:
	ires=WSAAsyncSelect(sock,this->m_hWnd,WM_SOCK,FD_ACCEPT);
где WM_SOCK - мое сообщение для прослушивающего сокета

Код:
UINT WM_SOCK=RegisterWindowMessage("MYSOCKETMESSAGE");
В этом сообщении я вызываю функцию WSAAcept для создания дочернего сокета

Код:
s2=WSAAccept(s,(SOCKADDR*)(&addr),&size,ConditionFunc,DWORD(&m_explorer));
Теперь самое интересное. При компиляции Win32 Debug все хорошо, а при Win32 Release - первый раз подключение проходит нормально, а на второй вываливается ошибка доступа к памяти. Пока не установил причину сего. Подскажите, пожалуйста, в каком напрвлении искать. И какие различия бывают при компиляции Debug и Release.
 

grigsoft

Well-known member
15.11.2005
735
0
#2
Самая частая проблема - неинициализированные переменные и выделенная память. Поставь WarningLevel=4, может на что укажет. Ну и ручками проверь, что все переменные должны сразу устанавливаться, запись
Код:
int nLen, size;
неправильная. Всегда должно быть
Код:
int nLen=0, size=0;
 
I

ivs4

#3
Все инициализирую, WarningLevel 4 ничего не дал. Даже не знаю. Сейчас ищу в направлении сообщений окна и использования прослушивающего сокета.
 

grigsoft

Well-known member
15.11.2005
735
0
#4
Тогда я бы плясал от ошибки. Какой код падает, к какой памяти, кто эту память выделяет и т.д. Ну и синхронизацию потоков проверить.
 

Kmet

Java Team
25.05.2006
1 036
8
#5
Как вариант такое поведение возможно при неверном использовании ASSERT, когда в нем происходит не только проверка, например ASSERT(*p=new char[10]). Надуманный конечно пример <_<
 
I

ivs4

#6
Появилась зацепка. Ошибка уходит если в Project Settings в C/C++ -> Code generation -> Use run-time library вместо Multithreaded DLL выбрать Debug Multithreaded DLL. Хотелось бы узнать, чем отличаются проекты при данных установках.
 

Kmet

Java Team
25.05.2006
1 036
8
#7
MSDN:Fixing Release Build Problems
MSDN:Common Problems When Creating a Release Build
народный опыт по данной проблеме ))
 
I

ivs4

#8
Сократил все телодвижения с памятью до минимума. Однозначно выходит, что проблема при повторном вызове WSAAccept. Очень странно, Америка здесь не открывется. Эта функция вызывается в обработчике моего сообщения на состояние слушающего сокета FD_ACCEPT. Есть похожие примеры. Может ли быть проблема в области вызова WSAAsyncSelect

Код:
ires=WSAAsyncSelect(sock,this->m_hWnd,WM_SOCK,FD_ACCEPT);
или привязки функции к сообщению

Код:
UINT WM_SOCK=RegisterWindowMessage("MYSOCKETMESSAGE");
...
ON_REGISTERED_MESSAGE( WM_SOCK, OnMyMessage )
...
void CWSServerDlg::OnMyMessage() 
{
...
const MSG *swl=GetCurrentMessage();
ev=LOWORD(swl->lParam);//идентификатор события на сокете
er=HIWORD(swl->lParam);//код ошибки
s=SOCKET(swl->wParam);//дескриптор прослушующего сокета

s2=WSAAccept(s,(SOCKADDR*)(&addr),&size,NULL,0);
...
}
И еще есть наблюдение. Если свернуть окно до начала подключения клиентов и так оставить, то вроде работает. Если же развернуть, щелкнуть мышью в окне, то вылезает ошибка памяти.
Большая просьба поделиться соображеними.
 
C

Cisco

#9
Есть ли функция, позволяющая изменять текст в записи listbox, т.е. противоложность GetText() - что-то вроде "PutText()". InsertString - не хочется использовать, т.к. просто надо изменить текст.
 
A

artiom_kh

#10
И еще есть наблюдение. Если свернуть окно до начала подключения клиентов и так оставить, то вроде работает. Если же развернуть, щелкнуть мышью в окне, то вылезает ошибка памяти.
Большая просьба поделиться соображеними.
Выложи проект, пипл посмотрит
 
Статус
Закрыто для дальнейших ответов.