Heavy Loading Exception on HttpAPI call

HI,

I’ve below code :

    [ROServiceMethod]
    [ROCustom('HttpApiPath','getevtgamedet')]
    function getevtgamedet(GAMEM_KEY_SYS:integer): binary;

function TAllTableService.getevtgamedet(GAMEM_KEY_SYS:integer): binary;
var
  srcData: IDADataset;

  srcGrp, srcEvt, srcGdraw, srcGdrawD : IDADataset;

  sjoson:TDAJSONDataStreamer;
  wb:TDAWhereBuilder;
  cdsResult:TDaMemDataTable;
begin


  try

    Result := TROHttpApiResult.Create(HTTP_200_code, id_ContentType_application_json_charset_utf8,'',false);
    cdsResult:=CreateResultInfo;
    cdsResult.Append;
    cdsResult.FieldByName('TableName').AsString := 'GAMEM_TBL';
    cdsResult.FieldByName('START_TM').AsDateTime := now;


    wb:=TDAWhereBuilder.Create;
    wb.Expression :=
         wb.NewBinaryExpression(
         wb.NewField('','GAMEM_KEY_SYS'),
         wb.NewConstant(GAMEM_KEY_SYS),dboequal) ;

    srcData := AllTableDASchema.NewDataset(Connection,'GAMEM_TBL',[],wb.Xml);
    srcData.Open;

    cdsResult.FieldByName('TableRows').AsInteger := srcData.RecordCount;
    cdsResult.FieldByName('END_TM').AsDateTime := now;
    cdsResult.FieldByName('Result').AsString := '1';
    cdsResult.Post;


    cdsResult.Append;
    cdsResult.FieldByName('TableName').AsString := 'EVT_TBL';
    cdsResult.FieldByName('START_TM').AsDateTime := now;
    wb.Expression :=
         wb.NewBinaryExpression(
         wb.NewField('','EVT_KEY_SYS'),
         wb.NewConstant(srcData.FieldByName('GAMEM_GEVENT_SYS_FK').AsInteger),dboequal) ;

    srcEvt := AllTableDASchema.NewDataset(Connection,'EVT_TBL',[],wb.Xml);

    cdsResult.FieldByName('TableRows').AsInteger := srcData.RecordCount;
    cdsResult.FieldByName('END_TM').AsDateTime := now;
    cdsResult.FieldByName('Result').AsString := '1';
    cdsResult.Post;

    cdsResult.Append;
    cdsResult.FieldByName('TableName').AsString := 'GDRAW_MTR';
    cdsResult.FieldByName('START_TM').AsDateTime := now;
    wb.Expression :=
         wb.NewBinaryExpression(
         wb.NewField('','GDRAW_KEY_SYS'),
         wb.NewConstant(srcData.FieldByName('GAMEM_GDRAW_SYS_FK').AsInteger),dboequal) ;

    srcGdraw := AllTableDASchema.NewDataset(Connection,'GDRAW_MTR',[],wb.Xml);
    srcGdraw.Open;
    cdsResult.FieldByName('TableRows').AsInteger := srcGdraw.RecordCount;
    cdsResult.FieldByName('END_TM').AsDateTime := now;
    cdsResult.FieldByName('Result').AsString := '1';
    cdsResult.Post;

    cdsResult.Append;
    cdsResult.FieldByName('TableName').AsString := 'GDRAW_DET';
    cdsResult.FieldByName('START_TM').AsDateTime := now;
    wb.Expression :=
         wb.NewBinaryExpression(
         wb.NewField('','GDRAWD_KEY_SYS'),
         wb.NewConstant(srcData.FieldByName('GAMEM_BLUE_GDRAWD_SYS_FK').AsInteger),dboequal) ;

    srcGdrawD := AllTableDASchema.NewDataset(Connection,'GDRAW_DET',[],wb.Xml);

    cdsResult.FieldByName('TableRows').AsInteger := srcGdrawD.RecordCount;
    cdsResult.FieldByName('END_TM').AsDateTime := now;
    cdsResult.FieldByName('Result').AsString := '1';
    cdsResult.Post;

    cdsResult.Append;
    cdsResult.FieldByName('TableName').AsString := 'grp_all_view';
    cdsResult.FieldByName('START_TM').AsDateTime := now;
    wb.Expression :=
         wb.NewBinaryExpression(
         wb.NewField('','GRP_KEY_SYS'),
         wb.NewConstant(srcGdraw.FieldByname('GDRAW_TREE_SYS_FK').AsInteger),dboequal);

    srcGrp := AllTableDASchema.NewDataset(Connection,'grp_all_view',[],wb.Xml);

    cdsResult.FieldByName('TableRows').AsInteger := srcGrp.RecordCount;
    cdsResult.FieldByName('END_TM').AsDateTime := now;
    cdsResult.FieldByName('Result').AsString := '1';
    cdsResult.Post;

  Except
     On E:Exception Do
     Begin
       CodeSite.Send('getEventMsg:'+E.Message);
     End;
  End;


  sjoson:=TDAJSONDataStreamer.Create(Self);
  Try
  sjoson.Initialize(Result,aiwrite);
  try
    sjoson.WriteDataset( (cdsResult as IDADataset), [woRows], -1);
    sjoson.WriteDataset(srcData, [ woRows], -1);
    sjoson.WriteDataset(srcEvt, [ woRows], -1);
    sjoson.WriteDataset(srcGdraw, [ woRows], -1);
    sjoson.WriteDataset(srcGdrawD, [ woRows], -1);
    sjoson.WriteDataset(srcGrp, [ woRows], -1);
  finally
    sjoson.Finalize;
  end;
  FreeAndNil(sjoson);
  srcData := Nil;
  srcEvt := Nil;
  srcGdraw := Nil;
  srcGdrawD := Nil;
  srcGrp :=Nil;
  cdsResult.Close;
  FreeAndNil(cdsResult);
  FreeAndNil(wb);

  Except
     On E:Exception Do
     Begin
       CodeSite.Send('getEventMsgSyn:'+E.Message);
     End;
  End;

