powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Нужен pdb файл для ODBC-драйвера
25 сообщений из 38, страница 1 из 2
Нужен pdb файл для ODBC-драйвера
    #38887467
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
При работе c embed-версией firefird-а через odbc (32 бита) на некоторых компах начало виснуть внутри SQLDriverConnectW. Хотел бы понять причину, но не хватает отладочной информации. Где её брать, не строя odbc-драйвер ручками?
...
Рейтинг: 0 / 0
Нужен pdb файл для ODBC-драйвера
    #38887486
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtDen,

спросить непосредственно того, кто занимается драйвером.

Вот тут http://www.firebirdsql.org/en/mailing-lists/ ищи "Firebird ODBC Development", там есть список рассылки.

Или снять полный дамп памяти зависшего процесса и прицепить его к тикету в трекере.
...
Рейтинг: 0 / 0
Нужен pdb файл для ODBC-драйвера
    #38887521
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пока не ясно, виснет он внутри odbc-драйвера или же проходит глубже и виснет уже внутри firefird, так что не буду торопиться с тикетом. Пока что хочется увидеть хотя бы в каком месте происходит зависание.
...
Рейтинг: 0 / 0
Нужен pdb файл для ODBC-драйвера
    #38887567
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtDenПока что хочется увидеть хотя бы в каком месте происходит зависание.
То есть ты даже Process Explorer ещё не запускал и в кнопочку Call Stack не тыкал?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Нужен pdb файл для ODBC-драйвера
    #38887632
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov , пока что я это видел краем глаза по дампу, который я попросил снять. Сразу посмотреть по дампу, имя модуля, в котором зависло я не догадался (увидел только что висит в SQLDriverConnectW). Сейчас у меня на руках того дампа даже нету. Пытаюсь воссоздать ситуацию.
...
Рейтинг: 0 / 0
Нужен pdb файл для ODBC-драйвера
    #38887667
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Повторилось. Зависает не в odbc-драйвере, а в самом firebird-е. Теперь встал вопрос, где взять файл с отладочной информацией для 32-битного firebird-а в embed-варианте?

ЗЫ: зависает хитро и только на определённых компах.

Вот так не зависает:

1. Создаём коннект с базе
2. Создаём коннект с базе
3. Создаём коннект с базе

Вот так зависает:
1. Создаём коннект с базе
2. Создаём коннект с базе
3. Запускаем процесс (который к базе не обращается)
4. Создаём коннект с базе <---- Вот тут зависает
...
Рейтинг: 0 / 0
Нужен pdb файл для ODBC-драйвера
    #38887679
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Отладочную инфу нашёл. Оказывается, перед носом лежала.
Виснет внутри функции ISC_mutex_fini. О чём это говорит? Что мне надо подкрутить у себя, чтобы перестало виснуть?
...
Рейтинг: 0 / 0
Нужен pdb файл для ODBC-драйвера
    #38887686
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем, неправильно сказал. Виснет не в ISC_mutex_fini. Если периодически делать паузы, видно, что он попадает то в одни, то в другие функции
Например:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 	gds32.dll!ISC_get_host(char * string, unsigned short length) Line 278	C++
>	gds32.dll!make_object_name(char * buffer, unsigned int bufsize, const char * object_name, const char * object_type) Line 4322	C++
 	gds32.dll!ISC_mutex_init(mtx * mutex, const char * mutex_name) Line 3838	C++
 	gds32.dll!Jrd::LockManager::initialize(sh_mem * shmem_data, bool initializeMemory) Line 2402	C++
 	gds32.dll!Jrd::LockManager::initialize(void * arg, sh_mem * shmem, bool init) Line 476	C++
 	gds32.dll!ISC_map_file(int * status_vector, const char * filename, void (void *, sh_mem *, bool) * init_routine, void * init_arg, unsigned long length, sh_mem * shmem_data) Line 2827	C++
 	gds32.dll!Jrd::LockManager::attach_shared_file(int * status) Line 340	C++
 	gds32.dll!Jrd::LockManager::acquire_shmem(long owner_offset) Line 1155	C++
 	gds32.dll!Jrd::LockManager::create_owner(int * status_vector, unsigned __int64 owner_id, unsigned char owner_type, long * owner_handle) Line 1736	C++
 	gds32.dll!Jrd::LockManager::initializeOwner(Jrd::thread_db * tdbb, unsigned __int64 owner_id, unsigned char owner_type, long * owner_handle) Line 413	C++
 	gds32.dll!LCK_init(Jrd::thread_db * tdbb, Jrd::lck_owner_t owner_type) Line 590	C++
 	gds32.dll!jrd8_attach_database(int * user_status, const char * filename, Jrd::Attachment * * handle, short dpb_length, const unsigned char * dpb) Line 1101	C++
 	gds32.dll!isc_attach_database(int * user_status, short file_length, const char * file_name, void * * public_handle, short dpb_length, const char * dpb) Line 1494	C++

