Brak wysyłanego sygnału po skompilowaniu w trybie Release

0

Cześć, jak w temacie. Mam program w napisany w Qt. Po kompilacji w trybie debug działa bez problemu zaś w trybie release uruchamia się, ale nie emituje sygnału &QTcpServer::newConnection. Oto fragment kodu:

void Server::startServer()
{
    chatServer = new QTcpServer();
    chatServer->setMaxPendingConnections(10);
    connect(chatServer, &QTcpServer::newConnection, this, &Server::newClientConnection);


    if (connectToDatabase())
    {
        qDebug() << "Connected to database!";

        if (chatServer->listen(QHostAddress::Any, 1234))
        {
            qDebug() << "Server has started. Listening to port 1234.";
        }
        else
        {
            qDebug() << "Server failed to start. Error: " + chatServer->errorString();
        }
    }
    else
    {
        qDebug() << "Failed to connect to database.";
    }

}
void Server::newClientConnection()
{
    QTcpSocket *client = chatServer->nextPendingConnection();
    QString ipAddress = client->peerAddress().toString();
    int port = client->peerPort();

    connect(client, &QTcpSocket::disconnected, this, &Server::socketDisconnected);
    connect(client, &QTcpSocket::readyRead, this, &Server::socketReadyRead);
    connect(client, &QTcpSocket::stateChanged, this, &Server::socketStateChanged);

    qDebug() << "Socket connected from " + ipAddress.mid(IPV4) + ":" + QString::number(port);
}

Może to trochę wróżenie z fusów lecz nie wiem gdzie mam szukać przyczyny. Sygnał &QTcpServer::newConnection w trybie debug jest emitowany, gdyż metodaServer::newClientConnection() wykonuje się.

Wireshark wypluwa mi coś takiego w trybie release:
screenshot-20230509221115.png

Zaś w trybie debug:
screenshot-20230509221249.png

1

Ale ty sprawdzaj w debugerem a nie snalizuj ruchu sieciowego.

3

Ja bym to w pierwszym kroku skompilował z address sanitizerem.

3

Przygotuj MCVE, bez tego ciężko mówić. W obecnym fragmencie wyciekasz pamięć (2x new QTcpServer) i nie przekazujesz parenta do serwerów. Ale akurat te błędy nie powinny się objawiać tym, co opisujesz.

1

Nie widać wyjaśnienia w załączonym kodzie.
Błąd jaki widzę, to brak podawania rodzica do konstruktora (tak się w Qt zarządza pamięcią), ale nie jest to raczej związane z opisanym problemem.

chatServer = new QTcpServer(this);

Zacznij też od analizy logów, tam może być informacja o jakimś błędzie.

0

A plucie po konsoli qDebug() wygląda identycznie w debug i release ?

1
Marius.Maximus napisał(a):

A plucie po konsoli qDebug() wygląda identycznie w debug i release ?

Tak bo to nie są makra zależne od tego czy jest wersja debug lub release.

0
haracz napisał(a):

Cześć, jak w temacie. Mam program w napisany w Qt. Po kompilacji w trybie debug działa bez problemu zaś w trybie release uruchamia się, ale nie emituje sygnału &QTcpServer::newConnection. Oto fragment kodu:

void Server::startServer()
{
    chatServer = new QTcpServer();
    chatServer->setMaxPendingConnections(10);
    connect(chatServer, &QTcpServer::newConnection, this, &Server::newClientConnection);


    if (connectToDatabase())
    {
        qDebug() << "Connected to database!";

        chatServer = new QTcpServer();
        chatServer->setMaxPendingConnections(10);
        connect(chatServer, &QTcpServer::newConnection, this, &Server::newClientConnection);

        if (chatServer->listen(QHostAddress::Any, 1234))
        {
            qDebug() << "Server has started. Listening to port 1234.";
        }
        else
        {
            qDebug() << "Server failed to start. Error: " + chatServer->errorString();
        }
    }
    else
    {
        qDebug() << "Failed to connect to database.";
    }

}
void Server::newClientConnection()
{
    QTcpSocket *client = chatServer->nextPendingConnection();
    QString ipAddress = client->peerAddress().toString();
    int port = client->peerPort();

    connect(client, &QTcpSocket::disconnected, this, &Server::socketDisconnected);
    connect(client, &QTcpSocket::readyRead, this, &Server::socketReadyRead);
    connect(client, &QTcpSocket::stateChanged, this, &Server::socketStateChanged);

    qDebug() << "Socket connected from " + ipAddress.mid(IPV4) + ":" + QString::number(port);
}

ja się tylko domyślam czemu ci nie chce wykonać connecta. Spójrz na funkcję startServer i na linię 3 i 12 w której tworzysz dwie instancje chatServer = new QTcpServer() - też kiedyś robiłem ten sam błąd i widzę, że prawdopodobnie robisz tutaj to samo. Zastanów się, czy rzeczywiście potrzebne są ci te dwie RÓŻNE instancje ? Bo może connect działa na jednej ale nie widzisz tego w drugiej, którą gdzieś tam pewnie wywołujesz... Zrób jedną instancję i możliwe, że wtedy zadziała.

i to wszystko kłóci mi się z tym tutaj (linia 33) -> QTcpSocket *client = chatServer->nextPendingConnection();

0

Przepraszam Was w pośpiechu przez przypadek zdublowałem 3 linie kodu, o którym pisaliście wcześniej. Już poprawione. Tego nie było pierwotnie i to nie jest przyczyną problemu.

1

To przygotuj MCVE, wróżenie z fusów jest ciężkie.

1

Tak żeby nie szukać co to MCVE

1 użytkowników online, w tym zalogowanych: 0, gości: 1