end;

Delphi 11.1 , RODA : 10.0.0.1545
Testing Case: Jmeter use httpAPI post method to call , concurrent 15 thread in loop repeat call this httpAPI method.

I get the address violation when debug to run I get the attached picture breakpoint on the call stack.

I’ve also tested in delphi 10.4.1 with RODA 10.0.0.1495. I get the same error.

Please advise how to locate the error.

Joe

Hi,

I see nothing in your code that may cause AV.
Is AV raised only when you debug this method or in any way?

You may try to add OutputDebugString calls into your method. it will allow to detect line when AV is raised

I used below global function to create the Result table to have summary on each Target table :

Function CreateResultInfo:TDAMemDataTable;
var DAMemDataTable_Caprd: TDAMemDataTable;
 tmpField:TDAField;
begin
  DAMemDataTable_Caprd:= TDAMemDataTable.Create(Nil);
  DAMemDataTable_Caprd.LogicalName := 'RESULT_TBL';
  DAMemDataTable_Caprd.RemoteFetchEnabled := False;
  tmpField := DAMemDataTable_Caprd.Fields.Add;
  tmpField.DataType := datWideString;
  tmpField.Size := 20;
  tmpField.Name := 'Result';

  tmpField := DAMemDataTable_Caprd.Fields.Add;
  tmpField.DataType := datWideString;
  tmpField.Size := 40;
  tmpField.Name := 'TableName';

  tmpField := DAMemDataTable_Caprd.Fields.Add;
  tmpField.DataType := datInteger;
  tmpField.Name := 'TableRows';

  tmpField := DAMemDataTable_Caprd.Fields.Add;
  tmpField.DataType := datDateTime;
  tmpField.Name := 'START_TM';

  tmpField := DAMemDataTable_Caprd.Fields.Add;
  tmpField.DataType := datDateTime;
  tmpField.Name := 'END_TM';

  tmpField := DAMemDataTable_Caprd.Fields.Add;
  tmpField.DataType := datWideString;
  tmpField.Size := 100;
  tmpField.Name := 'Msg';

  DAMemDataTable_Caprd.Open;

  Result := DAMemDataTable_Caprd;

End;

After I remove this result saving, the address violation is gone.
DO u know why?

Joe

Hi,

under result saving you mean creating of cdsResult and adding records to it or sjoson.WriteDataset( (cdsResult as IDADataset), [woRows], -1); ?

