Расслабился …

Запустил «взрослое» нагрузочное тестирование с участием нового пула подключений на 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. Навечно.

Leave a Comment