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

Access Violation, некорректное выполнение запросов или вызовов API, ошибки утилит командной строки, в общем все, что вам мешает работать

Модераторы: kdv, dimitr

Ответить
Barsevich
Сообщения: 9
Зарегистрирован: 11 авг 2007, 15:36

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

Сообщение Barsevich » 13 ноя 2008, 09:59

Вот такая ситуация:

Есть компьютер под управлением 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"
и вызывает перезагрузку. Но при перезагрузке - повисает.

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

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

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

Сообщение kdv » 13 ноя 2008, 10:27

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

Barsevich
Сообщения: 9
Зарегистрирован: 11 авг 2007, 15:36

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

Сообщение Barsevich » 13 ноя 2008, 11:01

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

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

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

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

Сообщение kdv » 13 ноя 2008, 11:07

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

Tonal
Сообщения: 104
Зарегистрирован: 30 сен 2007, 13:42

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

Сообщение Tonal » 13 ноя 2008, 11:55

При вылете исключения 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;

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

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

Сообщение hvlad » 13 ноя 2008, 11:59

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

Ответить