Segfault in Konstruktor von QCoreApplication ?!?
Verfasst: 5. November 2008 10:01
Vielleicht mache ich ja auch irgendwas grundsätzlich falsch...
Ich arbeite unter Ubuntu 8.04 Desktop auf einem Notebook IBM R52 an einem Open-Source Projekt "Fingerprint GUI" und benutze Qt4 für die Entwicklung der Benutzeroberfläche. Ziel des Projektes ist es, Login und Athentication über PAM mittels Fingerabdruck-Sensor unter Linux zu ermöglichen. Wesentliche Teile des Projektes funktionieren schon. Man findet das Projekt unter "http://www.pdfserver.net/fingerprint".
Funktionsweise (für diejenigen, die nicht genau wissen, wie PAM funktioniert):
Wenn z.B. ein Login über Fingerprint gewünscht ist, fordert der Gnome Displaymanager "GDM" über die PAM-Library "libpam.so" eine Authentifizierung des Benutzers an. Abhängig von der
PAM-Konfiguration in "/etc/pam.d" ruft libpam.so den betreffenden PAM-Modul (in meinen Falle libpam_fingerprint.so) auf und wartet auf Benutzer-Authentifizierung. Diese libpam_fingerprint.so ist Bestandteil meines Projektes. Sie aktiviert einen QtDialog und fordert den Benutzer auf, sich mit Fingerprint zu identifizieren.
Nun aber zu meinem Problem:
Während verschiedene Anwendungen wie GDM, su, sudo und gksu problemlos funktionieren, kommt es im Falle von gnome-screensaver zu einem "segfault", wenn das QCoreApplication Objekt initialisiert wird (Eintrag in /var/log/syslog):
"gnome-screensav[14369]: segfault at 00000008 eip b68702cf esp bf982130 error 4"
Der Fehler passiert _immer_ in Zeile 457 von qcoreapplication.cpp. Hier ein Auszug:
--------
----------
Ich habe es sowohl mit version 2.22.2 (Ubuntu) als auch 2.20.x (suse) von gnome-screensaver getestet. Auch die Qt versionen 4.3.4-0 (Ubuntu) oder 4.4.3 (aus qt-x11-opensource-src-4.4.3) machen keinen Unterschied.
Um auszuschließen, dass der Fehler durch meine "libpam_fingerprint.so" verursacht wird, habe ich nun eine ganz simple "libpam_dummy.so" erzeugt. Diese zeigt bei Aufruf
einen simplen QDialog und gibt beim Beenden ein PAM_SUCCESS zurück. Die Quellen dafür habe ich als "pam_dummy.tar.gz" hier angehängt. Auch mit diesem PAM-Modul kommt immer der gleiche segfault and der o.g. Stelle in "qcoreapplication.cpp".
Ich weiss mir nun wirklich keinen Rat mehr! Sollte es wirklich ein Bug in Qt sein?? Kann mir vielleicht jemand helfen, das Problem genauer zu untersuchen?
Danke für jeden Hinweis!
W.U.
Ich arbeite unter Ubuntu 8.04 Desktop auf einem Notebook IBM R52 an einem Open-Source Projekt "Fingerprint GUI" und benutze Qt4 für die Entwicklung der Benutzeroberfläche. Ziel des Projektes ist es, Login und Athentication über PAM mittels Fingerabdruck-Sensor unter Linux zu ermöglichen. Wesentliche Teile des Projektes funktionieren schon. Man findet das Projekt unter "http://www.pdfserver.net/fingerprint".
Funktionsweise (für diejenigen, die nicht genau wissen, wie PAM funktioniert):
Wenn z.B. ein Login über Fingerprint gewünscht ist, fordert der Gnome Displaymanager "GDM" über die PAM-Library "libpam.so" eine Authentifizierung des Benutzers an. Abhängig von der
PAM-Konfiguration in "/etc/pam.d" ruft libpam.so den betreffenden PAM-Modul (in meinen Falle libpam_fingerprint.so) auf und wartet auf Benutzer-Authentifizierung. Diese libpam_fingerprint.so ist Bestandteil meines Projektes. Sie aktiviert einen QtDialog und fordert den Benutzer auf, sich mit Fingerprint zu identifizieren.
Nun aber zu meinem Problem:
Während verschiedene Anwendungen wie GDM, su, sudo und gksu problemlos funktionieren, kommt es im Falle von gnome-screensaver zu einem "segfault", wenn das QCoreApplication Objekt initialisiert wird (Eintrag in /var/log/syslog):
"gnome-screensav[14369]: segfault at 00000008 eip b68702cf esp bf982130 error 4"
Der Fehler passiert _immer_ in Zeile 457 von qcoreapplication.cpp. Hier ein Auszug:
--------
Code: Alles auswählen
// ### move to QCoreApplicationPrivate constructor?
void QCoreApplication::init()
{
Q_D(QCoreApplication);
#ifdef Q_OS_UNIX
setlocale(LC_ALL, ""); // use correct char set mapping
setlocale(LC_NUMERIC, "C"); // make sprintf()/scanf() work
#endif
#ifdef Q_WS_WIN
// Get the application name/instance if qWinMain() was not invoked
set_winapp_name();
#endif
Q_ASSERT_X(!self, "QCoreApplication", "there should be only one application object");
QCoreApplication::self = this;
#ifndef QT_NO_THREAD
QThread::initialize();
#endif
// use the event dispatcher created by the app programmer (if any)
if (!QCoreApplicationPrivate::eventDispatcher)
QCoreApplicationPrivate::eventDispatcher = d->threadData->eventDispatcher;
// otherwise we create one
if (!QCoreApplicationPrivate::eventDispatcher)
d->createEventDispatcher(); //HIER PASSIERT ES!!!!!!!!!!
Q_ASSERT(QCoreApplicationPrivate::eventDispatcher != 0);
Ich habe es sowohl mit version 2.22.2 (Ubuntu) als auch 2.20.x (suse) von gnome-screensaver getestet. Auch die Qt versionen 4.3.4-0 (Ubuntu) oder 4.4.3 (aus qt-x11-opensource-src-4.4.3) machen keinen Unterschied.
Um auszuschließen, dass der Fehler durch meine "libpam_fingerprint.so" verursacht wird, habe ich nun eine ganz simple "libpam_dummy.so" erzeugt. Diese zeigt bei Aufruf
einen simplen QDialog und gibt beim Beenden ein PAM_SUCCESS zurück. Die Quellen dafür habe ich als "pam_dummy.tar.gz" hier angehängt. Auch mit diesem PAM-Modul kommt immer der gleiche segfault and der o.g. Stelle in "qcoreapplication.cpp".
Ich weiss mir nun wirklich keinen Rat mehr! Sollte es wirklich ein Bug in Qt sein?? Kann mir vielleicht jemand helfen, das Problem genauer zu untersuchen?
Danke für jeden Hinweis!
W.U.