I mean I cancel all operation for cdsresult.

starting from runtime create the cdsresult and the following add record and streaming to client side.

Any suggestion?

Joe

Hi,

I can see few memory leaks (wb.Expression), but it shouldn’t raise AV.

note: they can be fixed by calling wb.Clear before each assigning of wb.Expression.

can you detect with ODS what line of getevtgamedet method causes AV, pls?

can you give a example on how to use ODS as I did not use it before?

Just put it on any possible line which might have problem?

joe

Hi,

something like

OutputDebugString(PChar('TROHttpApiResult.Create'));
    Result := TROHttpApiResult.Create(HTTP_200_code, id_ContentType_application_json_charset_utf8,'',false);
...

OutputDebugString(PChar('TDAWhereBuilder.Create'));
    wb:=TDAWhereBuilder.Create;

etc.

later in Output window inside Delphi IDE you should see these messages

Thanks for your clear example, Let me try it out and get back to you

Hi,

I used the ODS way to check and find it similar codesite usage.

var
  srcData: IDADataset;

  srcGrp, srcEvt, srcGdraw, srcGdrawD : IDADataset;

  sjoson:TDAJSONDataStreamer;
  wb:TDAWhereBuilder;
  cdsResult:TDaMemDataTable;
begin
  try

    OutputDebugString(PChar(Formatdatetime('hh:nn:ss(zzz)',now)+':'+GuidToString(Session.SessionID)+'-GetGameDet:Starting'));
    Result := TROHttpApiResult.Create(HTTP_200_code, id_ContentType_application_json_charset_utf8,'',false);

    OutputDebugString(PChar(Formatdatetime('hh:nn:ss(zzz)',now)+':'+GuidToString(Session.SessionID)+'creat result Table'));
    cdsResult:=CreateResultInfoNew(Self);
    cdsResult.Append;
    cdsResult.FieldByName('TableName').AsString := 'GAMEM_TBL';
    cdsResult.FieldByName('START_TM').AsDateTime := now;


    wb:=TDAWhereBuilder.Create;
    wb.Expression :=
         wb.NewBinaryExpression(
         wb.NewField('','GAMEM_KEY_SYS'),
         wb.NewConstant(GAMEM_KEY_SYS),dboequal) ;

    srcData := AllTableDASchema.NewDataset(Connection,'GAMEM_TBL',[],wb.Xml);
    srcData.Open;

    cdsResult.FieldByName('TableRows').AsInteger := srcData.RecordCount;
    cdsResult.FieldByName('END_TM').AsDateTime := now;
    cdsResult.FieldByName('Result').AsString := '1';
    cdsResult.Post;
    OutputDebugString(PChar(Formatdatetime('hh:nn:ss(zzz)',now)+':'+GuidToString(Session.SessionID)+'-GetGameDet:Done Game'));


    cdsResult.Append;
    cdsResult.FieldByName('TableName').AsString := 'EVT_TBL';
    cdsResult.FieldByName('START_TM').AsDateTime := now;
    wb.Expression :=
         wb.NewBinaryExpression(
         wb.NewField('','EVT_KEY_SYS'),
         wb.NewConstant(srcData.FieldByName('GAMEM_GEVENT_SYS_FK').AsInteger),dboequal) ;

    srcEvt := AllTableDASchema.NewDataset(Connection,'EVT_TBL',[],wb.Xml);

    cdsResult.FieldByName('TableRows').AsInteger := srcData.RecordCount;
    cdsResult.FieldByName('END_TM').AsDateTime := now;
    cdsResult.FieldByName('Result').AsString := '1';
    cdsResult.Post;
    //CodeSite.Send(GuidToString(Session.SessionID)+'-GetGameDet:Done Evt');
    OutputDebugString(PChar(Formatdatetime('hh:nn:ss(zzz)',now)+':'+GuidToString(Session.SessionID)+'-GetGameDet:Done Evt'));

    cdsResult.Append;
    cdsResult.FieldByName('TableName').AsString := 'GDRAW_MTR';
    cdsResult.FieldByName('START_TM').AsDateTime := now;
    wb.Expression :=
         wb.NewBinaryExpression(
         wb.NewField('','GDRAW_KEY_SYS'),
         wb.NewConstant(srcData.FieldByName('GAMEM_GDRAW_SYS_FK').AsInteger),dboequal) ;

    srcGdraw := AllTableDASchema.NewDataset(Connection,'GDRAW_MTR',[],wb.Xml);
    srcGdraw.Open;
    cdsResult.FieldByName('TableRows').AsInteger := srcGdraw.RecordCount;
    cdsResult.FieldByName('END_TM').AsDateTime := now;
    cdsResult.FieldByName('Result').AsString := '1';
    cdsResult.Post;
    OutputDebugString(PChar(Formatdatetime('hh:nn:ss(zzz)',now)+':'+GuidToString(Session.SessionID)+'-GetGameDet:Done Gdraw_Mtr'));

    cdsResult.Append;
    cdsResult.FieldByName('TableName').AsString := 'GDRAW_DET';
    cdsResult.FieldByName('START_TM').AsDateTime := now;
    wb.Expression :=
         wb.NewBinaryExpression(
         wb.NewField('','GDRAWD_KEY_SYS'),
         wb.NewConstant(srcData.FieldByName('GAMEM_BLUE_GDRAWD_SYS_FK').AsInteger),dboequal) ;

    srcGdrawD := AllTableDASchema.NewDataset(Connection,'GDRAW_DET',[],wb.Xml);

    cdsResult.FieldByName('TableRows').AsInteger := srcGdrawD.RecordCount;
    cdsResult.FieldByName('END_TM').AsDateTime := now;
    cdsResult.FieldByName('Result').AsString := '1';
    cdsResult.Post;
    OutputDebugString(PChar(Formatdatetime('hh:nn:ss(zzz)',now)+':'+GuidToString(Session.SessionID)+'-GetGameDet:Done Gdraw_Det'));

    cdsResult.Append;
    cdsResult.FieldByName('TableName').AsString := 'grp_all_view';
    cdsResult.FieldByName('START_TM').AsDateTime := now;
    wb.Expression :=
         wb.NewBinaryExpression(
         wb.NewField('','GRP_KEY_SYS'),
         wb.NewConstant(srcGdraw.FieldByname('GDRAW_TREE_SYS_FK').AsInteger),dboequal);

    srcGrp := AllTableDASchema.NewDataset(Connection,'grp_all_view',[],wb.Xml);

    cdsResult.FieldByName('TableRows').AsInteger := srcGrp.RecordCount;
    cdsResult.FieldByName('END_TM').AsDateTime := now;
    cdsResult.FieldByName('Result').AsString := '1';
    cdsResult.Post;
    OutputDebugString(PChar(Formatdatetime('hh:nn:ss(zzz)',now)+':'+GuidToString(Session.SessionID)+'-GetGameDet:Done Grp_View'));

  Except
     On E:Exception Do
     Begin
       cdsResult.FieldByName('END_TM').AsDateTime := now;
       cdsResult.FieldByName('Result').AsString := '0';
       cdsResult.FieldByName('Msg').AsString := Copy(E.Message,1,100);
       cdsResult.Post;
       OutputDebugString(PChar('getEventMsg:'+E.Message));
     End;
  End;


  OutputDebugString(PChar(Formatdatetime('hh:nn:ss(zzz)',now)+':'+GuidToString(Session.SessionID)+'-GetGameDet:Json Streaming'));
  sjoson:=TDAJSONDataStreamer.Create(Self);
  Try
  sjoson.Initialize(Result,aiwrite);
  try
    sjoson.WriteDataset( (cdsResult as IDADataset), [woRows], -1);
    sjoson.WriteDataset(srcData, [ woRows], -1);
    sjoson.WriteDataset(srcEvt, [ woRows], -1);
    sjoson.WriteDataset(srcGdraw, [ woRows], -1);
    sjoson.WriteDataset(srcGdrawD, [ woRows], -1);
    sjoson.WriteDataset(srcGrp, [ woRows], -1);
  finally
    sjoson.Finalize;
  end;
  OutputDebugString(PChar(Formatdatetime('hh:nn:ss(zzz)',now)+':'+GuidToString(Session.SessionID)+'-GetGameDet:Done Streaming'));
  FreeAndNil(sjoson);
  srcData := Nil;
  srcEvt := Nil;
  srcGdraw := Nil;
  srcGdrawD := Nil;
  srcGrp :=Nil;
  OutputDebugString(PChar(Formatdatetime('hh:nn:ss(zzz)',now)+':'+GuidToString(Session.SessionID)+'-GetGameDet:Free result and wb'));
  cdsResult.Close;
  FreeAndNil(cdsResult);
  FreeAndNil(wb);

  Except
     On E:Exception Do
     Begin
       CodeSite.Send('getEventMsgSyn:'+E.Message);
     End;
  End;
  OutputDebugString(PChar(Formatdatetime('hh:nn:ss(zzz)',now)+':'+GuidToString(Session.SessionID)+'-GetGameDet:#####Finish'));
