У нас есть приложение Delphi, которое работает в течение нескольких лет, и теперь мы внезапно получаем странные нарушения доступа. Мы использовали Eurekalog, чтобы проследить, откуда он, и это еще более странно. Они до сих пор находятся на свободном вызове объекта, но внутри try, кроме блока. Один из них даже в 2 попытках, кроме блоков, и все же, когда происходит нарушение доступа, он полностью выпрыгивает из программы и игнорирует исключение try, ничего, кроме EurekaLog, ловит его в конце. На самом деле это путают, почему это внезапно происходит (оба экземпляра - это старый код, который не затрагивался годами, а также другие изменения кода не связаны с ним).Не удается получить нарушение доступа
Пример из кода является
try
if Assigned(ClientCommunication) then begin
if ClientCommunication.isConnected then begin
if ClientCommunication.closeServerConnection then begin
try
ClientCommunication.Free;
ClientCommunication := nil;
Except
on e:Exception do begin
ClientCommunication := nil; //suppress weird AV error.. get read for new object
end
end;
Теперь последняя попытка только была добавлена позже, чтобы попытаться подавить AV, как мы просто хотим, чтобы объект очищенную должен быть перезапущен, если это необходимо, но это в основном вызывается, когда закрытие приложения. Но он все еще просто выскакивает из этого, и я не могу его поймать.
Он работает на наших компьютерах разработчиков, а не у клиента.
Пахнет кучей коррупции. Решение будет включать отладку. Только ты можешь это сделать. –
_Heap crime_, скорее всего, случай, но я могу представить, что метод '.closeServerConnection()' уничтожает родительский объект объекта ClientCommunication (через обратный вызов или некоторую акробатику указателя), поэтому любая попытка доступа к нему может легко привести к AV-ошибке. В любом случае вы можете попытаться отладить проблему, добавив часы к «ClientCommunication» и ее родительскому объекту, затем выполните код по очереди и посмотрите, куда были выпущены указатели. ** Ошибка, очевидно, не в коде, показанном выше. ** – mg30rg
Я сделал этот тип отладки, проблема заключается в том, что родитель фактически не освобождается нигде внутри закрытия. Он просто отправляет команду закрытия на сервер и закрывает соединение. Вот почему это очень странно. Но если куча коррупции, то действительно странно. Посмотрите, что я могу сделать, добавив FastMM4 сейчас, чтобы попытаться выяснить, может ли он каким-то образом осветить проблему. – Johannes