LoginSignup
1
0

More than 1 year has passed since last update.

WSL上でヒープ領域と格闘していた話

Posted at

環境

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
こっちはオプションへのリンク

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0