powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / access violation at address in module OraOCIEI12.dll при большом кол-ве потоков
22 сообщений из 22, страница 1 из 1
access violation at address in module OraOCIEI12.dll при большом кол-ве потоков
    #39666962
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте!
Подскажите, куда копать?
Крутиться 70 потоков записи в Oracle. Периодически валятся ошибки access violation at address in module OraOCIEI12.dll
При 10 потоках все хорошо, но это не точно))

Последовательность записи такая

Код: pascal
1.
2.
3.
4.
5.
6.
7.
OracleSession.Pool:= OracleSessionPool;
OracleSession.LogOn; 
OracleQuery.Session:= OracleSession;
OracleQuery.Execute;
OracleQuery.Close;
OracleQuery.Session:= nil;
OracleSession.LogOff;



Ошибка на OracleSession.LogOn
...
Рейтинг: 0 / 0
access violation at address in module OraOCIEI12.dll при большом кол-ве потоков
    #39666966
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Каждый поток должен иметь свою собственную сессию.
...
Рейтинг: 0 / 0
access violation at address in module OraOCIEI12.dll при большом кол-ве потоков
    #39666967
b0rk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrb,

у вас достаточно простой пример. проверьте его в ODAC и FireDAC. если AV только в DOA, то Oracle тут ни при чем.
...
Рейтинг: 0 / 0
access violation at address in module OraOCIEI12.dll при большом кол-ве потоков
    #39666969
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
b0rk, точно
...
Рейтинг: 0 / 0
access violation at address in module OraOCIEI12.dll при большом кол-ве потоков
    #39666970
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDi, так и есть
...
Рейтинг: 0 / 0
access violation at address in module OraOCIEI12.dll при большом кол-ве потоков
    #39667081
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbПодскажите, куда копать?

Call Stack.

И посмотреть в исходниках как инициализируется Environment: там должен быть флаг для
поддержки многопоточности OCI_THREADED и не должно быть OCI_NO_MUTEX.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
access violation at address in module OraOCIEI12.dll при большом кол-ве потоков
    #39667111
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, спасибо, но посмотрел с самого начала!

Кстати, если поменять порядок, то ошибок нет... блин забыл про SetVariable

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
OracleQuery.SetVariable;
OracleSession.Pool:= OracleSessionPool;
OracleSession.LogOn; 
OracleQuery.Session:= OracleSession;
OracleQuery.Execute;
OracleQuery.Close;
OracleQuery.Session:= nil;
OracleSession.LogOff;




если так, то нормально, вроде, но не точно )))


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
OracleSession.Pool:= OracleSessionPool;
OracleSession.LogOn; 
OracleQuery.Session:= OracleSession;
OracleQuery.SetVariable;
OracleQuery.Execute;
OracleQuery.Close;
OracleQuery.Session:= nil;
OracleSession.LogOff;




Интересно, почему сначала надо делать LogOn?
...
Рейтинг: 0 / 0
access violation at address in module OraOCIEI12.dll при большом кол-ве потоков
    #39667114
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbпосмотрел с самого начала!

Куда?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
access violation at address in module OraOCIEI12.dll при большом кол-ве потоков
    #39667125
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, Oracle.pas, где выставляются OCI_THREADED и OCI_NO_MUTEX.
...
Рейтинг: 0 / 0
access violation at address in module OraOCIEI12.dll при большом кол-ве потоков
    #39667127
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вернее когда выставляешь у OracleSession.ThreadSafe:=True
...
Рейтинг: 0 / 0
access violation at address in module OraOCIEI12.dll при большом кол-ве потоков
    #39667131
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbвыставляются OCI_THREADED и OCI_NO_MUTEX.

Во-первых, я сказал, что OCI_NO_MUTEX быть не должно .
Во-вторых, я сказал смотреть Call Stack.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
access violation at address in module OraOCIEI12.dll при большом кол-ве потоков
    #39667143
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что плохого в OCI_NO_MUTEX, если один экземляр Environment используется только одним потоком ... Если ...
...
Рейтинг: 0 / 0
access violation at address in module OraOCIEI12.dll при большом кол-ве потоков
    #39667145
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, в Oracle.pas:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
procedure TOracleSession.GetEnv;
var EnvMode: ub4;
begin
  if UseSingleEnvironment then
    envhp := GetSingleEnv
  else begin
    EnvMode := OCI_DEFAULT;
    if not OCI81 then
    begin
      if not ThreadSafe then EnvMode := EnvMode or OCI_ENV_NO_MUTEX;
      OCICall(OCIEnvInit(envhp, EnvMode, 0, nil))
    end else begin
      // Net8 8.1 cannot switch ctx to lda in no_mutex mode
      EnvMode := EnvMode or OCI_OBJECT;
      if ThreadSafe then  EnvMode := EnvMode or OCI_THREADED;
      if not ThreadSafe then EnvMode := EnvMode or OCI_ENV_NO_MUTEX;
      OCICall(OCIEnvCreate(envhp, EnvMode, nil, nil, nil, nil, 0, nil));
     
    end;
  end;
