週に一回は書きますよ 月に4つ記事を書けばノルマは満たされます。
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Monadiusがメモリリークしていると聞いたので調べてみました。

  • 音が出ない版をダウンロード
  • 展開
  • .hsが全て小文字で始まっているので、それを大文字にリネーム
  • Main.hsのcreateWindowの前の行にgetArgsAndInitializeを足す。
    • glutを初期化してなかった!
  • $ ghc --make -O -prof -auto-all Main.hs
    • 次のエラーが出た場合、libghc6-glut-profパッケージ等プロファイラ用のパッケージを導入する。
Game.hs:5:7:
    Could not find module `Graphics.UI.GLUT.Callbacks.Window':
      Perhaps you haven't installed the profiling libraries for package GLUT-2.1.1.1? 
      Use -v to see a list of the files searched for.

多分データ型がlazyで、それが評価されるまで前のフレームのデータがずっと保持されているのではないかと当て推量しています。どうももっと重篤なバグで不要なオブジェクトが出来ている気もしますが。

プロファイリングオプションの説明が全く理解できなかったので、全部試してみました。画像が多いので全て続きに収容。

  • -hc Breaks down the graph by the cost-centre stack which produced the data.

Monadius profiling with -hm

「この関数名を省略したのは誰だ!」

.hpファイルでも関数名は省略されていました。最悪SCCコメントを付ければ読めるはずです。計測の最後の小さい山はコンティニューしたあとのゲームです。一度ゲームオーバーになって再スタートするとメモリが解放される模様です。

  • -hm Break down the live heap by the module containing the code which produced the data.

Monadius profile with -hm

モジュール別表示。Monadius.hsの粒度が荒くて役に立ちません。

  • -hd Breaks down the graph by closure description.For actual data, the description is just the constructor name, for other closures it is a compiler-generated string identifying the closure.

Monadius profile with -hd

複素数やリストを中心にまんべんなく増えています。これでは絞りにくい。

  • -hy Breaks down the graph by type.For closures which have function type or unknown/polymorphic type, the string will represent an approximation to the actual type.

Monadius profile with -hy

これはちょっと表示が違います。-hdとどう違うのかよくわかりませんが。GameObjectが増えるのは怪しいです。ゲーム中に高々二つしか生成されないはずです。

このプロファイルは一周してゲームオーバーになり、スタッフロールを見たあとデモを再生したものです。デモだとメモリは解放されないようです。

  • -hr Break down the graph by retainer set. Retainer profiling is described in more detail below (Section 5.4.2, “Retainer Profiling”).

Monadius profile with -hr

実行してすぐにエラーが出ました。

Main: internal error: Invalid object in isRetainer(): 60
    (GHC version 6.8.2 for x86_64_unknown_linux)
    Please report this as a GHC bug:  http://www.haskell.org/ghc/reportabug
zsh: abort      ./Main +RTS -hr

6.8.2でもレポートしないといけないのでしょうか。グラフはよく分かりません。

  • -hb Break down the graph by biography. Biographical profiling is described in more detail below (Section 5.4.3, “Biographical Profiling”).

Monadius profile with -hb

DRAGは最後に使われてから消えるまでの間のオブジェクト。VOIDはそもそも使われていないオブジェクト。VOIDが多いのは明らかにおかしいです。

他にもオプションは組み合わせられるようです。ちょっと面倒。

スポンサーサイト
コメント
この記事へのコメント
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
http://gusmachine.blog49.fc2.com/tb.php/454-ffe09561
この記事にトラックバックする(FC2ブログユーザー)
この記事へのトラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。