致命的 #694
完了長時間起動していると終了する場合がある
0%
説明
長時間起動しているといつの間にかウインドウが表示されなくなり終了していることがある。
ファイル
toshi_a 初音 さんが10年以上前に更新
- ステータス を 新規 から 却下 に変更
これは、ログの4行目にもあるとおり、Segmentation faultが原因です。結論から言うと、mikutterではこの問題に直接手を下すつもりはありません。
/opt/mikutter/vendor/typed-array/functions.rb:107: [BUG] Segmentation fault
Segmentation faultは通常のRubyの操作では発生しないもので、以下の原因が考えられます。
- Rubyのバグ。そのバージョンや特定のOSでのRuby自体の実装に問題がある
- Rubyエクステンションのバグ。C言語で書かれたRubyの拡張機能(RubyGTK2)にヌルポインタ参照等のバグがある
とくに今回のような場合原因の一つとして有力なのは、容量オーバーなど何らかの原因でメモリを確保できない時に、malloc(またはメモリ確保用の関数)がNULLを返す可能性があるが、そのチェックをしていない箇所があるということです。NULLが返ってきたかどうかのチェックを怠っており、RubyオブジェクトにNULLポインタを格納してしまい、あとでその値を参照しようとした時にSegmentation faultが引き起こされるのです。今回クラッシュしたtyped-arrayですが、これはRubyで実装されたサードパーティのライブラリで、一見Segmentation faultとは関係がありません。恐らく、NULLポインタを含んだオブジェクトがどこかで作られ、ここで初めて参照してしまったのでしょう。
そういったオブジェクトが何故生成されたのかは先ほど申し上げたとおり、RubyGTK2やRuby自体のソースから不具合箇所を突き止め、各プロジェクトにフィードバックを送る必要があります。しかしそれは
- mikutterとしてどうすることもできない。問題を抱えているプロジェクトで問題について議論すべきであり、ここは相応しくない。
- その問題の発生箇所を特定する能力が私にはない。
といったことから、ここではこれ以上この話について議論することは残念ながらできません。
もしあなたがこの問題を解決して、あるプロジェクトで修正が取り込まれたバージョンがリリースされたなら、そのバージョンに上げるべきであるというチケットを再びここに報告していただくことは歓迎します。mikutterとしては、要求バージョンを上げるという対策の打ちようがあるからです。
よって、このチケットに関しては一度却下とさせていただきます。私も注意して見ておきますが、mikutterとして何か対策ができそうなことがあれば、提案してください。
--
蛇足ですが、mikutterとしては常にメモリを節約する方向にいろいろな最適化をしています。多くはチケットにはしていませんが、 #198 , #564 などはその取り組みの一環です。ただこれはCエクステンションの不具合によるメモリリークもあるので、そのあたりはどうしようもないと割り切りながら、mikutterがやらかしている部分は修正していこうという取り組みです。
また私個人としては、Arch Linuxで動かしているときはSegmentation faultは週に1度も見ませんが、Mac OSXで動かそうとすると起動後数秒でSegmentation faultで必ず終了します。ソフトウェアのバージョンや、場合によっては環境を変えることで状況が変わるかもしれません。