プロジェクト

全般

プロフィール

バグ #1322

完了

エラーメッセージを出さず突然正常終了することがある

cob odo さんが約5年前に追加. ほぼ5年前に更新.

ステータス:
終了
優先度:
通常
担当者:
対象バージョン:
プラグイン名:
gtk
クラッシュする:
はい

説明

--debugオプションを付けていても、エラーメッセージを出さずに正常終了することがあります。

先週末のOSC開催中に会場やmastodonで少し話題になりましたが、Ruby 2.6系の仕様変更が影響しているのではないかという話でした。

チケットを立てておこうということになっていたと思いますので、立てました。

ついでに、簡単に再現する方法を見つけたので、書いておきます。これがすべてかどうかはわかりません。

この方法ではruby-2.5.3では何回やっても再現せず、ruby-2.6.1では今の所100%再現します。


再現手順

1. コンソールを開く
2. bg_system('true') を実行する。


関連するチケット

関連している バグ #1318: popup_notifyイベントの第二引数にPlugin::Twitter::Message以外のMessage Modelを渡すと通知が発生しない終了操作
関連している 提案 #1319: libnotifyプラグインの、rnotify.rbを削除する終了操作

cob odo さんが約5年前に更新

追試したところ、起動直後のしばらくは確実に再現できるものの、時間が経つと問題なくなるようでした。また、bg_systemを使わずとも、spawnだけで同じ挙動を観測できます。

以下のような簡単なrubyプログラム

while true
  puts Time.now
  spawn 'true'
  sleep 1
end

をruby-2.6.1で実行しても(当然ながら)途中で勝手に終了したりはしないので、mikutter側の何かが原因になっているとは思います。

toshi_a 初音 さんが約5年前に更新

  • ステータス分類待ち から 実装待ち に変更

確実に再現できることを確認しました。こちらの環境はRuby 2.6.1です。

toshi_a 初音 さんが約5年前に更新

  • 関連している バグ #1318: popup_notifyイベントの第二引数にPlugin::Twitter::Message以外のMessage Modelを渡すと通知が発生しない を追加

toshi_a 初音 さんが約5年前に更新

  • 担当者toshi_a 初音 にセット
  • 対象バージョン3.9 にセット
  • プラグイン名libnotify にセット

根本的な解決ではないですが、 #1318 の延長で、libnotify gemを使ってデスクトップ通知を表示すれば、クラッシュしません。効率も良くなっています。

GitHub - splattael/libnotify: Ruby bindings for libnotify using FFI.

外部コマンドを実行しなくなったため、WindowsやMacでパッチするのが若干面倒かもしれませんが、libnotifyという名前のプラグインをサードパーティプラグインとしてロードすればいいだけだし良いのかなぁという気持ちもあります。

以下に当てはまる人の意見がほしいです。

  • Linuxで、このチケットの問題が再現していた人は、このブランチを使ってどうなるか。
  • WindowsやMacで、このチケットにどのような影響があるか。

toshi_a 初音 さんが約5年前に更新

通知のほか、ブラウザでURLを開く時には外部コマンドを呼んでいるので、このときに終了することがあります。
現在のmikutterでは終了時には事前にメインウィンドウが破棄されてるはずなので、メインループを抜けてもウィンドウが残っているならもう一度メインループに復帰すれば大丈夫かも

toshi_a 初音 さんが約5年前に更新

  • ステータス実装待ち から レビュー待ち に変更
  • 担当者toshi_a 初音 から cob odo に変更
  • プラグイン名libnotify から gtk に変更
  • ブランチtopic/1322-never-ending-mainloop にセット

ブラウザを外部コマンドで開くときにも再現できたので、gtkプラグインの問題に変更しておきます。

現在のmikutterでは終了時には事前にメインウィンドウが破棄されてるはずなので、メインループを抜けてもウィンドウが残っているならもう一度メインループに復帰すれば大丈夫かも

Gtkプラグインがロードされている状態では、メインループ脱出時にウィンドウを確認し、まだ破棄されていないウィンドウがあれば警告を表示して復帰するようにしてみました。
この変更を適用して再現手順を実行すると、ログに復帰した旨が出力され、終了しません。

Gtkプラグインがあるときだけ発生する問題なので、このプラグイン内で回避するということで良いと思います。

toshi_a 初音 さんがほぼ5年前に更新

  • ステータスレビュー待ち から 終了 に変更

これ無しじゃ生きていけねぇよ(突然終了するから)

toshi_a 初音 さんがほぼ5年前に更新

  • 関連している 提案 #1319: libnotifyプラグインの、rnotify.rbを削除する を追加

他の形式にエクスポート: Atom PDF