我是一名实习生,负责将测试应用程序从Solaris移植到Red Hat。该应用程序是用Ada编写的。它在Unix方面运行得很好。我在linux端编译它,但现在它给了我一个seg错误。我运行调试器来查看故障的位置并得到了这个:
Warning: In non-Ada task, selecting an Ada task.
=> runtime tasking structures have not yet been initialized.
<non-Ada task> with thread id 0b7fe46c0
process received signal "Segmentation fault" [11]
task #1 stopped in _dl_allocate_tls
at 0870b71b: mov edx, [edi] ;edx := [edi]
此seg故障发生在任何调用或任何初始化之前。我被告知ada中的“任务”在程序的其余部分之前开始,问题可能在于正在运行的任务。
但这是踢球者。该程序只生成一些代码供另一个程序使用。在linux下编译时,OTHER程序给出了同样类型的seg错误,同样的错误信息。这让我相信可能会有一些小调整我可以用来解决所有这些问题,但我对Unix,Linux和Ada没有足够的知识来自己解决这个问题。
答案 0 :(得分:1)
这是一个黑暗的总镜头,但如果他们试图在堆栈上分配太多的本地内存,你可以在启动时让这些任务爆炸。您的主程序可以安全地使用系统堆栈,但任务必须在启动时从动态内存中分配堆栈,因此通常您的运行时具有任务的默认堆栈大小。如果您的任务试图分配一个大型数组,它很容易超过该限制。我以前碰巧遇到过它。
有多种方法可以解决这个问题。一种方法是将所有任务本地数据移动到包全局区域。另一种是动态分配它。
如果你能算出 足够多的内存,你还有更多的选择。您可以将任务设置为任务类型,然后使用
for My_Task_Type_Name'Storage_Size use Some_Huge_Number;
语句。您也可以使用“pragma Storage_Size(My_Task_Type_Name)”,但我认为“for”语句是首选。
最后,使用Gnat,您还可以使用 -d 标志将默认任务堆栈大小更改为gnatbind。
答案 1 :(得分:0)
如果代码在Sparc机器上使用,而你现在在x86机器上运行,那么你可能会遇到端点问题。
它并没有多大帮助,但是当进行多平台时这是一个常见的问题。
答案 2 :(得分:0)
预感:链接步骤不正确。或许错误的运行时启动库被链接在一起?
(问题被问到几个月之后,有多大可能找出真正的麻烦?)