2

在使用 AdaCores GPS (Gnat Programming Studio) 编译后,我正在尝试运行我的应用程序。

我收到运行时错误

Exception name: STORAGE_ERROR
Message: EXCEPTION_STACK_OVERFLOW

尽管使用在活页夹选项中设置了堆栈大小,但我得到了这些运行时错误

-d65535(任务堆栈大小)和 -D65535(辅助堆栈大小)(我也尝试过 65535k 和 655m)。

该应用程序在使用 Aonix Object Ada 编译器编译时运行良好。在 Aonix 编译器中,我将 - 堆栈大小设置为 65535, - 辅助堆栈大小设置为 65535 - 并将任务堆栈大小设置为 46345。

我的主要目标是将应用程序移植到 GNAT Ada 编译器。

我注意到 -d 设置任务堆栈大小和 -D 辅助堆栈大小,但我看不到在哪里设置主堆栈大小,我假设这是应用程序的问题,但如果我是,请纠正我看错了方向。

任何指针将不胜感激。

熊睡

4

2 回答 2

1

首先,为调试而编译(-g)(可能还有其他相关选项;发布错误信息是找到它们的最快方法;-)您应该获得更多信息:引发异常的源代码行和文件。或者您可以通过 addr2line 分析的堆栈跟踪。

这应该有助于理解为什么它会提高......

  • 您是否在堆栈上分配了数百 MB?我过去用了大约 200MB...
  • 加薪是在容器类之一还是 RTS 的一部分?
  • 该消息是否实际上具有误导性并且new()堆分配失败?堆栈以外的其他事情可能会引发 Storage_Error,我不清楚默认处理程序如何或是否区分原因......

如果没有更多信息,我们无法继续沿着这条道路前进:将其编辑到问题中,我会再看一下。

Gnat中无法直接为环境任务设置堆栈大小。它是 gcc 与操作系统交互的一部分,并且应该将系统ulimit设置用于生成的可执行文件(在 Linux 上;其他操作系统可能会有所不同)......

不幸的是,在 gcc/gnat 4.5 的时间范围内,我发现了这些被忽略的证据,尽管这可能已经得到纠正,而且我没有重新审视这个问题。

如果调试跟踪和 ulimit 设置没有提供答案,或者如果您需要按下而不是花时间调试,我已经看到 Alex 的答案发布在其他地方作为可行的解决方法。为了保持代码库干净,我建议使用包装器,只需创建必要的任务并调用您当前的主过程。对于 Aonix,您根本不需要在构建中包含包装文件。

于 2015-08-25T10:08:55.523 回答
1

如果问题确实是主要任务,解决方法是将主要过程移动到辅助任务的主体。

于 2015-08-24T17:13:59.850 回答