簡體   English   中英

如果程序在沒有 sudo 的情況下運行,gtk_init 會導致 ubuntu 16.04 崩潰

[英]gtk_init caused crash on ubuntu 16.04 if program run without sudo

如果在沒有 sudo 的情況下運行程序,gtk_init 會導致 ubuntu 16.04 崩潰。 如果使用 sudo 運行,則沒有問題。 在其他 ubuntu 版本上,無論是否使用 sudo 都沒有問題。

最小可重復的示例:

#include <gtk/gtk.h>

int main(int argc, char* argv[])
{
    gtk_init (&argc, &argv);

    for (int i = 0; i < 10; ++i)
    {
        printf("%d\n", i);
        usleep(1000 * 1000);
    }
    return 0;
}

堆棧跟蹤:

Thread 2 "dconf worker" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0xb6567b40 (LWP 6735)]
0xb71bbfd0 in g_source_set_ready_time () from /lib/i386-linux-gnu/libglib-2.0.so.0
(gdb) bt
#0  0xb71bbfd0 in g_source_set_ready_time () from /lib/i386-linux-gnu/libglib-2.0.so.0
#1  0xb73e8bf4 in g_task_get_type () from /usr/lib/i386-linux-gnu/libgio-2.0.so.0
#2  0xb744b6a0 in ?? () from /usr/lib/i386-linux-gnu/libgio-2.0.so.0
#3  0xb743eb00 in ?? () from /usr/lib/i386-linux-gnu/libgio-2.0.so.0
#4  0xb73bd0e9 in g_initable_init () from /usr/lib/i386-linux-gnu/libgio-2.0.so.0
#5  0xb743f230 in g_bus_get_sync () from /usr/lib/i386-linux-gnu/libgio-2.0.so.0
#6  0xb668c314 in ?? () from /usr/lib/i386-linux-gnu/gio/modules/libdconfsettings.so
#7  0xb668c423 in ?? () from /usr/lib/i386-linux-gnu/gio/modules/libdconfsettings.so
#8  0x0807e22a in g_main_context_dispatch ()
#9  0x0807e638 in g_main_context_iterate.isra ()
#10 0x0807e700 in g_main_context_iteration ()
#11 0xb668c58b in ?? () from /usr/lib/i386-linux-gnu/gio/modules/libdconfsettings.so
#12 0x0809eabd in g_thread_proxy ()
#13 0xb7aaf295 in start_thread (arg=0xb6567b40) at pthread_create.c:333
#14 0xb79d10ae in clone () at ../sysdeps/unix/sysv/linux/i386/clone.S:114

我試圖將 strace 輸出與 sudo 進行比較,並且沒有 - 沒有創建 sudo 問題線程dconf worker ,但是如果使用 sudo 運行,則不會創建線程並且程序正常工作

可以做些什么來解決這個問題?


UPD:帶有`libglib2.0-0-dbg 的堆棧跟蹤

Thread 2 "dconf worker" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0xb6567b40 (LWP 3574)]
0xb71bbfd0 in g_source_set_ready_time (source=0xb5c09938, ready_time=-1)
    at /build/glib2.0-2aRhhS/glib2.0-2.48.2/./glib/gmain.c:1786
1786    /build/glib2.0-2aRhhS/glib2.0-2.48.2/./glib/gmain.c: No such file or directory.
(gdb) bt
#0  0xb71bbfd0 in g_source_set_ready_time (source=0xb5c09938, ready_time=-1)
    at /build/glib2.0-2aRhhS/glib2.0-2.48.2/./glib/gmain.c:1786
#1  0xb73e8bf4 in g_task_get_type () at /build/glib2.0-2aRhhS/glib2.0-2.48.2/./gio/gtask.c:1907
#2  0xb73e8bf4 in g_task_get_type () at /build/glib2.0-2aRhhS/glib2.0-2.48.2/./gio/gtask.c:590
#3  0xb744b6a0 in _g_dbus_worker_new () at /build/glib2.0-2aRhhS/glib2.0-2.48.2/./gio/gdbusprivate.c:227
#4  0xb744b6a0 in _g_dbus_worker_new () at /build/glib2.0-2aRhhS/glib2.0-2.48.2/./gio/gdbusprivate.c:267
#5  0xb744b6a0 in _g_dbus_worker_new (stream=0xb5c016c8, capabilities=G_DBUS_CAPABILITY_FLAGS_UNIX_FD_PASSING, initially_frozen=0, message_received_callback=0xb7438400 <on_worker_message_received>, message_about_to_be_sent_callback=0xb7435eb0 <on_worker_message_about_to_be_sent>, disconnected_callback=0xb74359c0 <on_worker_closed>, user_data=0xb5c04818)
    at /build/glib2.0-2aRhhS/glib2.0-2.48.2/./gio/gdbusprivate.c:1649
#6  0xb743eb00 in initable_init (initable=0xb5c04818, cancellable=0x0, error=0xb6567068)
    at /build/glib2.0-2aRhhS/glib2.0-2.48.2/./gio/gdbusconnection.c:2573
#7  0xb73bd0e9 in g_initable_init (initable=0xb5c04818, cancellable=0x0, error=0xb6567068)
    at /build/glib2.0-2aRhhS/glib2.0-2.48.2/./gio/ginitable.c:112
#8  0xb743f230 in g_bus_get_sync (bus_type=G_BUS_TYPE_SESSION, cancellable=0x0, error=0xb6567068)
    at /build/glib2.0-2aRhhS/glib2.0-2.48.2/./gio/gdbusconnection.c:7254
#9  0xb668c314 in  () at /usr/lib/i386-linux-gnu/gio/modules/libdconfsettings.so
#10 0xb668c423 in  () at /usr/lib/i386-linux-gnu/gio/modules/libdconfsettings.so
#11 0x0807e22a in g_main_context_dispatch ()
#12 0x0807e638 in g_main_context_iterate.isra ()
#13 0x0807e700 in g_main_context_iteration ()
#14 0xb668c58b in  () at /usr/lib/i386-linux-gnu/gio/modules/libdconfsettings.so
#15 0x0809eabd in g_thread_proxy ()
#16 0xb7aaf295 in start_thread (arg=0xb6567b40) at pthread_create.c:333
#17 0xb79d10ae in clone () at ../sysdeps/unix/sysv/linux/i386/clone.S:114

取消設置GTK2_MODULESGTK_MODULESGTK_IM_MODULE修復了這個問題,但我不明白為什么它會起作用

#include <gtk/gtk.h>

int main(int argc, char* argv[])
{
    unsetenv("GTK2_MODULES");
    unsetenv("GTK_MODULES");
    unsetenv("GTK_IM_MODULE");

    gtk_init (&argc, &argv);

    for (int i = 0; i < 10; ++i)
    {
        printf("%d\n", i);
        usleep(1000 * 1000);
    }
    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM