Qt 4.8 QThread segfault с QTcpSocket и exe c на Linux - PullRequest
0 голосов
/ 18 июня 2020

Я замечаю странное поведение при расширении QThread для реализации соединения Tcp. Это моя функция запуска:

void mySocket::run()
{
  socketLocal = new QTcpSocket();

  connect(socketLocal, SIGNAL(connected()), this, SLOT(connected()));
  connect(socketLocal, SIGNAL(disconnected()), this, SLOT(disconnected()));
  connect(socketLocal, SIGNAL(bytesWritten(qint64)), this, SLOT(bytesWritten(qint64)));
  connect(socketLocal, SIGNAL(readyRead()), this, SLOT(readyRead()));

  QString serverName = this->myAddress;
  quint16 serverPort = this->myPort;

  quit = false;
  while(!quit)
  {
    qDebug() << "Connecting to: " << serverName;

    socketLocal->connectToHost(serverName, serverPort);
    if(!socketLocal->waitForConnected(1000))
    {
      qDebug() << "Socket Error: " << socketLocal->errorString();
      sleep(1);
    }
    else
    {
      exec();
    }
  }
}

void mySocket::sendMsg()
{
// build msgToWrite
  byteWrite = socketLocal->write(QByteArray(msgToWrite, sizeOfMsg));
  socketLocal->waitForBytesWritten(50);
}

void mySocket::connected()
{
  qDebug() << "connected...";
  timerKA->start(2000);
}

void mySocket::disconnected()
{
  timerKA->stop();
  if(this->controlledDisconnection)
    quit = true;
  exit();
}

флаг «quit» сообщает мне, действительно ли я хочу закрыть соединение с сокетом или хочу восстановить соединение. При появлении подключенного сигнала я запускаю QTimer, который каждые 2 секунды отправляет сообщение KeepAlive в мой сокет с помощью функции sendMsg. При отключении я останавливаю таймер и вызываю «exit ()», чтобы вернуть «exe c ()». В bytesWritten и readyRead я печатаю только отправленные / полученные байты. Что ж, этот код, работающий на встроенном Linux, вызывает segfault, если я подключаюсь к реальной встроенной машине Linux, но если я подключаюсь к виртуальной машине с таким же встроенным Linux, все работает нормально. Если я запустил этот код на машине Windows, все снова будет работать нормально. Это segfault:

*** Error in `./mySocketTest': malloc(): memory corruption: 0x00007fd5200019b0 ***
======= Backtrace: =========
/lib64/libc.so.6(+0x7404e)[0x7fd538dfc04e]
/lib64/libc.so.6(+0x7994e)[0x7fd538e0194e]
/lib64/libc.so.6(+0x7b11f)[0x7fd538e0311f]
/lib64/libc.so.6(__libc_malloc+0x60)[0x7fd538e05180]
/lib64/libc.so.6(__backtrace_symbols+0x123)[0x7fd538e7e263]
./mySocketTest[0x433b06]
/lib64/libc.so.6(+0x33eb0)[0x7fd538dbbeb0]
/lib64/libc.so.6(+0x1321e7)[0x7fd538eba1e7]
/opt/crosstool/QtEmbedded-x86_64/lib/libQtCore.so.4(_ZN20QEventDispatcherUNIX23activateSocketNotifiersEv+0x6d)[0x7fd539f1099d]
/opt/crosstool/QtEmbedded-x86_64/lib/libQtCore.so.4(_ZN27QEventDispatcherUNIXPrivate8doSelectE6QFlagsIN10QEventLoop17ProcessEventsFlagEEP7timeval+0x4c4)[0x7fd539f10f24]
/opt/crosstool/QtEmbedded-x86_64/lib/libQtCore.so.4(_ZN20QEventDispatcherUNIX13processEventsE6QFlagsIN10QEventLoop17ProcessEventsFlagEE+0xb3)[0x7fd539f11273]
/opt/crosstool/QtEmbedded-x86_64/lib/libQtCore.so.4(_ZN10QEventLoop13processEventsE6QFlagsINS_17ProcessEventsFlagEE+0x31)[0x7fd539ee27c1]
/opt/crosstool/QtEmbedded-x86_64/lib/libQtCore.so.4(_ZN10QEventLoop4execE6QFlagsINS_17ProcessEventsFlagEE+0x185)[0x7fd539ee2ad5]
/opt/crosstool/QtEmbedded-x86_64/lib/libQtCore.so.4(_ZN7QThread4execEv+0xe9)[0x7fd539ddc489]

Я что-то упустил? Я что-то делаю не так?

Всем спасибо.

...