AV после успешного закрытия приложений - PullRequest
1 голос
/ 19 февраля 2012

Я получаю это AV-сообщение через 3-5 секунд после закрытия приложений, как и ожидалось:

Исключение EAccessViolation в модуле rtl160.bpl на 00073225. Нарушение доступа по адресу 500A3225 в модуле 'rtl160.bpl'. Чтение адреса 00000004.

Эти (20) приложения очень похожи в том, что они являются бизнес-приложениями IBX. Около половины из них не вызывали возникновения AV.

Эти приложения были портированы с Delphi-xe и долгое время работали без нареканий. Не было внесено никаких изменений в проекты в порту. И 32-, и 64-разрядные сборки дали одинаковые результаты.

Это ошибка в разделе финализации какой-то библиотеки, освобождающая ресурс или что-то в этом роде?

Я использую Delphi-XE2 Update 3.

Буду признателен за помощь.

Ответы [ 3 ]

3 голосов
/ 06 июня 2012

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

Общие советы:

  • Старайтесь всегда отменять вещи вв обратном порядке вы сделали их.Например,
    • Создание A, создание B ... уничтожение B, уничтожение A
    • подключение к базе данных, открытие набора данных ... закрытие набора данных, отключение от базы данных
  • Даже уверенность в том, что вы выполнили все вышеперечисленное перед выключением, может оказать огромную помощь.
  • Любые потоки, которые все еще работают во время работы вашего приложения, могут вызвать проблемы.
    • Желательно убедиться, что все ваши дочерние потоки должным образом прерваны до окончательного завершения работы.
    • Обратитесь к разделу Закрытие наборов данных выше.В зависимости от того, что вы делаете, некоторые компоненты базы данных будут создавать свои собственные потоки.
  • Если вы используете COM, попробуйте убедиться, что ComObj находится высоко в последовательности инициализации (т.е. разместите егокак можно выше в вашем ДНР).
    • Delphi завершает юниты в обратном порядке, в котором они были инициализированы.
    • И вы не хотите, чтобы ComObj завершал работу до того, как другие вещи, зависящие от ComObj, также сделали это.1029 *
    • Если вы используете интерфейс ссылок, убедитесь, что вы решили проблемы с циклическими ссылками.
    • Некоторые из этих проблем найти сложно, но вы можете сделать этоследующее:
      • Настройка среды «песочницы» с исходным кодом (вы будете собирать все свои изменения, как только обнаружите проблему).
      • Найдите простейший наборшагов, необходимых для гарантии ошибки.(Запустите приложение, и немедленное завершение работы будет идеальным вариантом.)
      • Затем вы будете комментировать удаление, стирать куски кода между тестами и в основном следовать принципу «разделяй и властвуй», чтобы:
        • выньте код
        • test
        • , если проблема не устранена, повторите.В противном случае выполните откат и извлеките другой фрагмент кода.
      • в конечном итоге ваша кодовая база будет достаточно маленькой, чтобы определить вероятные проблемы, которые могут быть решены с помощью целевого тестирования.
3 голосов
/ 09 марта 2012

Попробуйте использовать madExcept / EurekaLog и т. Д. - они дают вам подробную трассировку стека на AV.Это не всегда панацея, но может указать вам на проблему.

0 голосов
/ 21 июня 2017

У меня иногда возникала такая проблема с нарушением прав доступа в старых проектах Delphi или C ++ Builder.Сегодня у меня было это с C ++ Builder.Во время сбоя, глядя в окно Debug -> Call Stack, я вижу, что это происходит внутри вызова fflush, вызываемого __exit_streams и _exit.

Я не уверен, что является причиной этого, так как он настолько глубоко в коде библиотеки Borland, но, кажется, он приходит и уходит наугад, когда код изменяется.И, похоже, это чаще встречается в приложениях с несколькими формами.

На этот раз ошибка исчезла, когда Я только что добавил новую кнопку на главной форме.Кнопка, которая просто есть, не имеет обработчиков событий и ничего не делает.Я думаю, что любое случайное изменение кода, классов, переменных и т. Д. Приводит к изменению структуры памяти при повторной привязке приложения, и это либо вызывает, либо не вызывает ошибку.

Пока я просто оставляю новую кнопку наформа, установите его "невидимым", чтобы не было видимых изменений.Кажется, это работает, но для меня это достаточно хорошее решение.

...