Scribus 因 .ICEauthority 崩溃

Scribus 因 .ICEauthority 崩溃

我一直在尝试让 scribus 在我的新 gentoo 12.1(amd64、XFCE、qt 4.8.2)安装上工作,但是当以普通用户身份运行时,程序无法启动。感谢下面的建议和额外测试,我已将其范围缩小到 .ICEauthority 的问题,当我移动文件(或以 root 身份启动 Scribus,sho 没有该文件)时,它会完美加载。不过,该文件是在登录时自动创建的,因此无法删除它。

我已经尝试过这些 ebuild,结果相同:

  • 稳定 amd64 (1.4.0-r2)
  • amd64 不稳定 (1.4.1)
  • 稳定 i386 (1.4.0-r2)

一些 strace 结果,我在第一个结果上混合了 strace -eopen 和完整输出。

作为用户:

open("/usr/share/locale/en/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/home/xxx/.ICEauthority", O_RDONLY) = 8
open("/home/xxx/.ICEauthority", O_RDONLY) = 8
open("/home/xxx/.ICEauthority", O_RDONLY) = 8
open("/home/xxx/.ICEauthority", O_RDONLY) = 8
open("/home/xxx/.scribus//prefs140.xml", O_RDONLY|O_CLOEXEC) = 8
open("/usr/share/scribus/translations/scribus.en_GB.qm", O_RDONLY|O_CLOEXEC) = 8
open("/etc/nsswitch.conf", O_RDONLY)    = 8
open("/etc/ld.so.cache", O_RDONLY)      = 8
open("/lib64/libnss_compat.so.2", O_RDONLY) = 8
open("/lib64/libnsl.so.1", O_RDONLY)    = 8
open("/etc/ld.so.cache", O_RDONLY)      = 8
open("/lib64/libnss_nis.so.2", O_RDONLY) = 8
open("/lib64/libnss_files.so.2", O_RDONLY) = 8
open("/etc/passwd", O_RDONLY|O_CLOEXEC) = 8
open("/etc/passwd", O_RDONLY|O_CLOEXEC) = 8
fcntl(8, F_GETFD)                       = 0x1 (flags FD_CLOEXEC)
lseek(8, 0, SEEK_CUR)                   = 0
fstat(8, {st_mode=S_IFREG|0644, st_size=1129, ...}) = 0
mmap(NULL, 1129, PROT_READ, MAP_SHARED, 8, 0) = 0x7f748c6bd000
lseek(8, 1129, SEEK_SET)                = 1129
munmap(0x7f748c6bd000, 1129)            = 0
close(8)                                = 0
write(7, "\1\f\1\0\7\0\0\0\1\0\0\0\0\0\0\0\6\0\0\0UserID\0\0\0\0\0\0"..., 64) = 64
--- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=0x7070415173} ---
rt_sigaction(SIGALRM, {SIG_DFL, [ALRM], SA_RESTORER|SA_RESTART, 0x7f7488617bc0}, {SIG_DFL, [], 0}, 8) = 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f748c6bd000
write(1, "Scribus Crash\n", 14)         = 14
write(1, "-------------\n", 14)         = 14
write(1, "Scribus crashes due to Signal #1"..., 34) = 34

作为 root(第一个文件相同,之后不同):

