编译DPK项目时的Delphi内部错误

时间:2016-08-25 13:50:54

标签: delphi compiler-errors delphi-xe3

我有一个DPK项目,有时会在编译(进入Delphi IDE)时显示错误("内存不足和#34;),有时它会成功编译。 但是,当我尝试通过MSBUILD进行编译时,它总是会抛出此错误消息:

  

错误F2084:内部错误:AV004A784A-WFFFD3764-1

有人有想法解决它吗?

3 个答案:

答案 0 :(得分:3)

这样的内部错误是编译器错误。我们无法解决它们,只有编译器开发人员才能解决它们。您需要向Embarcadero提交错误报告。鉴于XE3的古老性,你不太可能得到修复。

现代版本的Delphi不太容易出现内存故障,因此如果升级是一种选择,那么这样做可能会使问题边缘化。

如果升级不是一个选项,那么每次遇到其中一个错误时,你可能不得不继续混淆和诅咒。

答案 1 :(得分:2)

这实际上非常普遍(至少我经常遇到这类错误)。我确实采用了从DPK逐步删除源代码文件的方法,直到编译工作。通过这种方式,您还可以看到导致这些错误的文件,然后继续并逐步退出此文件中的源代码部分,直到找到有问题的行,然后重写它(以您需要以何种方式查找自己)。

答案 2 :(得分:2)

正如David Heffernan所说,你无法真正解决它,因为错误是编译器或链接器的内部错误,只有这些错误的开发人员可以删除该错误。

但通常,有一些解决方法。

根据我的经验,这些内部错误通常与泛型和匿名方法或内联代码有关,特别是如果将两个或所有这些组合在一起。

因此,找出在发生内部错误之前所做的代码更改。如果您使用版本控制系统或Delphi的内部_history系统,请恢复到以前的版本,直到错误消失为止。然后你可以对你的“违规”代码做些改变,看看哪些代码导致了内部错误。

通常,过于复杂的表达式(特别是对于我上面提到的类型)会导致内部错误。如果是这种情况,请尝试通过首先计算子表达式来简化表达式。此外,而不是使用像

这样的临时通用声明
x := TList<SomeType<Integer>>.Create;

你应该尝试使用预定义的类型:

type
  SomeTypeInteger = SomeType<Integer>;
  SometypeList = TList<SomeTypeInteger>;

  ...

  x := SometypeList.Create;

换句话说,

  • 尝试通过回溯历史记录直到它消失来找到“违规”代码
  • 一旦找到它,尝试简化这段代码。 Disentangle表达式和预定义类型
  • 尝试使用不同的方式表达代码,直到错误消失为止

如果您这样做,您可能会成功避免内部错误。它经常花费我一些时间,但我总能找到一种方法来实现我想要的。如果你不能,请在这里询问具体的错误(通过发布有问题的代码,确切的错误,如果可能的话Minimal, Complete, and Verifiable example)。

幸运的是,这些错误在最新的编译器中变得非常罕见。