end;



Как вы и сказали, а со стеком беда. При большом кол-ве потоков (>100) IDE под дебагером виснет. А AQTime, eurekalog и т.д. нет.
Я ищу, стараюсь... не бейте сильно
...
Рейтинг: 0 / 0
access violation at address in module OraOCIEI12.dll при большом кол-ве потоков
    #39667151
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry Arefievесли один экземляр Environment используется только одним потоком ... Если ...

Вот именно: если. Если UseSingleEnvironment не установлено, если ThreadSafe установлено,
причём вовремя, если аффтар не скармливает левых указателей.

Но он даже текст ошибки привёл только наполовину.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
access violation at address in module OraOCIEI12.dll при большом кол-ве потоков
    #39667164
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При возникновении ошибка в утечках появляется TSessionPreferences х 2(3 или 4)
Полный текст ошибки: Access violation at address 00007FFB70A2D69D in module 'OraOCIEI12.dll'. Read of address 00000000000000D8
...
Рейтинг: 0 / 0
access violation at address in module OraOCIEI12.dll при большом кол-ве потоков
    #39667170
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UseSingleEnvironment = false
...
Рейтинг: 0 / 0
access violation at address in module OraOCIEI12.dll при большом кол-ве потоков
    #39667174
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbRead of address 00000000000000D8

Ну вот и ответ: ищи кто и куда скармливает nil вместо объекта.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
access violation at address in module OraOCIEI12.dll при большом кол-ве потоков
    #39667180
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, ага, уже пару дней ищу, вот и решил у вас спросить, что и как
...
Рейтинг: 0 / 0
access violation at address in module OraOCIEI12.dll при большом кол-ве потоков
    #39667199
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbуже пару дней ищу, вот и решил у вас спросить, что и как

Call Stack - незаменимая вещь. Найди способ его получить.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
access violation at address in module OraOCIEI12.dll при большом кол-ве потоков
    #39667685
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не прошло и три года... вот что получилось
если я правильно понял, то последняя "хорошая" процедура OracleQuery.Parse. В ней процедура UTF8Client , которая находится в Oracle.pas:

Код: pascal
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.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
// Parse the SQL text of a Query
procedure TOracleQuery.Parse(Deferred: Boolean);
var s, sc: AnsiString;
    ss: String;
    i, j, PreFetch: Integer;
    ft: ub2;
    defflg: sword;
    VarData: TVariableData;