или же так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
>	gds32.dll!os_utils::createLockDirectory(const char * pathname) Line 181	C++
 	gds32.dll!gds__prefix_lock(char * string, const char * root) Line 1765	C++
 	gds32.dll!ISC_map_file(int * status_vector, const char * filename, void (void *, sh_mem *, bool) * init_routine, void * init_arg, unsigned long length, sh_mem * shmem_data) Line 2819	C++
 	gds32.dll!Jrd::LockManager::attach_shared_file(int * status) Line 340	C++
 	gds32.dll!Jrd::LockManager::acquire_shmem(long owner_offset) Line 1155	C++
 	gds32.dll!Jrd::LockManager::create_owner(int * status_vector, unsigned __int64 owner_id, unsigned char owner_type, long * owner_handle) Line 1736	C++
 	gds32.dll!Jrd::LockManager::initializeOwner(Jrd::thread_db * tdbb, unsigned __int64 owner_id, unsigned char owner_type, long * owner_handle) Line 413	C++
 	gds32.dll!LCK_init(Jrd::thread_db * tdbb, Jrd::lck_owner_t owner_type) Line 590	C++
 	gds32.dll!jrd8_attach_database(int * user_status, const char * filename, Jrd::Attachment * * handle, short dpb_length, const unsigned char * dpb) Line 1101	C++
 	gds32.dll!isc_attach_database(int * user_status, short file_length, const char * file_name, void * * public_handle, short dpb_length, const char * dpb) Line 1494	C++

вот ещё:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
>	gds32.dll!ISC_map_file(int * status_vector, const char * filename, void (void *, sh_mem *, bool) * init_routine, void * init_arg, unsigned long length, sh_mem * shmem_data) Line 2819	C++
 	gds32.dll!Jrd::LockManager::attach_shared_file(int * status) Line 340	C++
 	gds32.dll!Jrd::LockManager::acquire_shmem(long owner_offset) Line 1155	C++
 	gds32.dll!Jrd::LockManager::create_owner(int * status_vector, unsigned __int64 owner_id, unsigned char owner_type, long * owner_handle) Line 1736	C++
 	gds32.dll!Jrd::LockManager::initializeOwner(Jrd::thread_db * tdbb, unsigned __int64 owner_id, unsigned char owner_type, long * owner_handle) Line 413	C++
 	gds32.dll!LCK_init(Jrd::thread_db * tdbb, Jrd::lck_owner_t owner_type) Line 590	C++
 	gds32.dll!jrd8_attach_database(int * user_status, const char * filename, Jrd::Attachment * * handle, short dpb_length, const unsigned char * dpb) Line 1101	C++
 	gds32.dll!isc_attach_database(int * user_status, short file_length, const char * file_name, void * * public_handle, short dpb_length, const char * dpb) Line 1494	C++