Debug Output: 12:16:18(806):{81185D20-5500-401E-84AB-53655486C0AC}-GetGameDet:Starting Process TemplServerServer.exe (7592)
Debug Output: 12:16:18(830):{81185D20-5500-401E-84AB-53655486C0AC}creat result Table Process TemplServerServer.exe (7592)
Debug Output: 12:16:18(857):{81185D20-5500-401E-84AB-53655486C0AC}-GetGameDet:Done Game Process TemplServerServer.exe (7592)
Debug Output: 12:16:18(878):{81185D20-5500-401E-84AB-53655486C0AC}-GetGameDet:Done Evt Process TemplServerServer.exe (7592)
Debug Output: 12:16:18(890):{4D82E4DF-04B5-4874-AB33-88AB0E0B2E5D}-GetGameDet:Done Game Process TemplServerServer.exe (7592)
Debug Output: 12:16:18(908):{81185D20-5500-401E-84AB-53655486C0AC}-GetGameDet:Done Gdraw_Mtr Process TemplServerServer.exe (7592)
Debug Output: 12:16:18(921):{81185D20-5500-401E-84AB-53655486C0AC}-GetGameDet:Done Gdraw_Det Process TemplServerServer.exe (7592)
Debug Output: 12:16:18(931):{81185D20-5500-401E-84AB-53655486C0AC}-GetGameDet:Done Grp_View Process TemplServerServer.exe (7592)
Debug Output: 12:16:18(939):{81185D20-5500-401E-84AB-53655486C0AC}-GetGameDet:Json Streaming Process TemplServerServer.exe (7592)
Debug Output: 12:16:18(948):{4D82E4DF-04B5-4874-AB33-88AB0E0B2E5D}-GetGameDet:Done Evt Process TemplServerServer.exe (7592)
Debug Output: 12:16:18(973):{81185D20-5500-401E-84AB-53655486C0AC}-GetGameDet:Done Streaming Process TemplServerServer.exe (7592)
Debug Output: 12:16:18(982):{4D82E4DF-04B5-4874-AB33-88AB0E0B2E5D}-GetGameDet:Done Gdraw_Mtr Process TemplServerServer.exe (7592)
Debug Output: 12:16:18(989):{81185D20-5500-401E-84AB-53655486C0AC}-GetGameDet:Free resultsult and wb Process TemplServerServer.exe (7592)
Debug Output: 12:16:18(999):{81185D20-5500-401E-84AB-53655486C0AC}-GetGameDet:#####Finish Process TemplServerServer.exe (7592)
First chance exception at $00000000. Exception class $C0000005 with message 'access violation at 0x00000000: access of address 0x00000000'. Process

