Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Вылет на CBLProcInfo::GetNParams (число прочтений - 2970 )
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Вылет на CBLProcInfo::GetNParams
22. Февраля 2008 :: 22:38
Печать  
Отлаживаю генерацию событий. Есть следующий код для поиска процедуры в модуле:
Код
Выбрать все
	m_ProcNum = pModule->FindProc (ProcName.c_str (), FALSE);
	if (m_ProcNum == -1) m_ProcNum = pModule->FindProc (ProcName.c_str (), TRUE);

	if (m_ProcNum == -1)
		throw std::logic_error ("Указанный обработчик события не найден");

	m_pModule = pModule;

	CBLProcInfo ProcInfo;
	if (!pModule->GetProcInfo (m_ProcNum, ProcInfo))
		throw std::runtime_error ("Не удалось получить данные об обработчике");

	m_NumArgs = ProcInfo.GetNParams ();

 



Этот нормально работает для обычных модулей вообще везде. Если же требуется работать с ГМ, начинаются проблемы. Симптомы следующие:

1) Без 1С++ работает нормально.
2) При наличии 1С++ 2.5 без Формекс работает нормально.
3) При наличии 1С++ 2.0 вылетает на строке "m_NumArgs = ProcInfo.GetNParams ();"
4) При наличии 1С++ 2.5 с какой-то старой версией Формекс эта строка отрабатывает нормально, но в качестве количества параметров выдается мусор - в результате падает в другом месте.
5) При наличии 1С++ 2.5 с последней версией Формекс работает нормально.

Запуск дебагерной сборки 1С++ 2.0 под отладчиком дает следующие результаты:
1) Падает на коде:
Код
Выбрать все
int CWrapModule::FindFunction(char const * lpFnName)const
{
	int i;

	for (i = 0;glFnNames[i].rusName != NULL;i++){
		if (!stricmp(lpFnName,glFnNames[i].rusName)) // ЗДЕСЬ ПАДАЕТ
			return i;
		if (!stricmp(lpFnName,glFnNames[i].engName))
			return i;
	}
	return -1;
};

 



2) Стек вызовов такой:
Код
Выбрать все
>	1CPP.dll!CWrapModule::FindFunction()  Line 266 + 0x17 bytes	C++
 	1CPP.dll!CWrapModule::WrapFindFunc()  Line 360 + 0xc bytes	C++
 	1CPP.dll!CWrapModule::WrapGetNParams()  Line 318 + 0x1b bytes	C++

 



По симптомам выходит, что где-то в функционале Формекс есть баг. Этот баг исправлен в последних сборках Формекс, но в его варианте 1С++ 2.0 этот баг остался. К сожалению, я совсем в не в курсе как устроен работающий там код, а разбираться времени нет, да и есть вещи поинтереснее Улыбка Но, возможно, кто-то в этом коде разбирается лучше и исправить этот баг ему будет проще. Было бы неплохо Улыбка Пока что я для себя вижу только один выход "добиться совместимости" - отказаться от генерации событий для ГМ и генерить их только для обычных модулей. Или сделать такую генерацию опциональной.
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Вылет на CBLProcInfo::GetNParams
Ответ #1 - 22. Февраля 2008 :: 23:44
Печать  
Ну и немного более подробная информация. Косяк возникает, по видимому, не из-за бага в именно GetNParams. В проблемном окружении просто некорректно инициализируется CBLProcInfo - ID процедуры забивается мусором. Потом этот мусор используется как индекс - отсюда ##па и растет.
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Вылет на CBLProcInfo::GetNParams
Ответ #2 - 24. Февраля 2008 :: 12:50
Печать  
Решить легко - просто в 2.0.3 нужно встроить мою подсистему по работе с событиями ФормЕкс, в которой этот и другие баги устранены, плюс общее ускорение работы 1С (сейчас в 2.0 из-за кода обработки событий ФормЕкс вся 1С тормозит) плюс более стабильная работа и код Улыбка
В последние сборки ФормЕкс эта подсистема входит.
Sedmin-у я давно предлагал, он пока не решился Улыбка
ЗЫ в 2.5 и последних сборках ФормЕкс этих багов и тормозов нет, как ты сам уже увидел Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Вылет на CBLProcInfo::GetNParams
Ответ #3 - 24. Февраля 2008 :: 12:59
Печать  
Uzhast писал(а) 22. Февраля 2008 :: 23:44:
Ну и немного более подробная информация. Косяк возникает ...

Косяк в 2.0 возникает из-за того, что ФормЕкс перехватывает системные методы типа FinFunc, GetNParams и т.д. и не всегда корректно работает с перехваченными функциями.
ИЗ-за этого баги + тормоза + общая нестабильность работы всей системы 1С и других ВК Печаль
В моей подсистеме работы с событиями ФормЕкс этих перехватов нету, т.к. на самом деле обработка событий прекрасно работает и без них Улыбка
В итоге вся 1С и сторонние ВК, в том числе, в шоколаде Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Вылет на CBLProcInfo::GetNParams
Ответ #4 - 25. Февраля 2008 :: 03:44
Печать  
artbear писал(а) 24. Февраля 2008 :: 12:50:
Решить легко - просто в 2.0.3 нужно встроить мою подсистему по работе с событиями ФормЕкс, в которой этот и другие баги устранены,

Насколько это большие изменения? Как я понимаю, для больших изменений больше 2.5 подходит, а 2.0 трогать лучше, ИМХО, по минимуму...

artbear писал(а) 24. Февраля 2008 :: 12:50:
плюс общее ускорение работы 1С (сейчас в 2.0 из-за кода обработки событий ФормЕкс вся 1С тормозит) плюс более стабильная работа и код Улыбка

Не знаю, не замечал тормозов в 2.0. Может, не использую тот функционал, на котором это вылазит.

Без массированных изменений этот глюк реально исправить?
Кстати, можешь сказать, на какой версии FormEx этот глюк пропал? Есть мысль проверять версию загруженной 1С++/FormEx и, в случае несовместимых версий, отрезать возможность, на который возможны вылеты...
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Вылет на CBLProcInfo::GetNParams
Ответ #5 - 26. Февраля 2008 :: 09:33
Печать  
Uzhast писал(а) 25. Февраля 2008 :: 03:44:
Насколько это большие изменения? Как я понимаю, для больших изменений больше 2.5 подходит, а 2.0 трогать лучше, ИМХО, по минимуму...

Без массированных изменений этот глюк реально исправить?

Изменений достаточно много, вся схема работы с событиями ФормЕкс изменена.
На последних версиях ФормЕкс она отработана вроде бы до конца, все баги поправлены Улыбка

Uzhast писал(а) 25. Февраля 2008 :: 03:44:
Кстати, можешь сказать, на какой версии FormEx этот глюк пропал? Есть мысль проверять версию загруженной 1С++/FormEx и, в случае несовместимых версий, отрезать возможность, на который возможны вылеты...

Где-то с версии ФормЕкс 2.0.5 сборка 58-60 этого глюка уже нет, но есть другие привнесенные мной в процессе рефакторинга Улыбка Печаль
Лучше всего юзать ФормЕкс 2.0.5.82, там все стабильно Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать