PDA

View Full Version : Strange behavior with simple QApplication and valgrind



atomic
25th February 2015, 11:27
I create simple widgets project and run valgrind, on output i get 10 000 errors, looks like on screenshot

10964

In terminal I run valgrind by means of command

valgrind --tool=memcheck --leak-check=full ./ubuntu

and on output i get

==3177== LEAK SUMMARY:
==3177== definitely lost: 4,181 bytes in 19 blocks
==3177== indirectly lost: 12,821 bytes in 537 blocks
==3177== possibly lost: 41,171 bytes in 603 blocks
==3177== still reachable: 1,429,930 bytes in 16,809 blocks
==3177== suppressed: 0 bytes in 0 blocks


Why? Where?!
How I can disabled errors which concern QT or gcc problems?
Thanks,

stampede
25th February 2015, 11:42
You can use a feature called "suppression file" : link (https://wiki.wxwidgets.org/Valgrind_Suppression_File_Howto)
Attached a file I use when debugging Qt applications, I suppressed every Qt library, as well as various system libs (fontconfig, libx11, libgtk etc.). You may want to change the hardcoded paths to match your system if you want to us this file, though.


{
</usr/local/Qt-5.2.1/lib/libQt5Widgets.so.*_cond>
Memcheck:Cond
...
obj:/usr/local/Qt-5.2.1/lib/libQt5Widgets.so.*
...
}
{
</usr/local/Qt-5.2.1/lib/libQt5Widgets.so.*_leak>
Memcheck:Leak
...
obj:/usr/local/Qt-5.2.1/lib/libQt5Widgets.so.*
...
}
{
</usr/local/Qt-5.2.1/lib/libQt5Gui.so.*_cond>
Memcheck:Cond
...
obj:/usr/local/Qt-5.2.1/lib/libQt5Gui.so.*
...
}
{
</usr/local/Qt-5.2.1/lib/libQt5Gui.so.*_leak>
Memcheck:Leak
...
obj:/usr/local/Qt-5.2.1/lib/libQt5Gui.so.*
...
}
{
</usr/local/Qt-5.2.1/lib/libQt5Core.so.*_cond>
Memcheck:Cond
...
obj:/usr/local/Qt-5.2.1/lib/libQt5Core.so.*
...
}
{
</usr/local/Qt-5.2.1/lib/libQt5Core.so.*_leak>
Memcheck:Leak
...
obj:/usr/local/Qt-5.2.1/lib/libQt5Core.so.*
...
}
{
</usr/local/Qt-5.2.1/lib/libQt5Network.so.*_cond>
Memcheck:Cond
...
obj:/usr/local/Qt-5.2.1/lib/libQt5Network.so.*
...
}
{
</usr/local/Qt-5.2.1/lib/libQt5Network.so.*_leak>
Memcheck:Leak
...
obj:/usr/local/Qt-5.2.1/lib/libQt5Network.so.*
...
}
{
</usr/local/Qt-5.2.1/lib/libQt5Multimedia.so.*_cond>
Memcheck:Cond
...
obj:/usr/local/Qt-5.2.1/lib/libQt5Multimedia.so.*
...
}
{
</usr/local/Qt-5.2.1/lib/libQt5Multimedia.so.*_leak>
Memcheck:Leak
...
obj:/usr/local/Qt-5.2.1/lib/libQt5Multimedia.so.*
...
}
{
</usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.*_cond>
Memcheck:Cond
...
obj:/usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.*
...
}
{
</usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.*_leak>
Memcheck:Leak
...
obj:/usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.*
...
}
{
</usr/lib/x86_64-linux-gnu/libgobject-2.0.so.*_cond>
Memcheck:Cond
...
obj:/usr/lib/x86_64-linux-gnu/libgobject-2.0.so.*
...
}
{
</usr/lib/x86_64-linux-gnu/libgobject-2.0.so.*_leak>
Memcheck:Leak
...
obj:/usr/lib/x86_64-linux-gnu/libgobject-2.0.so.*
...
}
{
</lib/x86_64-linux-gnu/libexpat.so.*_cond>
Memcheck:Cond
...
obj:/lib/x86_64-linux-gnu/libexpat.so.*
...
}
{
</lib/x86_64-linux-gnu/libexpat.so.*_leak>
Memcheck:Leak
...
obj:/lib/x86_64-linux-gnu/libexpat.so.*
...
}
{
</usr/lib/x86_64-linux-gnu/libcairo.so.*_cond>
Memcheck:Cond
...
obj:/usr/lib/x86_64-linux-gnu/libcairo.so.*
...
}
{
</usr/lib/x86_64-linux-gnu/libcairo.so.*_leak>
Memcheck:Leak
...
obj:/usr/lib/x86_64-linux-gnu/libcairo.so.*
...
}
{
</usr/lib/x86_64-linux-gnu/libpangocairo-1.0.so.*_cond>
Memcheck:Cond
...
obj:/usr/lib/x86_64-linux-gnu/libpangocairo-1.0.so.*
...
}
{
</usr/lib/x86_64-linux-gnu/libpangocairo-1.0.so.*_leak>
Memcheck:Leak
...
obj:/usr/lib/x86_64-linux-gnu/libpangocairo-1.0.so.*
...
}
{
</usr/lib/x86_64-linux-gnu/libpangocairo-1.0.so.*_cond>
Memcheck:Cond
...
obj:/usr/lib/x86_64-linux-gnu/libpangocairo-1.0.so.*
...
}
{
</usr/lib/x86_64-linux-gnu/libpangocairo-1.0.so.*_leak>
Memcheck:Leak
...
obj:/usr/lib/x86_64-linux-gnu/libpangocairo-1.0.so.*
...
}
{
</usr/lib/x86_64-linux-gnu/libpangoft2-1.0.so.*_cond>
Memcheck:Cond
...
obj:/usr/lib/x86_64-linux-gnu/libpangoft2-1.0.so.*
...
}
{
</usr/lib/x86_64-linux-gnu/libpangoft2-1.0.so.*_leak>
Memcheck:Leak
...
obj:/usr/lib/x86_64-linux-gnu/libpangoft2-1.0.so.*
...
}
{
</usr/lib/x86_64-linux-gnu/libpango-1.0.so.*_cond>
Memcheck:Cond
...
obj:/usr/lib/x86_64-linux-gnu/libpango-1.0.so.*
...
}
{
</usr/lib/x86_64-linux-gnu/libpango-1.0.so.*_leak>
Memcheck:Leak
...
obj:/usr/lib/x86_64-linux-gnu/libpango-1.0.so.*
...
}
{
</lib/x86_64-linux-gnu/libglib-2.0.so.*_cond>
Memcheck:Cond
...
obj:/lib/x86_64-linux-gnu/libglib-2.0.so.*
...
}
{
</lib/x86_64-linux-gnu/libglib-2.0.so.*_leak>
Memcheck:Leak
...
obj:/lib/x86_64-linux-gnu/libglib-2.0.so.*
...
}
{
</usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.*_cond>
Memcheck:Cond
...
obj:/usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.*
...
}
{
</usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.*_leak>
Memcheck:Leak
...
obj:/usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.*
...
}
{
</usr/lib/x86_64-linux-gnu/libgdk-x11-2.0.so.*_cond>
Memcheck:Cond
...
obj:/usr/lib/x86_64-linux-gnu/libgdk-x11-2.0.so.*
...
}
{
</usr/lib/x86_64-linux-gnu/libgdk-x11-2.0.so.*_leak>
Memcheck:Leak
...
obj:/usr/lib/x86_64-linux-gnu/libgdk-x11-2.0.so.*
...
}
{
</usr/lib/x86_64-linux-gnu/libX11.so.*_cond>
Memcheck:Cond
...
obj:/usr/lib/x86_64-linux-gnu/libX11.so.*
...
}
{
</usr/lib/x86_64-linux-gnu/libX11.so.*_leak>
Memcheck:Leak
...
obj:/usr/lib/x86_64-linux-gnu/libX11.so.*
...
}
{
</usr/lib/nvidia-331/libGL.so.*_cond>
Memcheck:Cond
...
obj:/usr/lib/nvidia-331/libGL.so.*
...
}
{
</usr/lib/nvidia-331/libGL.so.*_leak>
Memcheck:Leak
...
obj:/usr/lib/nvidia-331/libGL.so.*
...
}
{
</usr/lib/x86_64-linux-gnu/libfontconfig.so.*_cond>
Memcheck:Cond
...
obj:/usr/lib/x86_64-linux-gnu/libfontconfig.so.*
...
}
{
</usr/lib/x86_64-linux-gnu/libfontconfig.so.*_leak>
Memcheck:Leak
...
obj:/usr/lib/x86_64-linux-gnu/libfontconfig.so.*
...
}
{
</usr/lib/x86_64-linux-gnu/libibus-1.0.so.*_cond>
Memcheck:Cond
...
obj:/usr/lib/x86_64-linux-gnu/libibus-1.0.so.*
...
}
{
</usr/lib/x86_64-linux-gnu/libibus-1.0.so.*_leak>
Memcheck:Leak
...
obj:/usr/lib/x86_64-linux-gnu/libibus-1.0.so.*
...
}
{
</usr/lib/x86_64-linux-gnu/libfreetype.so.*_cond>
Memcheck:Cond
...
obj:/usr/lib/x86_64-linux-gnu/libfreetype.so.*
...
}
{
</usr/lib/x86_64-linux-gnu/libfreetype.so.*_leak>
Memcheck:Leak
...
obj:/usr/lib/x86_64-linux-gnu/libfreetype.so.*
...
}
{
</lib/x86_64-linux-gnu/ld-2.19.so_cond>
Memcheck:Cond
...
obj:/lib/x86_64-linux-gnu/ld-2.19.so
...
}
{
</lib/x86_64-linux-gnu/ld-2.19.so_leak>
Memcheck:Leak
...
obj:/lib/x86_64-linux-gnu/ld-2.19.so
...
}

atomic
25th February 2015, 17:53
Thanks,
I used your file, and it solved all of my problems with valgrind but I have one more question - now on console output i get

==11418== 48 bytes in 1 blocks are still reachable in loss record 6,912 of 14,131
==11418== at 0x4C2B0E0: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==11418== by 0x4153B4: Ui_MainWindow::setupUi(QMainWindow*) (ui_mainwindow.h:622)
==11418== by 0x408BD3: MainWindow::MainWindow(QWidget*) (mainwindow.cpp:9)
==11418== by 0x408867: main (main.cpp:22)
==11418==
==11418== 48 bytes in 1 blocks are still reachable in loss record 6,913 of 14,131
==11418== at 0x4C2B0E0: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==11418== by 0x4153F9: Ui_MainWindow::setupUi(QMainWindow*) (ui_mainwindow.h:624)
==11418== by 0x408BD3: MainWindow::MainWindow(QWidget*) (mainwindow.cpp:9)
==11418== by 0x408867: main (main.cpp:22)
==11418==
==11418== 48 bytes in 1 blocks are still reachable in loss record 6,914 of 14,131
==11418== at 0x4C2B0E0: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==11418== by 0x415454: Ui_MainWindow::setupUi(QMainWindow*) (ui_mainwindow.h:627)
==11418== by 0x408BD3: MainWindow::MainWindow(QWidget*) (mainwindow.cpp:9)
==11418== by 0x408867: main (main.cpp:22)
==11418==
==11418== 48 bytes in 1 blocks are still reachable in loss record 6,966 of 14,131
==11418== at 0x4C2B0E0: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==11418== by 0x408C6B: MainWindow::MainWindow(QWidget*) (mainwindow.cpp:23)
==11418== by 0x408867: main (main.cpp:22)


Should I be worried?

Summary looks good

==11418== LEAK SUMMARY:
==11418== definitely lost: 0 bytes in 0 blocks
==11418== indirectly lost: 0 bytes in 0 blocks
==11418== possibly lost: 0 bytes in 0 blocks
==11418== still reachable: 6,112 bytes in 114 blocks
==11418== suppressed: 12,570,128 bytes in 30,005 blocks
==11418==
==11418== For counts of detected and suppressed errors, rerun with: -v
==11418== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 828 from 828)

stampede
25th February 2015, 22:01
I used your file, and it solved all of my problems with valgrind
Great, glad I could help ;)

Should I be worried?
I don't know. "Still reachable" simply means that you still (after the main() returns) have a valid but not released pointer to a memory block, maybe you forgot to delete the ui object of the main form ? This shouldn't be a problem, as the memory allocated by the app is automatically released after the program exit. Maybe you have something like this:


int main(int argc, char ** argv){
QApplication app(argc,argv);
MyWidget * widget = new MyWidget;
widget->show();
return app.exec();
}

here the memory pointed to by the "widget" pointer will be considered as "still reachable", but as you can see it's not a very harmful "leak".

atomic
25th February 2015, 23:31
No, no ;) In main function everything is ok and I do not forgot delete ui form ;)

These errors are displayed only when I set inside Qt Creator Tool->Options->Analyzer "Show reachable and indirectly lost blocks".

10965

And only when I use this code



QDesktopServices::openUrl( QUrl( "/home" ));

stampede
25th February 2015, 23:54
And only when I use this code
I wouldn't be worried about it then.