9

主に再利用性を高めるために、コードをより多くの Go パッケージに分割することで、コードの春の大掃除を行いました (それぞれの「ビルディング ブロック」が独自のパッケージに含まれています)。

インポート エラーを修正した後、プログラムが突然ビルドされないことに気付きました。「go build」を実行すると、nosplit スタック オーバーフローエラーが返されます。

ロボット main.init: nosplit スタック オーバーフロー

    120     guaranteed after split check in main.init
    112     on entry to robot/web.init
    104     on entry to robot/controller.init
    96      on entry to robot/slam.init
    88      on entry to robot/slam/hector.init
    80      on entry to hectormapping/map/mapimages.init
    72      on entry to hectormapping/map/maprep.init
    64      on entry to hectormapping/map/mapproccontainer.init
    56      on entry to hectormapping/scanmatcher.init
    48      on entry to hectormapping/map/gridmap/occbase.init
    40      on entry to hectormapping/map/gridmap/base.init
    32      on entry to hectormapping/map/gridmap.init
    24      on entry to github.com/skelterjohn/go%2ematrix.init
    16      on entry to math.init
    8       on entry to math.init┬À1
    0       on entry to runtime.panicindex
    -8      on entry to runtime.morestack00

runtime.main: nosplit スタック オーバーフロー

    120     guaranteed after split check in runtime.main
    128     after runtime.main uses -8
    120     on entry to main.init
    112     on entry to robot/web.init
    104     on entry to robot/controller.init
    96      on entry to robot/slam.init
    88      on entry to robot/slam/hector.init
    80      on entry to hectormapping/map/mapimages.init
    72      on entry to hectormapping/map/maprep.init
    64      on entry to hectormapping/map/mapproccontainer.init
    56      on entry to hectormapping/scanmatcher.init
    48      on entry to hectormapping/map/gridmap/occbase.init
    40      on entry to hectormapping/map/gridmap/base.init
    32      on entry to hectormapping/map/gridmap.init
    24      on entry to github.com/skelterjohn/go%2ematrix.init
    16      on entry to math.init
    8       on entry to math.init┬À1
    0       on entry to runtime.panicindex
    -8      on entry to runtime.morestack00

これが何であるか知っている人はいますか?場合によっては、これは修正されたと思われるバグであることを除いて、何が原因であるかに関する多くのドキュメントを見つけることができません。

一部のコードは「src」フォルダー内の新しいフォルダーに分割されたため、ファイル構造は次のようになりました。

src/robot/main.go (main() lives here)
src/robot/(...) (application-specific packages)
src/hectormapping/(...) (stand-alone package used in "robot")

Windows 7 (x64) で Go 1.0.3 を使用しています。

4

1 に答える 1

6

これは、先端固定と言われていたこちらと同じようです。対応する修正は、こちらで確認できます。

私が見ている問題を要約すると、 分割スタッキングは、従来の固定メモリ領域の代わりに、スタックの成長に使用されます。これには、必要なスタック メモリのみが実際に予約されるため、より多くのスレッドを生成できるという利点があります。ここでの問題は、分割スタックのプロローグが見つからないため、リンカーが分割スタックでメモリを使用しない関数を誤って「nosplit」としてマークすることです。これにより、リンカは間違ったスタック制限を計算し、リンカはスペースがないと考えて、エラー メッセージをスローします。

残念ながら、tip バージョンを入手する唯一の方法は、自分でコンパイルすることです。Nick Craig-Wood が既に述べたように、ここで手順を見つけることができます。本当にアップグレードできない場合は、init関数に任意のローカル変数を割り当てることで、これを回避することができます。しかし、これはもちろん非常に面倒です。

于 2013-03-22T01:11:35.570 に答える