2009-03-19 4 views
1

私は約2 MiBのかなり重いスタック割り当てを行ったCプログラムを書いた。私が貧しい人のIDEを使用しているので*私はコンパイルするたびに、テストするためにmakeを使ってプログラムを自動的に実行していました。makeが起動したときにプログラムが実行されますが、シェルのクレイジーナンセンスでは実行されません!

私はほとんどすべてをラップしましたが、何らかの理由で最終的な最適化中にシェルから直接実行しました。インスタントセグメンテーション!それをmakeで動かしても、まだ手作業で実行すると、常に同じsegfaultが生成されます。

私は最終的に私が256 KiBに行っていたスタック割り当ての量を減らし、問題を解決しました。私の合理的なことは、makeはおそらくプロセスを実行していたため、スタックスペースを増やすことができた奇妙なパラメータを継承していたということです。

今はすべて問題ありませんが、自分の理論をテストする方法はありません。誰でも確認したり拒否したり、何らかのテスト方法を提案できますか?あなたがulimit(1)と最大スタックサイズを設定してみてください、それが動作するかどうかを確認することができます

* zshの、vimの、GCC、GDB、およびいくつかのナッツのmakefile

答えて

5

# Limit stack to 1024 KiB 
ulimit -s 1024; ./myprogram 
# Now no limit 
ulimit -s unlimited; ./myprogram 
+0

うん、それでした!それは 'ulimit -s unlimited'の後にシェルから直接働きました。 男は、成熟したmakeプログラムのためのちょっと深刻なバグのようです。 (私はgmake 3.81を使っています) –

+0

makeのバグだとは思えません。makeの外でしか失敗しなかったからです。makeはおそらくhighに設定していました。無制限)の価値があり、これはそのサブプロセスによって継承されました。 @ pax、 – paxdiablo

+0

が合意した。しかし、子プロセスが継承する環境を変更することはまだバグです。人々はいつも 'テストをする'のようなことを行い、何かに影響を与えないようにしているということを期待しています。 –

0

詳しい情報は診断するのに必要とされていますこの。つまり、あなたが使っていたmakefileとシェルスクリプトを見るのはいいでしょう。

1

個人的には、私の最初のステップは、segfaultがどこで発生したのかを、gdbまたはprintfなどのデバッグで特定することです。 (これはmallocからの戻り値を常にチェックするため、segfaultsの可能なソースを削減します;-) 1つは、問題の正確な情報源を見つけることで、スタック割り当てに関するあなたの理論を裏付ける証拠を得ることができます。また、segfaultingではなく、有益なエラーメッセージでプログラムを正常に終了できるように、エラーチェックコードを挿入することもできます。