Что означает «Неверный адрес, указанный для RtlFreeHeap (06450000, 08387460)»? - PullRequest
2 голосов
/ 10 апреля 2011

Иногда в моей программе на Delphi возникают случайные сбои.Моя программа останавливается, и отладчик выдает:

Неправильный адрес, указанный для RtlFreeHeap (06450000, 08387460)

Что это значит?И чем это может быть вызвано?

Здесь инспектор ЦП остановился:

77BA0845 C6052582BD7700 mov byte ptr [$ 77bd8225], $ 00

Обратите внимание, что они очень случайные (для меня).Иногда они вообще не появляются.

Я использую Skype4COM.dll из Skype - источника нет.

Если вам это нужно, воткод.Я прокомментировал большинство вызовов Synchronize, чтобы вы знали, что они делают.

////////////////////////////////////////////////////////////////////////////////
/// Execute
////////////////////////////////////////////////////////////////////////////////
procedure TContactDeletor.Execute;
Var
  I             : Integer;
  UserObj       : PUser;
  User          : IUser;
  PauseEvent    : TEvent;
begin
  inherited;
  FreeOnTerminate       := True;
  if Terminated then
  Exit;

  CoInitialize(Nil);
  // The F-Flags are to make sure TSkype events do not fire (from my Main Thread)
  FAllowUI              := False;
  FUserIsBeingDeleted   := False;
  FUseGroupUsersEvent   := False;
  FUseRenameEvent       := False;
  SkypeThr              := TSkype.Create(Nil);
  SkypeThr.Attach(10,False);
  SkypeThr.Cache        := False;
  MyList                := TStringList.Create;
  PauseEvent            := TEvent.Create(True);
  try
  // This fills my Stringlist
  Synchronize(GrabList);
  if Terminated then Exit;


  iMax                  := MyList.Count;
  // This sets the Max of my Progressbar
  Synchronize(SetMax);
  Try
  for I := 0 to MyList.Count - 1 do
    begin

      {while SkypeThr.AttachmentStatus <> apiAttachSuccess do
      begin
        SkypeThr.Attach(10,False);
        Synchronize(Procedure Begin Log('Skype Unavailable - Trying to reconnect ...'); End);
        PauseEvent.WaitFor(5000);
      end;  }

      CurUser := '';
      User := SkypeThr.User[MyList[I]];
      CurUser := MyList[I];

      Try
      User.IsAuthorized := False;
      User.BuddyStatus := budDeletedFriend;
      Except on E:Exception do
      begin
       ExErr := E.Message;
       ExLog := 'Error while deleting contacts: ';
       ExMsg := 'An Error has occured while deleting contacts: ';
       Synchronize(
       Procedure
       Begin
        Log(ExLog+ExErr+sLineBreak+' - Last logged Handle: '+CurUser);
       End
       );    
      end;
      end;

      iProgress := I+1;
      // This updates my log and my progressbar.
      Synchronize(UpdatePG);
      PauseEvent.WaitFor(100);

      if (I mod 200 = 0) and (I > 0) then
        begin
          // Calls to Synchronize updates my log
          Synchronize(SyncPauseBegin);
          PauseEvent.WaitFor(3000);
          Synchronize(SyncPauseEnd);
        end;


    end;
  // Except
  Except on E:Exception do
  begin
   ExErr := E.Message;
   ExLog := 'Error while deleting contacts: ';
   ExMsg := 'An Error has occured while deleting contacts: ';
   Synchronize(
   Procedure
   Begin
    Log(ExMsg+ExErr+sLineBreak+' - Last logged Handle: '+CurUser);
    ErrMsg(ExMsg+ExErr+sLineBreak+sLineBreak+' - Last logged Handle: '+CurUser);
   End
   );
   Exit;
  end;
  end;
  // This synchronizes my visual list.
  Synchronize(SyncList);
  finally
   FUserIsBeingDeleted   := False;
   FUseGroupUsersEvent   := True;
   FUseRenameEvent       := True;
   FAllowUI              := True;
   Synchronize(
   Procedure
   Begin
   frmMain.UpdateStatusBar;
   PleaseWait(False);
   ToggleUI(True);
   end);
   PauseEvent.Free;
   SkypeThr.Free;
   MyList.Free;
   CoUninitialize;
  end;


end;

1 Ответ

0 голосов
/ 29 апреля 2011

Наджем был прав, это потому, что ваша куча повреждена. Чтобы упростить отладку, вы должны включить PageHeap , а также максимально использовать отладочный CRT (или время отладки delphi), пока не узнаете, что повреждает вашу память.

В большинстве случаев искажение может распространяться только на несколько байтов. Тогда ваше приложение может работать нормально в течение очень долгого времени, так что вы не заметите ничего плохого, если не будете это делать намного позже.

Попытайтесь аккуратно выйти из приложения, когда вы ищете ошибки, связанные с повреждением памяти, не останавливайте отладчик, когда ваш процесс завершается, он должен «касаться» большей части памяти, выделенной ранее, и это даст вам возможность обнаружить провал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...