2

pyglet 1.1.4 でゲーム コードを実行していますが、メモリ リークのように見えます。つまり、コードが実行されている間、RSS は継続的に増加し、最終的にラップトップがスワップを開始し、最終的にコードがバス エラーで終了します。

グッピーで調査しました:起動時にヒープダンプを1回行い、メモリ不足とスワップのヒットによる最初のスローダウンの後に1回、これが検出されたらpygletを終了し、最後のヒープダンプを1回行いました。コードがギガバイトのメモリを使用していることを htop が示しているにもかかわらず、3 つのダンプすべてがほぼ同じヒープ サイズ (約 18 MB) を示していることに気付きました。

私が読んだことによると、これらのヒープ ダンプは Python のメモリ使用量のみを示しています。つまり、メモリの残りの部分は C コードによって占有されているということです。私の理解が正しければ、これは pyglet が生成している ctypes でのメモリ リークを示しているようです。基礎となるコードについての私の理解は曖昧ですので、私が使用している可能性のある誤った用語や、私の理解/説明におけるその他のエラーを自由に修正してください.

バス エラーが発生したときの Apple クラッシュ レポートは次のとおりです: https://gist.github.com/1612500

メモリの問題を含むコードは次のとおりです: https://github.com/greenmoss/NotOrion/tarball/bus_error

条件を自動的にトリガーするユーティリティを作成しました。実行するには、上記の tarball をダウンロード/展開し、cd で「demo」ディレクトリに移動してから、「./label_move.py」を実行します。このユーティリティを継続的に実行できるようにすると、上記の動作が再現されます。空きメモリがたくさんある場合は、スワップにヒットする前にすべてを使用するのに時間がかかる場合があります。

したがって、これをデバッグ/修正するには、基礎となる pyglet (または C) コードを掘り下げる必要があるようです。別のゲーム開発者の質問で、gdb を使用する必要があると指摘されました。私は C や gdb をよく知りません。python + pyglet の複雑さを加えると圧倒されます。

では、上記のコードを使用した gdb デバッグ セッションの例を誰か教えてもらえますか?

4

0 に答える 0