我正在使用ADA语言(仅10000行)开发一个大型项目。在使用合同基础编程(ADA-2012功能,例如预,后条件,类型不变等)期间关于错误的类型和位置的任何混乱。
然后,要弄清楚问题是关于ADA 2012功能的问题,还是关于任何运行时错误,我试图插入一个简单的运行时错误,该错误不关心断言/合同:零分部。<<<<<<<<<</p>
declare
X : Integer := 1 - 1;
Y : Integer := 1 / X;
begin
null;
end;
在这种情况下,编译器建议我将提出一个例外,但是在运行时,该程序完全终止,但任何内容都被打印出来。因此,问题带有各种运行时检查失败,不仅是那些关注主张的失败。
此外,我尝试使用只有几行代码来制作一个新项目,以尝试简单的运行时错误(如零之前,以及前提条件和断言失败。在这个小项目中,程序在consolle上打印所有错误。
只有大型项目受到问题的影响。我的问题是问题在哪里?为什么这仅影响我的项目而不是简单的项目,而只是创建的一个?是否有可能会抑制运行时检查失败打印的选项?我在Xubuntu 13.10上跑步。我正在使用GNAT,GPS,GNATCOLL,AWS,POLYB的最新GPL版本。我正在用开关" -gnata"one_answers" -gnat12"编译。
非常感谢您的帮助。
如果要使用GNAT作为适当的ADA编译器,则应将其作为绝对最低限度传递,这些参数:
- " - fstack-check", - 生成堆栈检查代码(ADA的一部分)
- " - gnata", - 启用断言(ADA的一部分)
- " - gnato", - 溢出检查(ADA的一部分)
我个人写了这个项目文件,我用它将我的首选参数设置为gnat:
-- O mighty Emacs, please use -*- Ada -*- mode in this lowly file.
abstract project Ada_2012 is
for Source_Dirs use ();
package Builder is
for Default_Switches ("Ada")
use ("-m");
end Builder;
package Compiler is
for Default_Switches ("Ada")
use ("-fstack-check", -- Generate stack checking code (part of Ada)
"-gnata", -- Enable assertions (part of Ada)
"-gnato13", -- Overflow checking (part of Ada)
"-gnatf", -- Full, verbose error messages
"-gnatwa", -- All optional warnings
"-gnatVa", -- All validity checks
"-gnaty3abcdefhiklmnoOprstux", -- Style checks
"-gnatwe", -- Treat warnings as errors
"-gnat2012", -- Use Ada 2012
"-Wall", -- All GCC warnings
"-O2"); -- Optimise (level 2/3)
end Compiler;
end Ada_2012;
i"在我的所有ADA(2012)项目文件中使用"此文件,可以轻松访问我的标准设置。这是一个示例(来自http://repositories.jacob-sparre.dk/lego-tools):
-- O mighty Emacs, please use -*- Ada -*- mode in this lowly file.
with "ada_2012";
project LEGO_Tools is
for Source_Dirs use ("src/",
"../../Mathematics_and_Statistics/**");
for Main use ("build_mpd_file",
"fractal_landscape",
"outline_boundaries",
"pgm_to_ldraw",
"split_ldraw_file");
package Builder renames Ada_2012.Builder;
package Compiler renames Ada_2012.Compiler;
for Object_Dir use "obj/";
for Exec_Dir use "bin/";
end LEGO_Tools;
在我看来,您程序中的某些东西很可能打破了GNAT的机制,以打印出您通常会收到的消息,以免出现未经手的例外。
这是在ada.exceptions.last_chance_handler中完成的(在GCC 4.8.1中,以及我在GNAT GPL 2013中所说的),在file a-elchha.adb中。在封闭的东西后,通过stderr完成印刷。您可能会尝试用一些可以为您提供更多调查的机会替换标准的最后机会处理程序。
另外,您可以使用调试器吗?我相信您可以告诉GDB catch exception unhandled
,这应该有帮助。
如果要在运行时替换文件,请将替换替换为源代码,然后使用-a
标志告诉gnatmake
将其重新编译和任何因源。
您正在使用任务的机会
通常,由于异常而终止的任务将默默地执行此操作(通常,当其他例外处理程序中的其他例外处理程序以帮助您查看此任务时,您通常需要任务的顶部)。
有与获取backtrace信息有关的开关。从文档中:
-e 在目标支持时,将反射次数存储在异常情况下。另请参阅包装GNAT.TRACEBACK和GNAT.TRACEBACK.Symbolic有关更多信息。请注意,在X86端口上,您不得使用-Fomit-Fomit-Frame-Pointer GCC选项。
我发现必须。