Расслабился …
Запустил «взрослое» нагрузочное тестирование с участием нового пула подключений на FB3. По ошибке — с участием fbclient.dll. Обнаружил это через пару часов после запуска, но решил — ладно, «нехай».
64-бита проехало без проблем.
32-бита встало по AV.
Перепугался — таки где-то я накосячил (про fbclient.dll уже из головы вылетело).
Отладчиком подключиться не получается — не хватает памяти.
Сделал дамп. Подключился к дампу.
Увидел fbclient.dll и вспомнил про него. Но, блин — может все таки косяк не в нем.
Полез в журнал приложений:
Имя сбойного приложения: ibp_oledb_test_vc15_Win32_Release.exe, версия: 0.0.0.0, метка времени: 0x58e15b05 Имя сбойного модуля: fbclient_30.dll, версия: 3.0.3.32714, метка времени: 0x58e4f3da Код исключения: 0xc0000005 Смещение ошибки: 0x000a29dd Идентификатор сбойного процесса: 0x5284 Время запуска сбойного приложения: 0x01d2b233e974598a Путь сбойного приложения: d:\Users\Dima\Work\TestCode\ActiveX\IBP\oledb_test_clear\target\ibp_oledb_test_vc15_Win32_Release.exe Путь сбойного модуля: C:\WINDOWS\SYSTEM32\fbclient_30.dll Идентификатор отчета: 9c8b57e7-497f-48ee-a0d6-0c5c33f3ba84 Полное имя сбойного пакета: Код приложения, связанного со сбойным пакетом:
Ага, все таки fbclient.
Отпустило.
Начал смотреть «что не так».
Стек:
fbclient_30.dll!MERGE_database_info(const unsigned char * in, unsigned char * out, unsigned short out_length, unsigned short impl, unsigned short class_, unsigned short base_level, const unsigned char * version, const unsigned char * id)Строка 74 C++ fbclient_30.dll!Remote::Attachment::getInfo(Firebird::CheckStatusWrapper * status, unsigned int item_length, const unsigned char * items, unsigned int buffer_length, unsigned char * buffer)Строка 1529 C++ fbclient_30.dll!Firebird::IAttachmentBaseImpl<Remote::Attachment,Firebird::CheckStatusWrapper,Firebird::IReferenceCountedImpl<Remote::Attachment,Firebird::CheckStatusWrapper,Firebird::Inherit<Firebird::IVersionedImpl<Remote::Attachment,Firebird::CheckStatusWrapper,Firebird::Inherit<Firebird::IAttachment> > > > >::cloopgetInfoDispatcher(Firebird::IAttachment * self, Firebird::IStatus * status, unsigned int itemsLength, const unsigned char * items, unsigned int bufferLength, unsigned char * buffer)Строка 8631 C++ fbclient_30.dll!Why::YAttachment::getInfo(Firebird::CheckStatusWrapper * status, unsigned int itemsLength, const unsigned char * items, unsigned int bufferLength, unsigned char * buffer)Строка 5025 C++ fbclient_30.dll!isc_database_info(int * userStatus, void * * handle, short itemLength, const char * items, short bufferLength, char * buffer)Строка 1916 C++ _IBProvider_v3_vc15_w32_prof_i.dll!ibp::db_provider::isc_connector::common::isc_common__connection::get_cn_status(bool fastCheck)Строка 596 C++
Код Merge_database_info:
USHORT MERGE_database_info(const UCHAR* in, UCHAR* out, USHORT out_length, USHORT impl, USHORT class_, USHORT base_level, const UCHAR* version, const UCHAR* id) //ULONG mask Was always zero { /************************************** * * M E R G E _ d a t a b a s e _ i n f o * ************************************** * * Functional description * Merge server / remote interface / Y-valve information into * database block. Return the actual length of the packet. * See also jrd/utl.cpp for decoding of this block. * **************************************/ SSHORT l; const UCHAR* p; UCHAR* start = out; const UCHAR* const end = out + out_length; UCHAR mergeLevel = 0; for (const UCHAR* getMergeLevel = in; *getMergeLevel != isc_info_end && *getMergeLevel != isc_info_truncated; getMergeLevel += (3 + gds__vax_integer(getMergeLevel + 1, 2))) {
Память, на которую указывает аргумент «in»:
0x03D3EF24 00 cc cc cc cc cc cc cc cc cc cc cc cc cc
Ага, смотрим что такое isc_info_end и isc_info_truncated:
/* Common, structural codes */ /****************************/ #define isc_info_end 1 #define isc_info_truncated 2
Понятно.
Из-за OUTOFMEMORY где-то в дебрях не хватило памяти, эту ошибку задавили и сюда приехал вот такой вот буфер.
Я (пока писал эту заметку) понял, что нужно сделать — нужно в батнике убрать тестирование 32-битного провайдера с участием fbclient.dll. Навечно.