Qt Application Crash -- Please help
-
Hi All,
Our application continuously reads from a socket and updates a Qmap. When I run the code, application crashes with following error. Can someone help in getting this resolved.
0 malloc_consolidate /lib/libc.so.6 0 0x00a988d8
1 _int_malloc /lib/libc.so.6 0 0x00a9ace3
2 malloc /lib/libc.so.6 0 0x00a9cd87
3 qMalloc qmalloc.cpp 55 0x0049c65d
4 QByteArray::resize qbytearray.cpp 1370 0x004a5645
5 UDPCommunicationUtil::processPendingDatagrams udpcommunicationutil.cpp 128 0x0818fb3d
6 UDPCommunicationUtil::run udpcommunicationutil.cpp 164 0x0818fced
7 QThreadPrivate::start qthread_unix.cpp 248 0x004a23ce
8 start_thread /lib/libpthread.so.0 0 0x00bad5ab
9 clone /lib/libc.so.6 0 0x00b02cfeRelevant code:
@
QByteArray *datagram=new QByteArray();
line 128: datagram->resize(pendingDataSize);
//qDebug()<<"PendingDataSize is 2 :: "<<datagram.size();
if(udpSocket->readDatagram(datagram->data(), datagram->size(),&PeerIp,&UdpPort) != -1)
{
//process the data gram...
}
delete datagram;
datagram = 0;
@Regards,
Shyam[EDIT: code formatting, please wrap in @-Tags and indent, Volker]
-
I don't know why this crashes, but last line
datagram= 0;
is surely unneccessary. This is a pointer, which points to a valid QByteArray after line 1.
The occupied memory got released in line 8 (pointer still points to the same address, but no reserved memory there any more). If you set pointer to address 0 (line 9), and then you do anything with that pointer, it will crash, as there is no valid QByteArray structure at address 0. -
[quote author="novaktamas" date="1299506976"]I don't know why this crashes, but last line
datagram= 0;
is surely unneccessary. This is a pointer, which points to a valid QByteArray after line 1.
The occupied memory got released in line 8 (pointer still points to the same address, but no reserved memory there any more). If you set pointer to address 0 (line 9), and then you do anything with that pointer, it will crash, as there is no valid QByteArray structure at address 0.
[/quote]It's valid (and good practice) to set a pointer to null after it was deleted (at least if you do use the pointer elswhere, what we do not know out of this code snippet). You can easily check if the pointer is still valid (= non null). The other way round makes a disaster: You cannot distinguish between a dangling and a valid pointer if it is set to non null value but you can always check safely for null pointers.
-
Can you make a small program that demonstrates only the error, please. We'll have a look at it. At the moment it's hard to tell what's going wrong without some actual running code.
Please do not post your current project, but boil it down to just a demonstration case for your problem. Feel free to post here or at pastebin.
-
Hi Volker,
Here is the sample code:
main.cpp@
#include <QtGui/QApplication>
#include "mainwindow.h"int main(int argc, char *argv[])
{
QApplication a(argc, argv);
udpComm=new UDPCommunicationUtil(plcConnectionObject,bindingPort);
udpComm->start();
return a.exec();
}
UDPCommunicationUtil.cpp#include "udpcommunicationutil.h"
#include <QtGui>
#include <QtNetwork>
#include <sys/types.h>#ifdef Q_OS_WIN
#include <winsock2.h>
#include <ws2tcpip.h>
#endif
#ifdef Q_OS_UNIX
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#endifUDPCommunicationUtil::UDPCommunicationUtil(ConnectionObject *connectionObject,int bindingport)
{
this->connectionObject=connectionObject;
sockDataParser= new SocketDataParser();
sockDataParser->setParent(this);
this->bindingPort=bindingport;
udpSocket = new QUdpSocket;
udpSocket->bind(this->bindingPort,QUdpSocket::ShareAddress | QUdpSocket::ReuseAddressHint);
waitForTurn = false;
activeIP="";
setStackSize(100000);}
void UDPCommunicationUtil::processPendingDatagrams()
{
if(waitForTurn == false )
{
waitForTurn = true;
QHostAddress PeerIp;
quint16 UdpPort=6000;
try{
while (udpSocket->hasPendingDatagrams())
{
quint64 pendingDataSize=udpSocket->pendingDatagramSize();
if(pendingDataSize > 0 )
{
QByteArray *datagram=new QByteArray();
datagram->resize(pendingDataSize);
if(udpSocket->readDatagram(datagram->data(), datagram->size(),&PeerIp,&UdpPort) != -1)
{
//process data
}
delete datagram;
datagram=0;
}} } catch ( ... ){ qDebug()<<"Error occurred in UDPCommunicationUtil::processPendingDatagrams in else condition"; } waitForTurn = false; }
}
void UDPCommunicationUtil::run()
{
while(true)
{
processPendingDatagrams();
msleep(20);
}
}
@EDIR: please look @-tags for code highlioghting... (Gerolf)
-
[quote author="Volker" date="1299513400"]Can you make a small program that demonstrates only the error, please. We'll have a look at it. At the moment it's hard to tell what's going wrong without some actual running code.
Please do not post your current project, but boil it down to just a demonstration case for your problem. Feel free to post here or at pastebin.[/quote]
Please follow the requests we've made. Boil down your problem to a program which is
- small
- complete
- compilable
- running
And demonstrates the error. Nothing more, nothing less. Leave out anything that does not add to the problem (i.e. we are not interested in your UDP communication unless it is the cause of the problem).
You should be able to put the problematic code into a single main function in your case.
We will not be able to test your program with that UDP processing, as we do not have the data that comes in.
Make the testcase yourself - if you're lucky you will find the error yourself.
-
Sorry for getting back bit late, actually we were trying to get to the root of the problem. While working on that we realized that the application is getting into a race condition.
We have a QList containing various values. The main application reads from this list continuously and we have forked off a thread passing pointer of this list, which would update this same list. Both work perfect till they reach a condition where in the thread class tries to write to it while the main one tries to read from it. Here the application is crashing.
We are using QList.replace function to write to the list.Any suggestions/advice please?
-
Use "QMutex":http://doc.qt.nokia.com/4.7/qmutex.html and friends to synchronize the access to the data. And read an "Thread Support in Qt":http://doc.qt.nokia.com/4.7/threads.html with some introdoction into the multithreading spcial problems. And of course you shouldn't miss peppe's great article on "Threads, Events and QObjects":http://developer.qt.nokia.com/wiki/Threads_Events_QObjects.