begin
  FErrorPosition := 0;
  FErrorLine := 0;
  Open;
  if ResultSet then
  begin
    FFunctionType := ftSelect;
    Described := False;
    Session.FLastSQL := '';
    Exit;
  end;
  ss := FSQL.Text;
  // Replace substitution variables by the actual values
  ReplaceSubstVariables(ss);
  {$IFDEF CompilerVersion2009}
  if UTF8Client then
    sc := UTF8Encode(ss)
  else
    sc := AnsiString(ss);
  {$ELSE}
    sc := ss;
  {$ENDIF}
  // Strip cr's from the SQL text
  SetLength(s, Length(sc));
  j := 0;
  for i := 1 to Length(sc) do
  begin
    if sc[i] <> #13 then
    begin
      Inc(j);
      s[j] := sc[i];
    end;
  end;
  SetLength(s, j);
  if s = '' then s := ' ';
  // Because of a bug in Net8, we need to reparse when a long, long raw or array variable is used
  if Session.UseOCI80 then
  begin
    for i := 0 to Variables.Count - 1 do
    begin
      VarData := Variables.Data(i);
      if (VarData.BufType in [otLong, otLongRaw]) or
         (VarData.IsPLSQLTable) or
         (VarData.ArraySize > 1) or
         (ArrayBindSize > 1) then ParsedSQL := '';
    end;
  end;
  // Parse only if SQL text has changed since the last parse
  // and function does not need to be parsed
  if (not Optimize) or (ParsedSQL = '') or (ParsedSQL <> s) or not
     (FFunctionType in [3, 4, 5, 9, 33, 34, 35, 54, 55, 56]) then
  begin
    FieldList.Clear;
    ParsedSQL := s;
    Session.Acquire(True);
    FFunctionType := 0;
    if Session.UseOCI80 then
    begin
      AllocStmthp;
      if Session.AreStatementsCached then
        OCICall(OCIStmtPrepare2(Session.svchp, stmthp, errhp, PAnsiChar(ParsedSQL), length(ParsedSQL), nil, 0, OCI_NTV_SYNTAX, OCI_DEFAULT))
      else
        OCICall(OCIStmtPrepare(stmthp, errhp, PAnsiChar(ParsedSQL), length(ParsedSQL), OCI_NTV_SYNTAX, OCI_DEFAULT));
      if GetReturnCode = 0 then
      begin
        // No Oracle8 caching
        PreFetch := 0;
        OCICall(OCIAttrSet(stmthp, OCI_HTYPE_STMT, @PreFetch, SizeOf(Pointer), OCI_ATTR_PREFETCH_ROWS, errhp));
        OCICall(OCIAttrSet(stmthp, OCI_HTYPE_STMT, @PreFetch, SizeOf(Pointer), OCI_ATTR_PREFETCH_MEMORY, errhp));
        OCICall(OCIAttrGet(stmthp, OCI_HTYPE_STMT, ft, nil, OCI_ATTR_STMT_TYPE, errhp));
        case ft of
          OCI_STMT_SELECT: FFunctionType := 4;
          OCI_STMT_UPDATE: FFunctionType := 5;
          OCI_STMT_DELETE: FFunctionType := 9;
          OCI_STMT_INSERT: FFunctionType := 3;
           OCI_STMT_BEGIN: FFunctionType := 34;
         OCI_STMT_DECLARE: FFunctionType := 34;
        else
          FFunctionType := -1;
        end;
      end;
    end else begin
      if Deferred then defflg := 1 else defflg := 0;
      oparse(CDA, PAnsiChar(ParsedSQL), -1, defflg, 2);
      // Parsed successfully, set functiontype
      FFunctionType := CDA.ft;
    end;
    if GetReturnCode <> 0 then
    begin
      ParsedSQL := '';
      RaiseException;
    end;
    Session.Release(True);
    // If parsed then the Query must be described as well
    Described := False;
  end;
end;



А уже в ней процедура из System.pas _UStrClr

Код: pascal
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.
{$IF not defined(X86ASMRTL)}
function _UStrClr(var S): Pointer;
var
  P: PStrRec;
begin
  if Pointer(S) <> nil then
  begin
    P := Pointer(PByte(S) - SizeOf(StrRec));
    Pointer(S) := nil;
    if P.refCnt > 0 then
    begin
      if AtomicDecrement(P.refCnt) = 0 then
        FreeMem(P);
    end;
  end;
  Result := @S;
end;
{$ELSE X86ASMRTL}
procedure _UStrClr(var S);
{$IFDEF CPUX86}
asm
        { ->    EAX     pointer to str  }
        { <-    EAX     pointer to str  }

        MOV     EDX,[EAX]                       { fetch str                     }
        TEST    EDX,EDX                         { if nil, nothing to do         }
        JE      @@done
        MOV     dword ptr [EAX],0               { clear str                     }
        MOV     ECX,[EDX-skew].StrRec.refCnt    { fetch refCnt                  }
        DEC     ECX                             { if < 0: literal str           }
        JL      @@done
   LOCK DEC     [EDX-skew].StrRec.refCnt        { threadsafe dec refCount       }
        JNE     @@done
        {$IFDEF ALIGN_STACK}
        SUB     ESP,8
        {$ENDIF ALIGN_STACK}
        PUSH    EAX
        LEA     EAX,[EDX-skew]                  { if refCnt now zero, deallocate}
        CALL    _FreeMem
        POP     EAX
        {$IFDEF ALIGN_STACK}
        ADD     ESP,8
        {$ENDIF ALIGN_STACK}
@@done:
end;
{$ENDIF CPUX86}
{$ENDIF X86ASMRTL}



Получает пустое значение и валиться с ошибкой. На какие мысли это вас может натолкнуть? Ткните носом, а
...
Рейтинг: 0 / 0
access violation at address in module OraOCIEI12.dll при большом кол-ве потоков
    #39667713
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbНа какие мысли это вас может натолкнуть?

FastMM + FullDebugMode.
DrMemory.

Или у тебя стек не тот или память где-то портится. На всякий случай проверь значение self
в TOracleQuery.Parse этого стэка.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
access violation at address in module OraOCIEI12.dll при большом кол-ве потоков
    #39667768
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если в коде есть несинхронные объекты, доступ к которым есть из нескольких потоков, и которые меняются -- стек и дебаг не поможет -- они будут вылетать/останавливаться в рандомных местах.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / access violation at address in module OraOCIEI12.dll при большом кол-ве потоков
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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