Проблема: при выполнении схожих запросов к основным таблицам БД (разница в фильтрах, причиной сбоев быть не может - проверил) периодически вываливаются ошибки: - List index out of bounds (n), n – число
- Thread error: Неверный дескриптор
- Access violation
- Invalid pointer operation
Установить строгую зависимость появления ошибок не удалось. Расставил в местах возможных проблем конструкции try…except…end – не дало результата. Теперь самое интересное: ошибки появляются только при работе приложения на одном из компьютеров (Core 2 Duo, 2 Gb; WinXP SP2 Pro), БД расположена на другом компьютере, выполняющем роль сервера. При работе на моем компьютере такие ошибки не появляются (Athlon 1700+, 1 Gb; WinXP SP2 Pro). Для отлова багов установил на проблемный компьютер Delphi – еще более странная штука: при работе приложения в режиме отладки ошибки так же не проявляются! (Delphi 7 + Interbase 7.5 + IBX) Воспользовался madExcept. Он интегрируется в приложение и в случае ошибки записывает довольно подробный лог. Только вот ничего полезного я там не нашел... Пример лога (NewsF - название моего приложения): | Цитата | compiled with : Delphi 7 madExcept version : 3.0e callstack crc : $13840da6, $2c310242, $33687b70 exception number : 1 exception class : EAccessViolation exception message : Access violation at address 00466BA7 in module 'NewsF.exe'. Read of address 00000008.
Main ($22c): 00466ba7 +007 NewsF.exe Classes TList.Add 0046fd6e +03a NewsF.exe Classes TComponent.FreeNotification 0055507f +0df NewsF.exe DBGrids TGridDataLink.AddMapping 00557c42 +066 NewsF.exe DBGrids TCustomDBGrid.DefineFieldMap 00559cec +088 NewsF.exe DBGrids TCustomDBGrid.InternalLayout 005589eb +037 NewsF.exe DBGrids TCustomDBGrid.EndLayout 0055b418 +010 NewsF.exe DBGrids TCustomDBGrid.CMDeferLayout 004a0b68 +188 NewsF.exe Controls TControl.WndProc 004a3bc7 +157 NewsF.exe Controls TWinControl.WndProc 004a3844 +02c NewsF.exe Controls TWinControl.MainWndProc 00470ce0 +014 NewsF.exe Classes StdWndProc 7e3696c2 +00a user32.dll DispatchMessageA 004bff1b +083 NewsF.exe Forms TApplication.ProcessMessage 004bff52 +00a NewsF.exe Forms TApplication.HandleMessage 004c0182 +096 NewsF.exe Forms TApplication.Run 00576768 +064 NewsF.exe NewsF 43 +5 initialization
thread $55c: 7c90eb94 +000 ntdll.dll KiFastSystemCallRet 7c90d85a +00a ntdll.dll NtDelayExecution 0044e071 +00d NewsF.exe madExcept CallThreadProcSafe 0044e0db +037 NewsF.exe madExcept ThreadExceptFrame >> created by Main ($22c) at: 71a83a0c +191 WS2HELP.dll WahOpenHandleHelper
thread $58c: 7c90eb94 +00 ntdll.dll KiFastSystemCallRet 7c90e397 +0a ntdll.dll NtReplyWaitReceivePortEx 0044e071 +0d NewsF.exe madExcept CallThreadProcSafe 0044e0db +37 NewsF.exe madExcept ThreadExceptFrame >> created by Main ($22c) at: 77e8760d +00 RPCRT4.dll
thread $590: 7c90eb94 +00 ntdll.dll KiFastSystemCallRet 7c90d85a +0a ntdll.dll NtDelayExecution 7c8023e7 +4b kernel32.dll SleepEx 7c80244c +0a kernel32.dll Sleep 0044e071 +0d NewsF.exe madExcept CallThreadProcSafe 0044e0db +37 NewsF.exe madExcept ThreadExceptFrame >> created by Main ($22c) at: 774fcc4a +00 ole32.dll
thread $41c: 7c90eb94 +00 ntdll.dll KiFastSystemCallRet 7c90e397 +0a ntdll.dll NtReplyWaitReceivePortEx 0044e071 +0d NewsF.exe madExcept CallThreadProcSafe 0044e0db +37 NewsF.exe madExcept ThreadExceptFrame >> created by thread $58c at: 77e8760d +00 RPCRT4.dll
thread $634 (TthrGetRBCNews): <priority:-1> 7c90eb94 +000 ntdll.dll KiFastSystemCallRet 7c90d85a +00a ntdll.dll NtDelayExecution 7c8023e7 +04b kernel32.dll SleepEx 7c80244c +00a kernel32.dll Sleep 0054f44a +6a2 NewsF.exe thrGetRBCNews 260 +166 TthrGetRBCNews.Execute 0044e18f +02b NewsF.exe madExcept HookedTThreadExecute 0046f71c +034 NewsF.exe Classes ThreadProc 00404f60 +028 NewsF.exe System ThreadWrapper 0044e071 +00d NewsF.exe madExcept CallThreadProcSafe 0044e0db +037 NewsF.exe madExcept ThreadExceptFrame >> created by Main ($22c) at: 00568265 +00d NewsF.exe Main 374 +1 TfMain.thrGetRBCNewsStart
thread $854 (TthrSearchDB): <suspended> <priority:1> 7c90eb94 +000 ntdll.dll KiFastSystemCallRet 0044e18f +02b NewsF.exe madExcept HookedTThreadExecute 0046f71c +034 NewsF.exe Classes ThreadProc 00404f60 +028 NewsF.exe System ThreadWrapper 0044e071 +00d NewsF.exe madExcept CallThreadProcSafe 0044e0db +037 NewsF.exe madExcept ThreadExceptFrame >> created by Main ($22c) at: 0056bc3a +27e NewsF.exe Main 1129 +42 TfMain.bbStartClick
disassembling: 00576704 public NewsF.initialization: ; function entry point 00576704 38 push ebp 00576705 mov ebp, esp 00576707 add esp, -$10 0057670a mov eax, $57607c 0057670f call -$16f058 ($4076bc) ; SysInit.@InitExe 00576714 39 mov eax, [$57e14c] 00576719 mov eax, [eax] 0057671b call -$b66cc ($4c0054) ; Forms.TApplication.Initialize 00576720 40 mov eax, [$57e14c] 00576725 mov eax, [eax] 00576727 mov edx, $57677c ; 'NewsF' 0057672c call -$b6af5 ($4bfc3c) ; Forms.TApplication.SetTitle 00576731 41 mov ecx, [$57dc98] 00576737 mov eax, [$57e14c] 0057673c mov eax, [eax] 0057673e mov edx, [$566f30] 00576744 call -$b66dd ($4c006c) ; Forms.TApplication.CreateForm 00576749 42 mov ecx, [$57e364] 0057674f mov eax, [$57e14c] 00576754 mov eax, [eax] 00576756 mov edx, [$572a9c] 0057675c call -$b66f5 ($4c006c) ; Forms.TApplication.CreateForm 00576761 43 mov eax, [$57e14c] 00576766 mov eax, [eax] 00576768 > call -$b6681 ($4c00ec) ; Forms.TApplication.Run 0057676d 44 call -$171952 ($404e20) ; System.@Halt0 |
TthrSearchDB - поток, в котором формируется и выполняется SQL-запрос; через Synchronize на форму fMain выводятся результаты, устанавливается курсор в IBQNews:TIBQuery, связанной с DBGridNews:TDBGrid, вызывается DBGridNews.DataSource.DataSet.EnableControls; - всё максимально обвешано конструкциями try...except...end с записью ошибок в собственный log-файл. | Код | procedure TthrSearchDB.Execute; var SQL:string; ... вызов через Syncronize fMain.DBGridNews.DataSource.DataSet.DisableControls;
формирование SQL-запроса
EnterCriticalSection(csSearch); try IBQNews.Close; IBQNews.SQL.Clear; IBQNews.SQL.Add(SQL); IBQNews.Open; IBQNews.FetchAll; except on E:Exception do begin LogWr('! 1902 Error'); end; LeaveCriticalSection(csSearch); Synchronize(Finish); end; if not Terminated then Suspend; end; |
Транзакция, связанная с IBQNews, имеет свойства | Цитата | read_committed rec_version nowait read AllowAutoStart:=True |
Это сообщение отредактировал(а) MrKit - 25.12.2007, 12:26
|