我的程序在软件包详细部分中遇到了seg-faurot。我在体内块中声明了一堆变量。它们都是带有QLOCK,第一个ID号,最后一个ID号和数据数组的记录。所有不同类型的类型,因为每个记录的数据和ID范围都略有不同。
类型都在同一软件包规格(smo_types(中定义,但其中只有一个会导致SEG故障。
ada捕获了此segfault并引起了存储错误,因此输出看起来像
凸起的存储_error:s-intman.adb:136显式加薪
我试图通过放置Elaborate_all(smo_types(;
来强制阐述顺序在运行时仍有SEG故障。
当我评论该声明和该单个变量的任何用途时,它可以正常工作。
begin -- Package Body
EX1_Access := EX_PKG.Object_Access(Read_Only => False);
EX2_Access := EX_PKG.Object_Access(Read_Only => False);
EX3_Access := EX_PKG.Object_Access(Read_Only => False);
IPC_API.Qlock.Init(Lock => EX1_Access.QLock, Name => "EX1_Access.QLock");
IPC_API.Qlock.Init(Lock => EX2_Access.QLock, Name => "EX2_Access.QLock");
IPC_API.Qlock.Init(Lock => EX3_Access.QLock, Name => "EX3_Access.QLock");
declare
EX1 : constant SMO_Types.EX1_Type
:= (QLock => EX1_Access.QLock,
First => ACT.EX1_ID_Type'first,
Last => ACT.EX1_ID_Type'last,
Data => (others => (EX_File => EX_API_Types.NOT_DEFINED)));
--The following EX2_Type causes the elaboration issue, if I comment this
--declaration/init and it's use the code works.
--If I make a random variable of EX2_Type without making it a constant
--and initializing it there is still a seg fault. Therefor it seems
--likely that the issue lies with the EX2_Type.
EX2 : constant SMO_Types.EX2_Type
:= (QLock => EX2_Access.QLock,
First => ACT.EX2_ID_Type'first,
Last => ACT.EX2_ID_Type'last,
Data => (others => (EX_File => EX_API_Types.NOT_DEFINED)));
EX3 : constant SMO_Types.EX3_Type
:= (QLock => EX3_Access.QLock,
First => ACT.EX3_ID_Type'first,
Last => ACT.EX3_ID_Type'last,
Data => (others => (EX_File => EX_API_Types.NOT_DEFINED)));
begin
EX1_Access.all := EX1;
EX2_Access.all := EX2;
EX3_Access.all := EX3;
end Example_Package;
***编辑:这是类型(忽略Ex1 vs ex2 vs ex3的怪异顺序,这不是重新打字的错字。这是它们在旧版代码中的方式(
MAX_EX_COUNT : constant := 36367;
MAX_EX1_COUNT : constant := 18947;
MAX_EX2_COUNT : constant := 1000;
MAX_EX3_COUNT : constant := 1000;
type EX_ID_Type is range -1 .. MAX_EX_COUNT;
for EX_ID_Type'size use 4*8;
subtype EX2_ID_Type is ID_Type
range 1 .. MAX_EX2_COUNT;
subtype EX1_ID_Type is ID_Type
range EX2_ID_Type'Last+1 .. EX2_ID_Type'Last+MAX_EX1_COUNT;
subtype EX3_ID_Type is ID_Type
range EX1_ID_Type'Last+1 .. EX1_ID_Type'Last+MAX_EX3_COUNT;
type Data_Array_Type is array (EX_ID_Type range <>)
of EX_API_Types.EX_Data_Type;
type EX_Record_Type (First, Last : EX_ID_Type) is
record
Qlock : IPC_API.Qlock.Qlock_Type;
Data : Data_Array_Type(First .. Last);
end record;
subtype EX1_Type is
EX_Record_Type(First => EX1_ID_Type'first,
Last => EX1_ID_Type'last);
subtype EX2_Type is
EX_Record_Type(First => EX2_ID_Type'first,
Last => EX2_ID_Type'last);
subtype EX3_Type is
EX_Record_Type(First => EX3_ID_Type'first,
Last => EX3_ID_Type'last);
您的类型定义仍然不完整。我们只能对您的类型做出广泛的假设。
type Data_Array_Type is array (EX_ID_Type range <>)
of EX_API_Types.EX_Data_Type;
type EX_Record_Type (First, Last : EX_ID_Type) is
record
Qlock : IPC_API.Qlock.Qlock_Type;
Data : Data_Array_Type(First, Last);
end record;
subtype EX1_Type is
EX_Record_Type(First => EX1_ID_Type'first,
Last => EX1_ID_Type'last);
subtype EX2_Type is
EX_Record_Type(First => EX2_ID_Type'first,
Last => EX2_ID_Type'last);
subtype EX3_Type is
EX_Record_Type(First => EX3_ID_Type'first,
Last => EX3_ID_Type'last);
您的无约束数组类型的定义将索引声明为ex_id_type中的一个值范围。用于EX_RECORD_TYPE的判别物使用相同类型。在某个地方,您必须定义ex1_id_type,ex2_id_type和ex3_id_type。我只能假设这些是ex_id_type的子类型。
您对记录中数据字段的定义是不正确的ADA语法。必须使用范围定义无约束数组的实例。您不提供范围,只有上限和下限。适当的符号应为:
type EX_Record_Type (First, Last : EX_ID_Type) is
record
Qlock : IPC_API.Qlock.Qlock_Type;
Data : Data_Array_Type(First .. Last);
end record;
您需要查看EX2_ID_Type'First..EX2_ID_Type'Last
范围内的元素数量。根据您报告的错误消息,您的程序似乎没有足够的堆栈空间来用于此大小的数组以及堆栈上维护的所有其他数据。
正如他帖子结尾所述的@jimrogers"看来您的程序没有足够的堆栈空间"最终成为导致我解决解决方案的问题。
我的库更改正在进行并行更改,其中一个更改将脚本" Ulimit -SS 65536"重新定位为另一个脚本,而在程序运行时最终没有运行的脚本。p>由于@jimrogers,我开始对堆栈问题进行故障排除,并最终看到上述更改并将其恢复在我的沙盒中。这解决了问题。感谢所有人的帮助!
tldr问题。解决方案:添加了" Ulimit -ss 65536"(将软堆栈大小增加到64KB(以运行脚本。
首先,您创建并分配访问值,并使用未知的判别物:
EX1_Access := EX_PKG.Object_Access(Read_Only => False);
然后,您可以使用其他可能不同的判别因子创建新对象:
EX1 : constant SMO_Types.EX1_Type
:= (QLock => EX1_Access.QLock,
First => ACT.EX1_ID_Type'first,
Last => ACT.EX1_ID_Type'last,
Data => (others => (EX_File => EX_API_Types.NOT_DEFINED)));
然后,您尝试将这些新对象的内容复制到先前分配的访问值中:
EX1_Access.all := EX1;
每当判别因素不同时,这总是失败的,First
和Last
的EX1
与分配的值匹配是纯粹的运气。