環境
Ubuntu 20.04 LTS (Focal Fossa) on WSL
g++ (Ubuntu 9.3.0-10ubuntu2) 9.3.0
前書き
ふと思い立ってWSL上でプログラムを久々に書き出したが、 Segmentation fault (core dumped)
原因は実行コードに対してヒープ領域が足りていないからだと思われる。
実際はもっとしょうもないところでミスをしているのだが、後学と自戒のために残しておく。
調査開始 ulimits編
プログラムのスタックサイズを変更する
すぐにヒットしたのはこちらのサイト
しかしWSL上ではulimitの挙動が違う
$ ulimit -s
> 8192
試しに8192より大きなサイズを指定してみると
-bash: ulimit: stack size: cannot modify limit: Invalid argument
失敗。
ulimitsの数値はログイン時に決まっているらしく、設定ファイルは /etc/security/limits.conf
設定方法も当該ファイルに書かれているのでそのように記述して再起動するも失敗。
あれこれ調べた結果これでうまくいきました、最後尾参照
https://github.com/microsoft/WSL/issues/633
どうやら、WSL上ではulimitsがうまく動作しない(?)ようで、issueがこのほかにも挙がっていました
WSL2 の Ubuntu18 で ulimit open file を変更したい
これでstack sizeは変更され、問題ないかなといったところで Segmentation fault (core dumped)
調査開始 WSL編
詰まったので原点回帰、セグフォは本当にメモリの問題なのか?
コアダンプを確認しようとするも、出ない。
https://github.com/microsoft/WSL/issues/1262
WSL上ではコアダンプが出ないらしい。しかしスレッド末尾の会話を見る限り、WSL2上では動いていそう。
ん?
wsl --list --verbose
NAME STATE VERSION
* Ubuntu Stopped 1
はい。
https://www.kagoya.jp/howto/it-glossary/develop/wsl2_linux/
WSL2を入れるにあたって参考にしたサイト。ここで手順をミスって、Storeのバージョン付きのWSLのインストールに失敗してしまい、バージョンなしのUbuntuを選んだのが問題だったようだ。
一回すべてを消して再度手順をやり直して成功。
Ubuntu-22.04 Running 2
ulimit -s も問題なく行え、問題のプログラムも走った。
結論
環境のセットアップはちゃんとやりましょうね、という当たり前の話に落ち着いた。
余談
gccの-Wlオプションとは何ぞや?と思い調べたやつ
リンカ用オプションというところまではすぐ出てくるが、じゃあそのオプションはどこから確認できるんだ?
What is the OPTION in the GCC's option "-Wl,OPTION"?
という記事をStackOverFlowで見つけたのでペタリ
http://sourceware.org/binutils/docs-2.16/ld/Options.html#:~:text=of%20the%20linker%5D-,%2D%2Dstack%20reserve,-%2D%2Dstack%20reserve%2C
こっちはオプションへのリンク