• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

nach Gamestore- Installation Speicherzugriffsfehler

Hallo,
Nachdem ich mit 'zypper in' gamestore in openSuse 12.2 installiert habe,
öffnet sich bei Programmstart nur kurz die Oberfläche und verschwindet dann sofort wieder.
Die Konsolenausgabe lautet: Speicherzugriffsfehler.
Wo kann das Problem liegen ? :???:

Christoph.
 

spoensche

Moderator
Teammitglied
Das Problem liegt bei dem Programm. Irgendwo wird auf einen Speicherbereich zugegriffen, der nicht alloziert (Reserviert) worden ist oder aber
eine fehlerhafte bzw. fehlende Überprüfung einer Variablen, und der darauffolgende Programmteil verwendet in weiteren Operationen einen undefinierten Wert und als "Ergebnis" einen Segmentation Fault verursacht.
 
OP
C

christoph-pc

Newbie
Naja, wie kann man den Speicherbereich den nun testen, bzw. herausfinden, welcher Bereich angesprochen wird ?
Ein Konfigurationsscript hab ich zu der Applikation nicht gefunden...
Und eine 'Gamestore' Variable in der env- Liste auch nicht. Könnte ja auch was mit Qt4 zu tun haben, oder ?
 

lOtz1009

Moderator
Teammitglied
Bei mir unter 12.2 läufts.
Könntest ja mal stracce gamestore oder gdb gamestore ausführen, falls du was damit anfangen kannst.
 
OP
C

christoph-pc

Newbie
also beim debuggen mit gdb folgt Unterbrechung mit:
Code:
SIGSEGV (Segmentation fault)
at 0xb715688c in function QLocalePrivate::stringToLongLong(QString const&, int, bool*, QLocalePrivate::GroupSeparatorMode) const()
at ??:?? 
from /usr/lib/libQtCore.so.4

strace liefert im wesentlichen:
Code:
poll([{fd=6, events=POLLIN}], 1, -1)    = 1 ([{fd=6, revents=POLLIN}])
recv(6, "\1\0\206\1\0\0\0\0\254\0\0\0'\274\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 4096, 0) = 32
recv(6, 0x84e8928, 4096, 0)             = -1 EAGAIN (Resource temporarily unavailable)
recv(6, 0x84e8928, 4096, 0)             = -1 EAGAIN (Resource temporarily unavailable)

Aber damit etwas Anfangen kann ich eigentlich net...
 

spoensche

Moderator
Teammitglied
christoph-pc schrieb:
strace liefert im wesentlichen:
Code:
poll([{fd=6, events=POLLIN}], 1, -1)    = 1 ([{fd=6, revents=POLLIN}])
recv(6, "\1\0\206\1\0\0\0\0\254\0\0\0'\274\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 4096, 0) = 32
recv(6, 0x84e8928, 4096, 0)             = -1 EAGAIN (Resource temporarily unavailable)
recv(6, 0x84e8928, 4096, 0)             = -1 EAGAIN (Resource temporarily unavailable)

Aber damit etwas Anfangen kann ich eigentlich net...

Auf dem Filedescriptor 6 werden poll events (locking) empfangen und anschließend verglichen. Mit recv liest bzw. empfängst du Daten, was in diesem Fall aber nicht funktioniert, weil die Resource nicht verfügbar ist. Der Segfault entsteht vermutlich wegen einer fehlerhaften oder fehlenden Fehlerbehandlung für recv() = -EAGAIN.
 
OP
C

christoph-pc

Newbie
Ich hab' hier mal das Program mit ddd geöffnet:

Code:
#include <QApplication>
#include <QDir>
#include <QFileInfo>
#include <QMessageBox>
#include <QProcess>
#include <QString>
#include <QTextStream>
#include <stdlib.h>
#include "gamestoreform.h"
    
QString detectDistro()
{
        QFileInfo fi("/etc/SuSE-release");
        if (fi.exists()) return "openSUSE";
        return "";
}
    
bool detect3D()
{
        QProcess glxinfo;
        glxinfo.start("glxinfo");
        if (!glxinfo.waitForStarted(1000)) return false;
        if (!glxinfo.waitForFinished(1000)) return false;
        QByteArray o = glxinfo.readAll();
        return ( o.indexOf(QByteArray("direct rendering: Yes")) > -1 );
}
    
int main( int argc, char *argv[] )
{
        QApplication app( argc, argv );
    
        GameStoreInfo::distro = detectDistro();
        if (GameStoreInfo::distro.isEmpty()) {
                QMessageBox::critical(0, "Error", "Game Store was unable to detect your distribution.");
                return 1;
        }
    
        char *tmp = getenv("XDG_CONFIG_HOME");
        GameStoreInfo::confdir = tmp ? tmp : QDir::homePath() + "/.config";
        GameStoreInfo::confdir += + "/gamestore/";
        QDir dir;
        dir.mkpath(GameStoreInfo::confdir + "icon");
        dir.mkpath(GameStoreInfo::confdir + "thumb");
    
        GameStoreForm *window = new GameStoreForm();
        window->show();
    
        if (!detect3D()) {
                QMessageBox::warning(0, "Warning", "Your system reports that it is not capable of hardware accelerated 3D graphics. You might expect difficulties running some of the games.\nUsually the cause of this error is that there are no drivers for your graphics card installed.");
        }
    
        return app.exec();
}

evtl. ist XDG_CONFIG_HOME nicht richtig gesetzt. In welchem Script ist das denn wo und wie ??
 
Oben