Debian Stretch: libgs_plugin_systemd-updates.so での gnome-software のセグメント違反

Debian Stretch: libgs_plugin_systemd-updates.so での gnome-software のセグメント違反

最新のアップデートでは、gnome-software がセグメンテーション違反を起こし始めました。もちろん、私の両親はこれに気付きません。これは、セキュリティアップデートの通知が届かなくなり、PC がひどく安全でなくなることを意味します。[1] Google の最初のページには、この Debian Desktop がセキュリティアップデートの通知を配信できない理由を説明するものは何もありません (また、 はぁ)。

以下の症状は他の人にも見られましたか? 説明できますか? 永久的に修正できますか?

(根本的な原因は不明ですが、他のデスクトップと比較して Debian デスクトップのリソースが不十分です)。

sudo journalctlこれは、libgs_plugin_systemd-updates.so 内の NULL ポインタ参照であることを示しています (命令ポインタの最後の 3 桁は、いずれの場合も同じです)。

Nov 22 14:59:39 drystone kernel: pool[2781]: segfault at 0 ip 00007f86c4d6f6d6 sp 00007f86b92249d0 error 4 in libgs_plugin_systemd-updates.so[7f86c4d6e000+2000]

ジャーナルによると、2017-10-18 から今日までに 66 回クラッシュしています。gnome-software の現在のバージョンは、2017-09-23 にアップグレードされました。これは、マシンを Debian Wheezy から Stretch にアップグレードしたときだったはずです。アップグレード後すぐに gnome-software を開くことができたのはわかっています。

今日、gnome-software-dbgsym をインストールする手順を実行するまで、起動するたびにクラッシュしていました。-dbgsym パッケージを削除しても、クラッシュは発生しなくなりました。apt の状態に関する問題だったに違いありません。今後のため、 をインストールしてバックトレースのキャプチャを有効にしましたsystemd-coredump

私が見つけた中で一番近いのはgnome-software のセグメント違反に一致するたまたまログインしていた報告まったく別のプログラムに対してです。これは、「libgs_plugin_systemd-updates segfault」の結果に表示されました。(問題の Kali バージョンには、Debian Stretch の同じバイナリが含まれていたと推測しています)。この segfault メッセージをより具体的に検索すると、Google のインデックスには現在、Kali レポートと私の質問のみが含まれています。


$ apt-cache policy gnome-software
gnome-software:
  Installed: 3.22.5-1
  Candidate: 3.22.5-1
  Version table:
 *** 3.22.5-1 500
        500 http://ftp.uk.debian.org/debian stretch/main amd64 Packages
        100 /var/lib/dpkg/status

apt-get upgradegnome-software (または packagekit) の保留中の更新は表示されませんでした。

$ gnome-software 
14:59:38:0408 Gs  failed to call gs_plugin_add_updates_historical on packagekit-offline: The package id's 'curl;7.52.1-5+deb9u2;amd64;debian-stable-main&

[snip. この警告はクラッシュしない場合でも表示されます]

&xwayland;2:1.19.2-1+deb9u2;amd64;debian-stable-main' are not valid
Segmentation fault

[1] Debianデスクトップにはクラッシュ時のポップアップは付属していません。

私の両親はマルチユーザー システムとしてこれに慣れており、シャットダウンする前に gdm からログアウトする可能性があります。その場合、再起動して更新プログラムをインストールするための便利なチェックボックスは表示されません。 どうやら私の両親は、最初にログアウトせずに直接シャットダウンする傾向があるようです。だからそれは良いことです。少なくとも、シャットダウン時に「再起動して更新プログラムをインストール」が表示されるはずです。(これはデフォルトでチェックされているチェックボックスとして表示されます)。

答え1

TL;DR PackageKit にはバグがあります (特にオフライン アップデート - systemd へのさまざまな参照は、オフライン アップデートが systemd を使用して実装されているためです)。Debian 用の Google Chrome パッケージでは動作しません。 私はこれを上流に報告した

をインストールし、のpk-update-icon行をコメント化/削除/編集することで、この問題を回避できます。をすばやくテストしたい場合は、 を使用して実行することをお勧めします。 個人的には、アイコンの通知に問題があるため、これを Gnome 拡張機能 TopIcons Plus と組み合わせます。NotShowIn=KDE;GNOME;/etc/xdg/autostart/pk-update-icon.desktoppk-update-iconpk-update-icon --delay=0


1 か月後にクラッシュが再び発生したため、次のバックトレースをキャプチャすることができました。

Thread 9 "pool" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7fffcffff700 (LWP 2689)]
gs_plugin_add_updates (plugin=0x555555885d00, list=0x555557735af0, cancellable=<optimized out>, error=<optimized out>)
    at gs-plugin-systemd-updates.c:122
(gdb) bt full 3
#0  gs_plugin_add_updates (plugin=0x555555885d00, list=0x555557735af0, cancellable=<optimized out>, error=<optimized out>) at gs-plugin-systemd-updates.c:122
        app = 0x5555558af7c0
        split = 0x0
        i = 1
        error_local = 0x0
        package_ids = 0x7fffc0073d00
#1  0x00005555555ad795 in gs_plugin_loader_run_results (plugin_loader=plugin_loader@entry=0x555555849c30, function_name=0x5555555ca453 "gs_plugin_add_updates", flags=2228800, cancellable=cancellable@entry=0x555557764b60, error=error@entry=0x7fffcfffeaf0) at gs-plugin-loader.c:723
        error_local = 0x0
        ptask2 = 0x7fffc006c030
        list = 0x555557735af0
        plugin_func = 0x7fffe405d600 <gs_plugin_add_updates>
        plugin = 0x555555885d00
        exists = <optimized out>
        ret = <optimized out>
        i = 8
        ptask = 0x7fffc00757f0
        __func__ = "gs_plugin_loader_run_results"
#2  0x00005555555ad9b7 in gs_plugin_loader_get_updates_thread_cb (task=0x555558116a70, object=0x555555849c30, task_data=0x7fffc40bd520, cancellable=0x555557764b60) at gs-plugin-loader.c:1171
        method_name = <optimized out>
        state = 0x7fffc40bd520
        error = 0x0
        ret = <optimized out>
(More stack frames follow...)

ソースコードgs-plugin-systemd-updates.c:

121     split = pk_package_id_split (package_ids[i]);
122     gs_app_add_source (app, split[PK_PACKAGE_ID_NAME]);

上記では、split = 0x0 (NULL ポインタ) となっています。 pk_package_id_split()ID が無効な場合にのみ NULL を返します。

(gdb) p package_ids[0]
$1 = (gchar *) 0x7fffc407f720 "google-chrome-stable;63.0.3239.84-1;amd64;google"
(gdb) p package_ids[1]
$2 = (gchar *) 0x7fffc4087e20 "_inc.-stable-main"
(gdb) p package_ids[2]
$3 = (gchar *) 0x0
(gdb) p i
$5 = 1

無効な ID は のようです_inc.-stable-mainpkcon get-updates両方の ID のテキストを含む 1 つのパッケージのみが表示されます。ただし、pkcon get-offline-updates同じバグを示しているようです。(apt-get --dry-run upgradeは、アップグレード可能なパッケージが 1 つしかないことを示しています)。

$ pkcon get-updates      
Normal          google-chrome-stable-63.0.3239.84-1.amd64 (google,_inc.-stable-main)    The web browser from Google
$ pkcon offline-get-prepared
Prepared updates:
google-chrome-stable-63.0.3239.84-1.amd64
(null)

笑。 pk-オフライン.c:

/* return raw package ids */
return g_strsplit (prepared_ids, ",", -1);

関連情報