From above I guess it finshed the function then trigger the AV.

Am I correct?

Any Idea to check?

Joe

Hi,

delphi destroys local objects after function is finished.
try to use FastMM5 memory manager for checking issues with memory.
you may destroy the same object twice.

for example, replace

sjoson:=TDAJSONDataStreamer.Create(Self);

with

sjoson:=TDAJSONDataStreamer.Create(nil);

I’ve used the fastMM to check and find below memoery leak
2022-10-19_16h07_49

I’ve already add thw wb.clear in below:

function TAllTableService.getevtgamedet(GAMEM_KEY_SYS:integer): binary;
var
  srcData: IDADataset;

  srcGrp, srcEvt, srcGdraw, srcGdrawD : IDADataset;

  sjoson:TDAJSONDataStreamer;
  wb:TDAWhereBuilder;
  cdsResult:TDaMemDataTable;
begin
  try

    OutputDebugString(PChar(Formatdatetime('hh:nn:ss(zzz)',now)+':'+GuidToString(Session.SessionID)+'-GetGameDet:Starting'));
    Result := TROHttpApiResult.Create(HTTP_200_code, id_ContentType_application_json_charset_utf8,'',false);

    OutputDebugString(PChar(Formatdatetime('hh:nn:ss(zzz)',now)+':'+GuidToString(Session.SessionID)+'creat result Table'));
    cdsResult:=CreateResultInfoNew(nil);
    cdsResult.Append;
    cdsResult.FieldByName('TableName').AsString := 'GAMEM_TBL';
    cdsResult.FieldByName('START_TM').AsDateTime := now;


    wb:=TDAWhereBuilder.Create;
    wb.Clear;
    wb.Expression :=
         wb.NewBinaryExpression(
         wb.NewField('','GAMEM_KEY_SYS'),
         wb.NewConstant(GAMEM_KEY_SYS),dboequal) ;

    srcData := AllTableDASchema.NewDataset(Connection,'GAMEM_TBL',[],wb.Xml);
    srcData.Open;

    cdsResult.FieldByName('TableRows').AsInteger := srcData.RecordCount;
    cdsResult.FieldByName('END_TM').AsDateTime := now;
    cdsResult.FieldByName('Result').AsString := '1';
    cdsResult.Post;
    OutputDebugString(PChar(Formatdatetime('hh:nn:ss(zzz)',now)+':'+GuidToString(Session.SessionID)+'-GetGameDet:Done Game'));


    cdsResult.Append;
    cdsResult.FieldByName('TableName').AsString := 'EVT_TBL';
    cdsResult.FieldByName('START_TM').AsDateTime := now;
    wb.Clear;
    wb.Expression :=
         wb.NewBinaryExpression(
         wb.NewField('','EVT_KEY_SYS'),
         wb.NewConstant(srcData.FieldByName('GAMEM_GEVENT_SYS_FK').AsInteger),dboequal) ;

    srcEvt := AllTableDASchema.NewDataset(Connection,'EVT_TBL',[],wb.Xml);

    cdsResult.FieldByName('TableRows').AsInteger := srcData.RecordCount;
    cdsResult.FieldByName('END_TM').AsDateTime := now;
    cdsResult.FieldByName('Result').AsString := '1';
    cdsResult.Post;
    //CodeSite.Send(GuidToString(Session.SessionID)+'-GetGameDet:Done Evt');
    OutputDebugString(PChar(Formatdatetime('hh:nn:ss(zzz)',now)+':'+GuidToString(Session.SessionID)+'-GetGameDet:Done Evt'));

    cdsResult.Append;
    cdsResult.FieldByName('TableName').AsString := 'GDRAW_MTR';
    cdsResult.FieldByName('START_TM').AsDateTime := now;
    wb.Clear;
    wb.Expression :=
         wb.NewBinaryExpression(
         wb.NewField('','GDRAW_KEY_SYS'),
         wb.NewConstant(srcData.FieldByName('GAMEM_GDRAW_SYS_FK').AsInteger),dboequal) ;

    srcGdraw := AllTableDASchema.NewDataset(Connection,'GDRAW_MTR',[],wb.Xml);
    srcGdraw.Open;
    cdsResult.FieldByName('TableRows').AsInteger := srcGdraw.RecordCount;
    cdsResult.FieldByName('END_TM').AsDateTime := now;
    cdsResult.FieldByName('Result').AsString := '1';
    cdsResult.Post;
    OutputDebugString(PChar(Formatdatetime('hh:nn:ss(zzz)',now)+':'+GuidToString(Session.SessionID)+'-GetGameDet:Done Gdraw_Mtr'));

    cdsResult.Append;
    cdsResult.FieldByName('TableName').AsString := 'GDRAW_DET';
    cdsResult.FieldByName('START_TM').AsDateTime := now;
    wb.Expression :=
         wb.NewBinaryExpression(
         wb.NewField('','GDRAWD_KEY_SYS'),
         wb.NewConstant(srcData.FieldByName('GAMEM_BLUE_GDRAWD_SYS_FK').AsInteger),dboequal) ;

    srcGdrawD := AllTableDASchema.NewDataset(Connection,'GDRAW_DET',[],wb.Xml);

    cdsResult.FieldByName('TableRows').AsInteger := srcGdrawD.RecordCount;
    cdsResult.FieldByName('END_TM').AsDateTime := now;
    cdsResult.FieldByName('Result').AsString := '1';
    cdsResult.Post;
    OutputDebugString(PChar(Formatdatetime('hh:nn:ss(zzz)',now)+':'+GuidToString(Session.SessionID)+'-GetGameDet:Done Gdraw_Det'));

    cdsResult.Append;
    cdsResult.FieldByName('TableName').AsString := 'grp_all_view';
    cdsResult.FieldByName('START_TM').AsDateTime := now;
    wb.Clear;
    wb.Expression :=
         wb.NewBinaryExpression(
         wb.NewField('','GRP_KEY_SYS'),
         wb.NewConstant(srcGdraw.FieldByname('GDRAW_TREE_SYS_FK').AsInteger),dboequal);

    srcGrp := AllTableDASchema.NewDataset(Connection,'grp_all_view',[],wb.Xml);

    cdsResult.FieldByName('TableRows').AsInteger := srcGrp.RecordCount;
    cdsResult.FieldByName('END_TM').AsDateTime := now;
    cdsResult.FieldByName('Result').AsString := '1';
    cdsResult.Post;
    OutputDebugString(PChar(Formatdatetime('hh:nn:ss(zzz)',now)+':'+GuidToString(Session.SessionID)+'-GetGameDet:Done Grp_View'));

  Except
     On E:Exception Do
     Begin
       cdsResult.FieldByName('END_TM').AsDateTime := now;
       cdsResult.FieldByName('Result').AsString := '0';
       cdsResult.FieldByName('Msg').AsString := Copy(E.Message,1,100);
       cdsResult.Post;
       OutputDebugString(PChar('getEventMsg:'+E.Message));
     End;
  End;


  OutputDebugString(PChar(Formatdatetime('hh:nn:ss(zzz)',now)+':'+GuidToString(Session.SessionID)+'-GetGameDet:Json Streaming'));
  sjoson:=TDAJSONDataStreamer.Create(Nil);
  Try
  sjoson.Initialize(Result,aiwrite);
  try
    sjoson.WriteDataset( (cdsResult as IDADataset), [woRows], -1);
    sjoson.WriteDataset(srcData, [ woRows], -1);
    sjoson.WriteDataset(srcEvt, [ woRows], -1);
    sjoson.WriteDataset(srcGdraw, [ woRows], -1);
    sjoson.WriteDataset(srcGdrawD, [ woRows], -1);
    sjoson.WriteDataset(srcGrp, [ woRows], -1);
  finally
    sjoson.Finalize;
  end;
  OutputDebugString(PChar(Formatdatetime('hh:nn:ss(zzz)',now)+':'+GuidToString(Session.SessionID)+'-GetGameDet:Done Streaming'));
  FreeAndNil(sjoson);
  srcData := Nil;
  srcEvt := Nil;
  srcGdraw := Nil;
  srcGdrawD := Nil;
  srcGrp :=Nil;
  OutputDebugString(PChar(Formatdatetime('hh:nn:ss(zzz)',now)+':'+GuidToString(Session.SessionID)+'-GetGameDet:Free result and wb'));
  cdsResult.Close;
  FreeAndNil(cdsResult);
  FreeAndNil(wb);

  Except
     On E:Exception Do
     Begin
       CodeSite.Send('getEventMsgSyn:'+E.Message);
     End;
  End;
  OutputDebugString(PChar(Formatdatetime('hh:nn:ss(zzz)',now)+':'+GuidToString(Session.SessionID)+'-GetGameDet:#####Finish'));

Please advise where has the memory leakage.

Joe

Hi,

I’ve solved the memory leakage but still get AV , Please advise how to locate the error.
joe

Hi,

First chance exception at $00000000. Exception class $C0000005 with message ‘access violation at 0x00000000: access of address 0x00000000’. Process

looks like code tries to call method or access to property of nil object.

Have you compiled your server with disabled optimization and enabled debug dcu?


these options can hide actual exception if it is raised in standard delphi files.

try to set breakpoint in TRORemoteDataModule.Destroy. will your service destroyed correctly?

1 Like