вторник, 25 ноября 2008 г.

Получили Internal error в Delphi?

Это перевод справочной системы Delphi.

Сообщение об ошибке Internal Error: X1234 указывает на то, что компилятор столкнулся с некоторой ситуацией, отличной от синтаксической ошибки, и он не может продолжить компиляцию.

Подсказка: в коде ошибки Internal error зашифрован файл и строка в исходниках компилятора, где возникла ошибка. Эта информация может помочь технической поддержке выявить проблему. Не забудьте записать эту информацию и прикрепить её к своему отчёту об ошибке.

Как избавится от Internal error

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

Если проблема всё ещё существует
  • Удалите все .dcu(il) файлы, связанные с вашим проектом.
  • Полностью закройте ваш проект (File/Close all).
  • Заново откройте свой проект. Это очистит кэш модулей в IDE. Как вариант - вы можете перезапустить IDE.
  • Ещё вариант - попробовать перекомпилировать приложения используя команду Build (а не Compile) - при этом компилятор пересоздаст все dcu(il) файлы.
Если ошибка не уходит, закройте IDE и попробуйте перекомпилировать приложение, используя компилятор командной строки (dcc(il).exe). Это исключит из рассмотрения кэширование юнитов в IDE.

Проанализируйте свой код от последнего изменения

Если проблема ещё актуальна, вернитесь к тому месте в коде, где вы последний раз что-то меняли и просмотрите свой код. Обычно, большинство ошибок internal error могут быть воспроизведены всего несколькими строками кода и часто при этом код использует синтаксические конструкции, которые используются довольно редко. В этом случае, попробуйте модифицировать код, чтобы он выполнял свою работу, но другим способом. Например, если вы используете приведение типа в выражении, попробуйте объявить переменную нужного типа и сначала присвоить ей значение, а уж потом использовать её в выражении:
begin
    if Integer(b) = 100 then...
end;
var
 a: Integer;
begin
  a := b;
  if a = 100 then...
end;
А вот пример неожиданного кода, который вы можете исправить для избавления от ошибки:
var
    A : Integer;
begin
 { Второе преобразование A в Int64 не нужно; если вы уберёте его, это может избавить вас и от Internal Error. }
 if Int64(Int64(A))=0 then
end;
Если проблема связана с циклом while...do - попробуйте заменить его на for...do. Хотя эти изменения не исправляют глюк компилятора, они могут помочь вам продолжать работать над своим приложением. Если ваши изменения избавляют вас от ошибки, это не значит, что все while или for циклы глючат - скорее вы используете их несколько необычным образом.

Как только вы смогли изолировать проблему - было бы не плохо сделать минимально возможный тестовый пример-проект, который демонстрирует возникновение вашей ошибки и выслать его на Quality Central.

Другие способы для избавления от ошибок internal error
  • Если проблема связана с циклами - попробуйте поменять for на while/repeat или наоборот.
  • Если проблема возникает во вложенных функциях - попробуйте сделать их глобальными.
  • Если проблема возникает в приведении типов - попробуйте воспользоваться другим, аналогичным по смыслу приведением или используйте временные переменные.
  • Если проблема возникает в операторе with - попробуйте его убрать и расписать явно.
  • Попробуйте выключить оптимизацию (Project/Options/Compiler).

Когда ничего не получилось

Обычно есть множество различных кусков кода, которые могут добиться нужной вам цели. Вы можете попробовать избавиться от ошибки, меняя код. Попробуйте просто переписать код с нуля, чтобы он выполнял вашу задачу, но делал это просто по-другому. Может быть, выбранное решение и не будет оптимальным, но по-крайней мере вы сможете продолжать работу над своим приложением.
Если у вас есть последняя версия компилятора - проверьте свой код в ней. Если проблема воспроизводится - отправьте, как и ранее, в Quality Central минимальную демку проблемы. Если же проблемы нет - то значит, этот глюк компилятора уже был исправлен.

Конфигурация IDE для минимизации шанса возникновения internal error

Создайте один каталог, где будут лежать все ваши файлы .dcp(il). Например, создайте каталог C:\DCPIL ив Tools Environment/Options/Library установите DCP(IL) output directory в C:\DCPIL. Эта настройка гарантирует, что все .dcp(il) файлы, генерируемые компилятором пойдут в одну папку и, таким образом, будут самыми свежими. Это полезная опция, если вы перемещаете пакет из одного каталога в другой. Вы можете создать каталог и для .dcu(il) файлов, используя Project/Options/Directories/Conditionals/Unit output directory.

Смысл этих изменений в том, чтобы всегда использовать самые свежие версии ваших .dcu(il) и .dcp(il). В противном случае, вы можете встретиться с ошибками internal error.

2 комментария:

  1. У меня в 9 случаях из 10 ошибки Internal Error были вызваны установленными "экспертами".

    ОтветитьУдалить
  2. Анонимный6 июля 2011 г., 23:56

    Проблема возникала на XE при установленном антивирусе avira. Решилась переходом на avast. Возможно, может что-нибудь сидеть в файерволле/брендмауэре.

    ОтветитьУдалить

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.