前回何とかAdvancedWorldWarを許容範囲で動かすことができるようになったが、しばらく動かしていると死ぬ問題が発生した。
カーネルログを見るとOOM-killerで殺されているように見える。
ps をwhileで回しながら動かしてみると、画面が切り替わるたびにメモリが増えていき減ることがない模様。そして限界を超えると殺される。
メモリリークの可能性がある。が、どうやって調べるか。
valgrindは動かなかった。ld.soにデバッグ情報がないため。イメージ丸ごとビルドはできそうだが、現状途中で止まる。
あとはmallocをフックするやつを作るか、探してくるか。それで調べたところによるとglibc mallocはいけてないらしい。もしかしたらjemallocを使えば解決するのかも。
うーん。めんどくさい。
jemallocクロスコンパイル
また何度かこけるかと思ったが、驚くほどすんなりとクロスコンパイルできた。
https://github.com/jemalloc/jemalloc/tree/master
からとってくる。
yabasanshiroのビルドのログから、 ツールチェーンの場所が分かるので、パスを通し
./configure --host=aarch64-rocknix-linux-gnueabi
make
で完了。libにできたライブラリをコピーする。
RG353PS上で
LD_PRELOAD=/tmp/libjemalloc.so.2 ldd /tmp/yabasanshiro
で見ると、jemallocが使われそうな感じに見える。
とりあえずこれで実行してみたが、メモリリークっぽい現象は変わらなかった。残念。
起動してタイトル画面あたり。メモリ300MB?(メモリ使用率30%くらい)
root 3363 201 29.9 625348 299948 pts/0 Rl+ 00:52 1:07
root 3363 202 30.0 629148 300548 pts/0 Rl+ 00:52 1:10
root 3363 202 29.9 629148 300280 pts/0 Rl+ 00:52 1:12
root 3363 203 29.9 629180 300376 pts/0 Rl+ 00:52 1:14
root 3363 204 29.9 629180 300416 pts/0 Rl+ 00:52 1:17
戦闘を何回か行ったとき。メモリ700MB?(メモリ使用率70%くらい)戦闘するごとに20Mくらい増えてそう。800MB超えるといつ殺されてもおかしくない感じになる。
OpenGLの何かを作りっぱなしなのではと思ったが、一応フリーはされてそう。
root 3363 222 66.0 1080976 662092 pts/0 Rl+ 00:52 7:15
root 3363 222 66.1 1081588 662728 pts/0 Rl+ 00:52 7:17
root 3363 222 67.7 1098036 678596 pts/0 Rl+ 00:52 7:20
root 3363 222 68.4 1114484 685876 pts/0 Rl+ 00:52 7:22
root 3363 222 69.3 1114612 694828 pts/0 Rl+ 00:52 7:24
root 3363 222 69.3 1114996 694768 pts/0 Rl+ 00:52 7:27
root 3363 222 69.3 1114996 694856 pts/0 Rl+ 00:52 7:29
root 3363 222 69.3 1114996 694920 pts/0 Rl+ 00:52 7:31
root 3363 222 69.3 1114996 695044 pts/0 Rl+ 00:52 7:34
root 3363 222 69.3 1114996 694704 pts/0 Sl+ 00:52 7:36
root 3363 222 69.3 1114996 694776 pts/0 Rl+ 00:52 7:39
root 3363 222 69.6 1115252 697852 pts/0 Sl+ 00:52 7:41
さて、どうするか。。。 →次回
0 件のコメント:
コメントを投稿