2015-08-24 45 views
1

我'嘗試與AdaCores GPS(蚋編程工作室)編譯它後運行我的應用程序。GNAT Ada的運行時異常=消息EXCEPTION_STACK_OVERFLOW

我得到的運行時錯誤

Exception name: STORAGE_ERROR 
Message: EXCEPTION_STACK_OVERFLOW 

我得到儘管設置在活頁夾選項使用

-d65535(任務堆棧大小)的堆棧大小和 -D65535這些運行時錯誤(二次堆棧大小) (我也嘗試65535k以及655米)。

應用程序與對象Aonix公司Ada編譯編譯時,它運行良好。在編譯器Aonix公司我設置 - 堆棧大小65535, - 二次堆棧大小65535 - 和任務堆棧大小46345.

我的主要目的是向端口施加到GNAT Ada編譯。

我注意到-d設置任務堆棧大小和-D次要堆棧大小,但我看不到的地方設置主棧的大小,和我假定這是與應用程序的問題,但請大家指正如果我在錯誤的方向看。

任何指針將不勝感激理解。

Bearslumber

+0

嘗試在調試器下運行它? –

+0

exe文件大小差別很大嗎?編譯器是否使用不同的優化級別? – NWS

+0

嗨,NWS。我正在編譯沒有優化。我找到了特定的鏈接器設置來設置主棧。它是-Xlinker --stack = 0X <堆的大小> – bearslumber

回答

1

如果問題確實是主要任務,解決方法是將主程序移動到一個輔助任務的機構。

+2

這是如果不能調整主程序的堆棧尺寸的有用workround;您使用_can_方面'Storage_Size'或等效編譯指示([ARM J.15.4](http://www.ada-auth.org/standards/12rm/html/RM-在源改變單個任務的堆棧尺寸在那裏J-15-4.html))。 –

1

首先,編譯調試(-g)(可能有其他相關選項;發佈錯誤信息是找到它們的最快方法;-),並且應該獲得更多信息:引發異常的源代碼行和文件。或者您可以通過addr2line分析堆棧跟蹤。

這將有助於瞭解爲什麼它是養......

  • 你在棧上分配數百MB?我逃離了過去大約200MB ...
  • 是對RTS的容器類或部分之一內的加薪呢?
  • 是消息實際上誤導和new()堆分配失敗?除堆棧以外的其他內容可能會引起Storage_Error,並且我不清楚默認處理程序如何或是否區分原因...

如果沒有更多信息,我們無法繼續深入此路徑:將其編輯到問題,我會再看看。

設置環境任務的堆棧大小不是直接可能的範圍內 Gnat。它是gcc與OS交互的一部分,並且應該使用系統的ulimit設置生成可執行文件(在Linux上;其他操作系統可能會有所不同)...

不幸的是,在gcc/gnat 4.5時間範圍內,被忽略了,儘管這可能已經得到糾正,我還沒有重新討論過這個問題。

我看到亞歷克斯的答案貼在其他地方作爲一種可行的workround如果調試跟蹤和ulimit設置不提供答案,或者您需要按的,而不是花時間調試上。爲了保持代碼庫清潔,我會建議一個包裝器,簡單地創建必要的任務並調用當前的主要過程。對於Aonix,你不需要在構建中包含包裝文件。

+0

感謝布賴恩,亞歷克斯西蒙和NWS。 – bearslumber

+0

嗨,夥計們。感謝您的指點。首先,我會嘗試改變堆棧大小並檢查exe是否相應變化。我目前正在編譯沒有優化。下一步,當我看到不同大小的exe時,我將在調試模式下運行它。我已經有了一個堆棧轉儲,但它所在的地方似乎沒有意義。我保持線程發佈。 – bearslumber

+0

嗨,大家回來。我設法找到正確的鏈接器開關來設置主棧的大小。這些開關被傳遞到鏈接器(GnatLink),並且-Xlinker --stack = 0X <堆的大小>。這幫助我使用正確的堆棧進行構建,並能夠遍歷程序,但是在調用win32操作期間,我得到了分頁錯誤。我一直與Aonix港口連接,難怪我得到了錯誤。然後我確保我與GNAT端口相連,但同時我也升級了,現在我無法讓鏈接器工作。 GPRBuild只報告鏈接器未啓動。衛生署! – bearslumber