open("/usr/share/locale/en/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
Qt: Session management error: Authentication Rejected, reason : None of the authentication protocols specified are supported and host-based authentication failed
open("/root/.scribus//prefs140.xml", O_RDONLY|O_CLOEXEC) = 7
open("/usr/share/scribus/translations/scribus.en_GB.qm", O_RDONLY|O_CLOEXEC) = 7
open("/usr/share/scribus/icons/Splash.png", O_RDONLY|O_CLOEXEC) = 7
open("/etc/qt4/Trolltech.conf", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/lib64/qt4/plugins/imageformats", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 8
open("/usr/lib64/qt4/plugins/imageformats/libqgif.so", O_RDONLY) = 8
open("/usr/lib64/qt4/plugins/imageformats/libqico.so", O_RDONLY) = 8
open("/usr/lib64/qt4/plugins/imageformats/libqjpeg.so", O_RDONLY) = 8
open("/usr/lib64/qt4/plugins/imageformats/libqmng.so", O_RDONLY) = 8
open("/etc/ld.so.cache", O_RDONLY)      = 8
open("/usr/lib64/libmng.so.1", O_RDONLY) = 8
open("/usr/lib64/liblcms.so.1", O_RDONLY) = 8
open("/usr/lib64/qt4/plugins/imageformats/libqtiff.so", O_RDONLY) = 8

我通过 gdb 运行它(在没有 -O2 的情况下编译后):

(gdb) run
Starting program: /usr/bin/scribus 
[Thread debugging using libthread_db enabled]

Program received signal SIGSEGV, Segmentation fault.
0x0000000000e932c8 in typeinfo name for ScribusQApp ()
(gdb) backtrace
#0  0x0000000000e932c8 in typeinfo name for ScribusQApp ()
#1  0x00007ffff70c94bf in ?? () from /usr/lib64/qt4/libQtGui.so.4
#2  0x00007ffff70c9789 in ?? () from /usr/lib64/qt4/libQtGui.so.4
#3  0x00007ffff278b11e in _SmcProcessMessage () from /usr/lib64/libSM.so.6
#4  0x00007ffff257a9c3 in IceProcessMessages () from /usr/lib64/libICE.so.6
#5  0x00007ffff65b7de3 in QMetaObject::activate(QObject*, QMetaObject const*, int, void**) () from /usr/lib64/qt4/libQtCore.so.4
#6  0x00007ffff660338e in QSocketNotifier::activated(int) () from /usr/lib64/qt4/libQtCore.so.4
#7  0x00007ffff65bfaab in QSocketNotifier::event(QEvent*) () from /usr/lib64/qt4/libQtCore.so.4
#8  0x00007ffff704c8b4 in QApplicationPrivate::notify_helper(QObject*, QEvent*)
() from /usr/lib64/qt4/libQtGui.so.4
#9  0x00007ffff705136f in QApplication::notify(QObject*, QEvent*) () from /usr/lib64/qt4/libQtGui.so.4
#10 0x00007ffff65a33ab in QCoreApplication::notifyInternal(QObject*, QEvent*)
() from /usr/lib64/qt4/libQtCore.so.4
#11 0x00007ffff65d0c18 in ?? () from /usr/lib64/qt4/libQtCore.so.4
#12 0x00007ffff29d6672 in g_main_context_dispatch () from /usr/lib64/libglib-2.0.so.0
#13 0x00007ffff29d6e68 in ?? () from /usr/lib64/libglib-2.0.so.0
#14 0x00007ffff29d7041 in g_main_context_iteration () from /usr/lib64/libglib-2.0.so.0
#15 0x00007ffff65d12bf in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () from /usr/lib64/qt4/libQtCore.so.4
#16 0x00007ffff70edc7e in ?? () from /usr/lib64/qt4/libQtGui.so.4
#17 0x00007ffff65a722f in QCoreApplication::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () from /usr/lib64/qt4/libQtCore.so.4
#18 0x0000000000c26285 in ScribusQApp::init() ()
#19 0x0000000000e04250 in mainApp(int, char**) ()
#20 0x0000000000e041f8 in main ()

我通常总是在网上找到问题的解决方案 - 所以我不习惯提交错误报告。不过,这次我似乎找不到任何有此问题的案例。

那么我应该从哪里开始 - 使用 scribus 提交错误报告?他们是否需要此处提供的任何其他信息?

任何建议将不胜感激。

祝一切顺利,感谢您抽出宝贵的时间。

答案1

你编译 Scribus 时使用了 -no-rtti 吗?回溯暗示无法找到 ScribusQApp 的类型信息。 Scribus 不依赖 RTTI,我认为 Qt 也不依赖。然而,错误发生在 /usr/lib64/qt4/libQtGui.so.4 中的未命名函数中。所以我的建议是检查 Qt 和 Scribus 的编译设置,并确保它们使用相同的 RTTI 配置。

不必费心向 bugs.scribus.net 提交错误 - 从最后一次调用 Scribus 函数开始,该错误发生了 17 个调用,中间涉及 Qt、GLIB 和icewm。在这种情况下,我们通常只是告诉人们使用另一个窗口管理器:-)

/Andreas,Scribus 开发人员

相关内容