【问题标题】:Porting Unix ada app to Linux: Seg fault before program begins将 Unix ada 应用程序移植到 Linux:程序开始前的 Seg 错误
【发布时间】:2009-06-29 17:23:20
【问题描述】:

我是一名实习生,负责将测试应用程序从 Solaris 移植到 Red Hat。该应用程序是用 Ada 编写的。它在 Unix 端工作得很好。我在 linux 端编译它,但现在它给了我一个段错误。我运行调试器来查看故障所在并得到了这个:

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]

此段错误发生在进行任何调用或初始化任何内容之前。有人告诉我,ada 中的“任务”在程序的其余部分之前启动,问题可能出在正在运行的任务上。

但这是最重要的。这个程序只是生成一些代码供另一个程序使用。 OTHER 程序在 linux 下编译时给了我同样类型的 seg 错误和同样类型的错误消息。这让我相信可能有一些小的调整可以用来解决所有这些问题,但我只是没有足够的关于 Unix、Linux 和 Ada 的知识来自己解决这个问题。

【问题讨论】:

  • Solaris 和 Linux 机器上的 Ada 版本是什么?
  • 你也可以在groups.google.com/group/comp.lang.ada问这个问题
  • 当在主程序的第一行之前出现问题时,您通常可以通过(假设您使用 GNAT)在调试器中启动应用程序,立即设置断点来定位问题区域在函数 adainit (b adainit) 上,然后 (r) 运行它。 “adainit”是编译器生成的应用程序初始化函数——它只是调用了许多其他函数——所以你可以通过它来确定究竟是什么初始化实体触发了问题。 (当然要确保您的源代码是使用调试选项编译的:-g)

标签: linux unix ada


【解决方案1】:

这完全是在黑暗中拍摄,但如果任务试图在堆栈上分配过多的本地内存,您可能会在启动时像这样炸毁任务。您的主程序可以安全地使用系统堆栈,但任务必须在启动时从动态内存中分配其堆栈,因此通常您的运行时具有任务的默认堆栈大小。如果你的任务试图分配一个大数组,它很容易超过这个限制。我以前也遇到过。

有多种方法可以解决此问题。一种方法是将所有任务本地数据移动到包全局区域中。另一种是动态分配它。

如果您能计算出多少内存就足够了,那么您还有更多选择。您可以将任务设为任务类型,然后使用

for My_Task_Type_Name'Storage_Size use Some_Huge_Number;

声明。您也可以使用“pragma Storage_Size(My_Task_Type_Name)”,但我认为“for”语句是首选。

最后,使用 Gnat,您还可以使用 -d 标志将默认任务堆栈大小更改为 gnatbind。

【讨论】:

    【解决方案2】:

    没想到,如果代码在 Sparc 机器上使用,而您现在在 x86 机器上运行,您可能会遇到字节序问题。

    这没有多大帮助,但这是多平台时的常见问题。

    【讨论】:

    • 我实际上只是在处理 Linux 上的 Ada 应用程序的段错误,该段错误是由任务堆栈溢出引起的。在早期的测试中,只有几个 K 进入堆栈(来自数组切片)并且一切都很好,在后来的测试中,有几个 Meg 进入了来自数组的堆栈。简短的解决方法是增加任务大小,稍后的解决方法是不将数据放在堆栈上:-)
    【解决方案3】:

    预感:链接步骤不正确。也许链接了错误的运行时启动库?

    (在提出问题几个月后找出真正的问题的可能性有多大?)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-22
      • 2010-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-25
      • 2011-04-03
      • 1970-01-01
      相关资源
      最近更新 更多