Program crashes (SIGSEGV)
Hello,
My program crashes sometimes (SIGSEGV - Segmentation fault). This is (a part of) the code:
This shows the error message when the connection with the server was broken or stopped.
Code:
void Window_Login_Busy::show_errors(int sort_error)
{
close();
window_login->show();
progressbar->setValue(0);
QString text
= "Aanmelden mislukt";
if(sort_error == 1)
text += ": Disconnected from server.";
else if (sort_error == 2)
text += ": Gebruikersnaam of wachtwoord is fout.";
err.setWindowTitle("QQMsn: Error");
err.setText(text);
err.exec();
//debug->setData("bla");
}
and
Here someone entered the wrong password, I break the connection with the server.
Code:
while(ssl_sck_dalogin->canReadLine())
{
[...]
else if(line.contains("HTTP/1.1 302 FOUND"))
{
debug->setData("Redirect");
break;
}
[...]
}
and
This is the emited slot when I close the connection, it uses the standard Qt signal:
connect(socket, SIGNAL(disconnected()), SLOT(isDisconnected()));
login_busy->show_errors(1); is the function in the first code I posted.
Code:
void cmsn::isDisconnected()
{
debug->setData("\nDisconnected from host (Notification server).");
if(login_busy->change_lbl)
login_busy->show_errors(1);
}
When someone enters the wrong password, I get an error dialog with an Ok button, the login screen is showed and the login_busy is closed. But when you close that screen or press the Ok button, the program receives the SIGSEGV signal and crashes.
gdb says:
Quote:
`/home/quinten/QQMsn_build/QQMsn' has changed; re-reading symbols.
Starting program: /home/quinten/QQMsn_build/QQMsn
Failed to read a valid object file image from memory.
[Thread debugging using libthread_db enabled]
[New Thread -1223088432 (LWP 4881)]
[New Thread -1225602160 (LWP 4882)]
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread -1223088432 (LWP 4881)]
When I don't show an MessageBox, the program does not crash and gdb says:
Quote:
Starting program: /home/quinten/QQMsn_build/QQMsn
Failed to read a valid object file image from memory.
[Thread debugging using libthread_db enabled]
[New Thread -1222646064 (LWP 4927)]
[New Thread -1225159792 (LWP 4928)]
[Thread -1225159792 (LWP 4928) exited]
Program exited normally.
There are some cases where the server closes the connection (e.g. entering a wrong username). In that case, the same slot is emited, the
MessageBox shows, and when pressing OK, the MessageBox closes and the program doesn't crash.
Why does my program crash? How can I solve it? I don't understand where the error is, in my ssl class, in my window_login class, in Qt, in OpenSSL or somewhere else? When you need the whole source code, I'll post it.
Re: Program crashes (SIGSEGV)
My assumption is that calling close() in show_errors causes a lot of problems.
It will post a close event in the event loop. But then you show a modal warning message box. This will block all activity in your window, and show_errors will not exit until you close the dialog.
Try using hide() instead if you can, or show the warning message box and the login window after the main window is closed. You could do something about this in close event.
Or, in isDisconnected, call showErrors and then call login_busy->close() right after it, but remove close() from show_errors().
Perhaps it would be more helpful if you posted the entire code, so somebody can testy it.
Regards
Re: Program crashes (SIGSEGV)
Could we see the backtrace? Do you use threads in your application?
1 Attachment(s)
Re: Program crashes (SIGSEGV)
When I remove the close(); (just for testing), it still crashes, so I think the problem is not the close(); but something else.
Where can I find backtraces?
What are threads?
Source
The source is in the attachment.
Licence
GPLv2
Info
When you enter your MSN and correct password, it will stay to 100%, that's because I have to program the other things. The crash happens only when you enter a valid mailadres and a wrong password.
Requirements
Qt 4.3
CMake (don't know which version, I use CMake 2.4.6)
Compiling
Code:
mkdir QQMsn_build
cd QQMsn_build
cmake ../<source_dir>
make
Re: Program crashes (SIGSEGV)
Quote:
Originally Posted by
Voldemort
Where can I find backtraces?
Enter "bt" in gdb after the application crashes.
http://en.wikipedia.org/wiki/Thread_(computer_science)
Re: Program crashes (SIGSEGV)
Backtrace:
Code:
#0 0xb668ad83 in SSL_read () from /usr/lib/libssl.so
#1 0x00000004 in ?? ()
#2 0x00000004 in ?? ()
#3 0x00000000 in ?? ()
But I don't understand a backtrace, how do you have to read it? Where can you find the crucial information in the backtrace?
I don't think I use threads.
Re: Program crashes (SIGSEGV)
First you have to compile your application with debug information (CONFIG+=debug in .pro file). Adding QMAKE_CXXFLAGS+=-ggdb will give you even more info.
Re: Program crashes (SIGSEGV)
But I use CMake, not QMake, how can I do the same in CMake?
Re: Program crashes (SIGSEGV)
Consult the manual on how to set CXXFLAGS for your project.
Re: Program crashes (SIGSEGV)
I can't find the answer in the documentation
http://www.cmake.org/HTML/Documentation.html
Re: Program crashes (SIGSEGV)
set(CMAKE_CXX_FLAGS "-ggdb")
Re: Program crashes (SIGSEGV)
I added the line, but there is no difference, I think I have to this:
Quote:
First you have to compile your application with debug information (CONFIG+=debug in .pro file).
But how do I have to set this option?
Re: Program crashes (SIGSEGV)
In the .pro file you have to add that line.
Re: Program crashes (SIGSEGV)
@marcel: He doesn't use qmake.
It's enough if you add the -ggdb flag.
Re: Program crashes (SIGSEGV)
There changes nothing:
Quote:
# gdb ./QQMsn 2> ../QQMsn_debug.txt
GNU gdb 6.5
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i586-suse-linux"...Using host libthread_db library "/lib/libthread_db.so.1".
(gdb) run
Starting program: /home/quinten/QQMsn_build/QQMsn
[Thread debugging using libthread_db enabled]
[New Thread -1222338864 (LWP 4290)]
[New Thread -1224852592 (LWP 4297)]
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread -1222338864 (LWP 4290)]
0xb66f7d83 in SSL_read () from /usr/lib/libssl.so
(gdb) bt
#0 0xb66f7d83 in SSL_read () from /usr/lib/libssl.so
#1 0x00000004 in ?? ()
#2 0x00000004 in ?? ()
#3 0x00000000 in ?? ()
(gdb) kill
Kill the program being debugged? (y or n) y
But I don't understand a backtrace, how do you have to read it? Where can you find the crucial information in the backtrace?
Re: Program crashes (SIGSEGV)
From what I see in the call stack, it crashes in libssl.
Qt supports SSL from 4.3. Did you link with the correct( required ) ssl library ?
Maybe you didn't have the correct version when you compiled Qt. Anyway, It does not make a lot of sense crashing at that point ( perhaps a bug in Qt related to SSL ? ).
Try disabling SSL from QHttp, if you can...
To Wysota: It doesn't matter if he enables debugging information in his app, because it crashes in another lib.
Regards
Re: Program crashes (SIGSEGV)
Quote:
Originally Posted by
marcel
To Wysota: It doesn't matter if he enables debugging information in his app, because it crashes in another lib.
Of course it matters - something calls this "another lib", right?. As you can see three symbols are not identified correctly. And it looks like a corrupted stack (look at symbol addresses, it looks like the frame stack is incorrect), by the way, so I suggest doing "make distclean && qmake && make" first to make sure the app is compiled properly. Blaiming OpenSSL is certainly not the way to go.
Re: Program crashes (SIGSEGV)
Quote:
Originally Posted by
Voldemort
#3 0x00000000 in ?? ()
It looks like you try to dereference a null pointer somewhere. Make sure you create all Qt objects after QApplication instance was created.
Quote:
Originally Posted by
Voldemort
But I use CMake, not QMake, how can I do the same in CMake?
Run ccmake and set CMAKE_BUILD_TYPE to Debug.
Re: Program crashes (SIGSEGV)
1) I create QOBjects before I use QApplication, but that's because otherwise extern won't work (main.cpp). Is that the cause of the crash? How can I solve this problem?
2) How do I disable SSL from QHttp? I need a QSslSocket, so disabling SSL will cause my application won't work.
3) CMAKE_BUILD_TYPE is set to "Debug", no change in the bactrace?
Re: Program crashes (SIGSEGV)
Why not use a pointer to QObject?