私は約2 MiBのかなり重いスタック割り当てを行ったCプログラムを書いた。私が貧しい人のIDEを使用しているので*私はコンパイルするたびに、テストするためにmakeを使ってプログラムを自動的に実行していました。makeが起動したときにプログラムが実行されますが、シェルのクレイジーナンセンスでは実行されません!
私はほとんどすべてをラップしましたが、何らかの理由で最終的な最適化中にシェルから直接実行しました。インスタントセグメンテーション!それをmakeで動かしても、まだ手作業で実行すると、常に同じsegfaultが生成されます。
私は最終的に私が256 KiBに行っていたスタック割り当ての量を減らし、問題を解決しました。私の合理的なことは、makeはおそらくプロセスを実行していたため、スタックスペースを増やすことができた奇妙なパラメータを継承していたということです。
今はすべて問題ありませんが、自分の理論をテストする方法はありません。誰でも確認したり拒否したり、何らかのテスト方法を提案できますか?あなたがulimit(1)と最大スタックサイズを設定してみてください、それが動作するかどうかを確認することができます
* zshの、vimの、GCC、GDB、およびいくつかのナッツのmakefile
うん、それでした!それは 'ulimit -s unlimited'の後にシェルから直接働きました。 男は、成熟したmakeプログラムのためのちょっと深刻なバグのようです。 (私はgmake 3.81を使っています) –
makeのバグだとは思えません。makeの外でしか失敗しなかったからです。makeはおそらくhighに設定していました。無制限)の価値があり、これはそのサブプロセスによって継承されました。 @ pax、 – paxdiablo
が合意した。しかし、子プロセスが継承する環境を変更することはまだバグです。人々はいつも 'テストをする'のようなことを行い、何かに影響を与えないようにしているということを期待しています。 –