Страница 1 из 1

Зависает комп при перезагрузке - ошибку выдает gds32.dll

Добавлено: 13 ноя 2008, 09:59
Barsevich
Вот такая ситуация:

Есть компьютер под управлением Windows XP Embedded.
На нем стоит FireBird 1.5.3 - 4870
На компьютере работает программа, которая по расписанию запускает процесс опроса приборов учета.
Расписание находится в базе.
Данные с приборов вставляются в ту же базу.

Расписание пересчитывается из базы каждые 5 минут, или по событию БД.
Программы (для опроса приборов, и та, что следит за расписанием) написаны на BCB6 и Delphi 6, IBX последних версий.

Все запросы - и на вставку данных, и на чтение данных из БД, выполняются конструкциями вида:

TIBTransaction *tr=new TIBTransaction(this);
TIBSQL *qr=new TIBSQL(this);
tr->DefaultDatabase=SSDdb;
qr->Transaction=tr;


if(tr->InTransaction) tr->Commit(); tr->StartTransaction();
AnsiString qstring;
qstring= "update STIMETABLE set TYPECALL = :TYPECALL where typecall<>1";
qr->SQL->Add(qstring);
qr->GenerateParamNames=true;
if(tr->Active) tr->Commit(); tr->StartTransaction();
qr->GenerateParamNames=true;
qr->ParamByName("TYPECALL")->AsInteger=0;
qr->ExecQuery(); qr->Close(); tr->Commit(); delete qr; delete tr;
return 0;


Собственно, все это работает в течении некоторого времени. При попытке перезагрузки, комп повисает с некой ошибкой gds32.dll.

Поскольку все эти компы стоят без мониторов, и при зависе - их мануально перезагружают ресетом, то понять точно, какую ошибку дает gds32.dll не удается, к тому моменту как он зависает, RDP уже отключен.

Перезагрузка совершается программно по расписанию, вызовом bat файла, который контролирует корректное завершение основной программы, принудительно завершает все сеансы запросов данных, делает net stop "Firebird Server - DefaultInstance"
и вызывает перезагрузку. Но при перезагрузке - повисает.

Все это уже очень сильно напрягает.
Вопрос - как понять, из-за чего все валится ? эта перезагрузка очень нужна. Перезагружать по другому? Может ли это происходить из-за того, что каждый раз создается новая транзакция и новый запрос ? Но при запуске клиента для сбора данных там это все равно происходит. Куда копать ? Какие где логи смотреть ? Помогите плз. :(

Re: Зависает комп при перезагрузке - ошибку выдает gds32.dll

Добавлено: 13 ноя 2008, 10:27
kdv
Может ли это происходить из-за того, что каждый раз создается новая транзакция и новый запрос ?
а они вообще где-то в коде уничтожаются?
При попытке перезагрузки, комп повисает с некой ошибкой gds32.dll.
я бы посоветовал попытаться сымитировать ситуацию при наличии монитора, тогда станет видна "какая-то ошибка".

Re: Зависает комп при перезагрузке - ошибку выдает gds32.dll

Добавлено: 13 ноя 2008, 11:01
Barsevich
kdv писал(а):а они вообще где-то в коде уничтожаются?
Ну да - см. код, предпоследняя строчка - delete qr; delete tr;

При падении gds32.dll что-то пишется в системные журналы Windows или в лог FireBird ?

Re: Зависает комп при перезагрузке - ошибку выдает gds32.dll

Добавлено: 13 ноя 2008, 11:07
kdv
При падении gds32.dll что-то пишется в системные журналы Windows или в лог FireBird ?
вообще gds32.dll обычно не падает. насчет что-то пишется - не уверен, надо смотреть, а не спрашивать.

Re: Зависает комп при перезагрузке - ошибку выдает gds32.dll

Добавлено: 13 ноя 2008, 11:55
Tonal
При вылете исключения delete qr; delete tr; не отработает.
Т.е. если исключения вылетают, то накапливается незакрытые запросы и транзакции, что может привести к довольно странному поведению.
Одно из быстрых и удобных решений это использовать std::auto_ptr:

Код: Выделить всё

std::auto_ptr<TIBTransaction> tr(new TIBTransaction(this));
std::auto_ptr<TIBSQL> qr(new TIBSQL(this));
...
qr->ExecQuery(); qr->Close(); tr->Commit();
return 0;

Re: Зависает комп при перезагрузке - ошибку выдает gds32.dll

Добавлено: 13 ноя 2008, 11:59
hvlad
Barsevich писал(а):При попытке перезагрузки, комп повисает с некой ошибкой gds32.dll
Откуда это известно ? С event'ами работа есть ?