Он где-то там крутиться, но из функции подключения к базе не выходит
...
Рейтинг: 0 / 0
Нужен pdb файл для ODBC-драйвера
    #38887694
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
К сожалению т.к. исходники, выложенные на сайте не сосуществуют бинарникам и pdb-файлам, тяжело отлаживаться. Но смог понять по крайней мере, что крутиться в бесконечном цикле вот здесь:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
// src\lock\lock.cpp
	while (SRQ_EMPTY(m_header->lhb_processes))
	{
		if (!m_sharedFileCreated) // <---Вот отсюда!!!!!
		{
			ISC_STATUS_ARRAY local_status;

			// Someone is going to delete shared file? Reattach.
			if (ISC_mutex_unlock(MUTEX) != 0)
			{
				bug(NULL, "ISC_mutex_unlock failed (acquire_shmem)");
			}
			detach_shared_file(local_status);

			THD_yield();

			if (!attach_shared_file(local_status)) {
				bug(local_status, "ISC_map_file failed (reattach shared file)");
			}
			if (ISC_mutex_lock(MUTEX)) {
				bug(NULL, "ISC_mutex_lock failed (acquire_shmem)");
			}
		} // <--- И до сюда!!!!!
		else
		{
			// complete initialization
			m_sharedFileCreated = false;

			// no sense thinking about statistics now
			prior_active = 0;

			break;
		}
	}
...
Рейтинг: 0 / 0
Нужен pdb файл для ODBC-драйвера
    #38887695
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
"сосуществуют" -> "соответвуют" :)
...
Рейтинг: 0 / 0
Нужен pdb файл для ODBC-драйвера
    #38887710
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Минимальный воспроизводимый пример сделать можешь ?
...
Рейтинг: 0 / 0
Нужен pdb файл для ODBC-драйвера
    #38888023
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробую
...
Рейтинг: 0 / 0
Нужен pdb файл для ODBC-драйвера
    #38888254
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот минимальный пример, вешающий подключение (без odbc):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
#include <string>

#include "Poco/Process.h"
#include "Poco/Pipe.h"
#include "ibase.h"

#pragma comment(lib, "fbclient_ms.lib")

const std::string server_and_path = "test_db.fdb";
const unsigned StatusLen = 20;

Poco::Pipe in_pipe;
Poco::Pipe out_pipe;


void connect1()
{
	isc_db_handle db_handle = nullptr;
	ISC_STATUS status_vect[StatusLen] = {};
	char pdb[1] = { isc_dpb_version1 };

	// connect 
	isc_attach_database(
		status_vect,
		server_and_path.size(),
		server_and_path.c_str(),
		&db_handle,
		sizeof(pdb),
		pdb
	);

	// start process
	Poco::Process::launch("cmd.exe", {}, "", &in_pipe, &out_pipe, nullptr);

	// disconnect
	isc_detach_database(status_vect, &db_handle);
}


void connect2()
{
	isc_db_handle db_handle = nullptr;
	char pdb[1] = { isc_dpb_version1 };

	ISC_STATUS status_vect[StatusLen] = {};

	// connect
	isc_attach_database( // <- ВИСНЕТ ЗДЕСЬ!
		status_vect,
		server_and_path.size(),
		server_and_path.c_str(),
		&db_handle,
		sizeof(pdb),
		pdb
	);

	// сюда уже не доходит :-(
	isc_detach_database(status_vect, &db_handle);
}


int main(int argc, char* argv[])
{
	connect1();
	connect2();
	return 0;
}



Для запуска процесса используется либа Poco, т.к. лень было писать ручками CreateProcess. Пробовал boost::process - ситуация аналогичная.
Если закомментировать создание процесса, то не виснет
...
Рейтинг: 0 / 0
Нужен pdb файл для ODBC-драйвера
    #38888271
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прикольно. Если вместо "cmd.exe" запускать стандартный виндовый калькулятор вот так:

Код: plaintext
1.
Poco::Process::launch("calc.exe", {}, "");



То процесс подключения "отвисает" сразу как только я закрываю окно калькулятора :-)

PS: да, забыл: воспроизводится на Win7 64x Home, Win 8.1 64x. Firebird embed - последний стабильный с сайта
...
Рейтинг: 0 / 0
Нужен pdb файл для ODBC-драйвера
    #38888314
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtDen,

спасибо, чуть позже гляну что там.
...
Рейтинг: 0 / 0
Нужен pdb файл для ODBC-драйвера
    #38891271
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть какие-нибудь результаты?
...
Рейтинг: 0 / 0
Нужен pdb файл для ODBC-драйвера
    #38891966
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проверить руки ещё не дошли, но идея есть:
попробуй, как workaround, при создании процесса указать не наследовать хендлы родителя.
Например, если речь о CreateProcess, то укажи bInheritHandles = FALSE.
...
Рейтинг: 0 / 0
Нужен pdb файл для ODBC-драйвера
    #38918763
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я правильно понимаю, что оно тебе не надо ? :)
...
Рейтинг: 0 / 0
Нужен pdb файл для ODBC-драйвера
    #38918810
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Надо. Просто пока переключится на другие проекты. Этот остался в подвешенном состоянии и мало того: он ещё не оплачен т.к. работа не выполнена :-)
...
Рейтинг: 0 / 0
Нужен pdb файл для ODBC-драйвера
    #38925801
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На всякий случай напоминаю )
...
Рейтинг: 0 / 0
Нужен pdb файл для ODBC-драйвера
    #38927561
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtDenНа всякий случай напоминаю )Ну так и я напоминаю - 17329707 пробовал ?
...
Рейтинг: 0 / 0
Нужен pdb файл для ODBC-драйвера
    #38927664
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если даже с bInheritHandles = FALSE заработает, то меня такой вариант не устроит, потому что придется городить свой велосипед для работы с консольными потоками. Но в любом случае, уговорил, сегодня попробую
...
Рейтинг: 0 / 0
Нужен pdb файл для ODBC-драйвера
    #38927801
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проверил. При bInheritHandles = FALSE не виснет, при bInheritHandles = TRUE виснет. Вот исходник с CreateProcess:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
#include <Windows.h>
#include <string>

#include "ibase.h"

#pragma comment(lib, "fbclient_ms.lib")

const std::string server_and_path = "d:\\DATABASE.FDB";
const std::string process = "C:\\Windows\\System32\\calc.exe";
const unsigned StatusLen = 20;

void connect1()
{
	isc_db_handle db_handle = nullptr;
	ISC_STATUS status_vect[StatusLen] = {};
	char pdb[1] = { isc_dpb_version1 };

	// connect 
	isc_attach_database(
		status_vect,
		server_and_path.size(),
		server_and_path.c_str(),
		&db_handle,
		sizeof(pdb),
		pdb
	);

	// start process

	STARTUPINFOA si = {};
	si.cb = sizeof(si);
	PROCESS_INFORMATION pi = {};
	int res = CreateProcessA(
		process.c_str(),  // lpApplicationName
		NULL,             // lpCommandLine
		NULL,             // lpProcessAttributes
		NULL,             // lpThreadAttributes
		TRUE,             // bInheritHandles
		DETACHED_PROCESS, // dwCreationFlags
		NULL,             // lpEnvironment
		NULL,             // lpCurrentDirectory
		&si,              // lpStartupInfo
		&pi               // lpProcessInformation
	);

	// disconnect
	isc_detach_database(status_vect, &db_handle);
}


void connect2()
{
	isc_db_handle db_handle = nullptr;
	char pdb[1] = { isc_dpb_version1 };

	ISC_STATUS status_vect[StatusLen] = {};

	// connect
	isc_attach_database( // <- ВИСНЕТ ЗДЕСЬ!
		status_vect,
		server_and_path.size(),
		server_and_path.c_str(),
		&db_handle,
		sizeof(pdb),
		pdb
	);

	// сюда уже не доходит :-(
	isc_detach_database(status_vect, &db_handle);
}


int main(int argc, char* argv[])
{
	connect1();
	connect2();
	return 0;
}

...
Рейтинг: 0 / 0
Нужен pdb файл для ODBC-драйвера
    #38931767
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В трекер занесёшь ?
...
Рейтинг: 0 / 0
Нужен pdb файл для ODBC-драйвера
    #38931918
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtDenЕсли даже с bInheritHandles = FALSE заработает, то меня такой вариант не устроит, потому что придется городить свой велосипед для работы с консольными потоками.Не понято - у тебя дочерний поток пишет в консоль родителю ? Уверен, что не наоборот ?
...
Рейтинг: 0 / 0
25 сообщений из 38, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Нужен pdb файл для ODBC-драйвера
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]