gtk_init如果程序不使用sudo运行,则在ubuntu 16.04上导致崩溃

问题描述 投票:1回答:1

gtk_init如果运行不带sudo的程序,则会在ubuntu 16.04上导致崩溃。如果使用sudo运行,则没有问题。在其他ubuntu版本上,使用sudo和不使用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;
}

Stacktrace:

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进行比较-没有创建sudo时出现问题线程dconf worker,但是如果使用sudo运行,则不会创建该线程并且程序无法正常工作

如何解决此问题?


UPD:带有`libglib2.0-0-dbg的Stacktrace

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
c++ segmentation-fault gtk
1个回答
0
投票

取消设置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;
}
© www.soinside.com 2019 - 2024. All rights reserved.