2009-10-20 5 views
16

Ich versuche, eine große Anwendung Build mit Qt/C++ zu debuggen und Valgrind meldet eine Menge Speicherverlust von internen Qt-Zeug. Könnte jemand eine geeignete Valgrind-Unterdrückungsdatei für Qt-Apps teilen?Verwendet jemand valgrind und Qt?

Danke!

Eg.

#include <qobject.h> 
int main() 
{ 
    QObject o; 
    return 0; 
} 

kehrt:

 
$ valgrind --leak-check=full --show-reachable=yes ./leak 
==12655== Memcheck, a memory error detector 
==12655== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al. 
==12655== Using Valgrind-3.5.0-Debian and LibVEX; rerun with -h for copyright info 
==12655== Command: ./leak 
==12655== 
==12655== 
==12655== HEAP SUMMARY: 
==12655==  in use at exit: 744 bytes in 7 blocks 
==12655== total heap usage: 28 allocs, 21 frees, 1,640 bytes allocated 
==12655== 
==12655== 16 bytes in 1 blocks are still reachable in loss record 1 of 7 
==12655== at 0x4C229C7: operator new(unsigned long) (vg_replace_malloc.c:220) 
==12655== by 0x6203124: QThreadData::current() (in /usr/lib/libQtCore.so.4.5.2) 
==12655== by 0x62FC4BC: QObject::QObject(QObject*) (in /usr/lib/libQtCore.so.4.5.2) 
==12655== by 0x4008D2: main (in /tmp/Qt/bin/leak) 
==12655== 
==12655== 96 bytes in 1 blocks are still reachable in loss record 2 of 7 
==12655== at 0x4C229C7: operator new(unsigned long) (vg_replace_malloc.c:220) 
==12655== by 0x62030FC: QThreadData::current() (in /usr/lib/libQtCore.so.4.5.2) 
==12655== by 0x62FC4BC: QObject::QObject(QObject*) (in /usr/lib/libQtCore.so.4.5.2) 
==12655== by 0x4008D2: main (in /tmp/Qt/bin/leak) 
==12655== 
==12655== 96 bytes in 1 blocks are still reachable in loss record 3 of 7 
==12655== at 0x4C229C7: operator new(unsigned long) (vg_replace_malloc.c:220) 
==12655== by 0x62041CD: QWaitCondition::QWaitCondition() (in /usr/lib/libQtCore.so.4.5.2) 
==12655== by 0x6200EAF: ??? (in /usr/lib/libQtCore.so.4.5.2) 
==12655== by 0x62010A0: ??? (in /usr/lib/libQtCore.so.4.5.2) 
==12655== by 0x6203132: QThreadData::current() (in /usr/lib/libQtCore.so.4.5.2) 
==12655== by 0x62FC4BC: QObject::QObject(QObject*) (in /usr/lib/libQtCore.so.4.5.2) 
==12655== by 0x4008D2: main (in /tmp/Qt/bin/leak) 
==12655== 
==12655== 120 bytes in 1 blocks are still reachable in loss record 4 of 7 
==12655== at 0x4C229C7: operator new(unsigned long) (vg_replace_malloc.c:220) 
==12655== by 0x61FE681: QMutex::QMutex(QMutex::RecursionMode) (in /usr/lib/libQtCore.so.4.5.2) 
==12655== by 0x6200DC8: QThreadData::QThreadData(int) (in /usr/lib/libQtCore.so.4.5.2) 
==12655== by 0x620310C: QThreadData::current() (in /usr/lib/libQtCore.so.4.5.2) 
==12655== by 0x62FC4BC: QObject::QObject(QObject*) (in /usr/lib/libQtCore.so.4.5.2) 
==12655== by 0x4008D2: main (in /tmp/Qt/bin/leak) 
==12655== 
==12655== 120 bytes in 1 blocks are still reachable in loss record 5 of 7 
==12655== at 0x4C229C7: operator new(unsigned long) (vg_replace_malloc.c:220) 
==12655== by 0x61FE681: QMutex::QMutex(QMutex::RecursionMode) (in /usr/lib/libQtCore.so.4.5.2) 
==12655== by 0x6200DE9: QThreadData::QThreadData(int) (in /usr/lib/libQtCore.so.4.5.2) 
==12655== by 0x620310C: QThreadData::current() (in /usr/lib/libQtCore.so.4.5.2) 
==12655== by 0x62FC4BC: QObject::QObject(QObject*) (in /usr/lib/libQtCore.so.4.5.2) 
==12655== by 0x4008D2: main (in /tmp/Qt/bin/leak) 
==12655== 
==12655== 120 bytes in 1 blocks are still reachable in loss record 6 of 7 
==12655== at 0x4C229C7: operator new(unsigned long) (vg_replace_malloc.c:220) 
==12655== by 0x61FE681: QMutex::QMutex(QMutex::RecursionMode) (in /usr/lib/libQtCore.so.4.5.2) 
==12655== by 0x6200E77: ??? (in /usr/lib/libQtCore.so.4.5.2) 
==12655== by 0x62010A0: ??? (in /usr/lib/libQtCore.so.4.5.2) 
==12655== by 0x6203132: QThreadData::current() (in /usr/lib/libQtCore.so.4.5.2) 
==12655== by 0x62FC4BC: QObject::QObject(QObject*) (in /usr/lib/libQtCore.so.4.5.2) 
==12655== by 0x4008D2: main (in /tmp/Qt/bin/leak) 
==12655== 
==12655== 176 bytes in 1 blocks are still reachable in loss record 7 of 7 
==12655== at 0x4C229C7: operator new(unsigned long) (vg_replace_malloc.c:220) 
==12655== by 0x6201092: ??? (in /usr/lib/libQtCore.so.4.5.2) 
==12655== by 0x6203132: QThreadData::current() (in /usr/lib/libQtCore.so.4.5.2) 
==12655== by 0x62FC4BC: QObject::QObject(QObject*) (in /usr/lib/libQtCore.so.4.5.2) 
==12655== by 0x4008D2: main (in /tmp/Qt/bin/leak) 
==12655== 
==12655== LEAK SUMMARY: 
==12655== definitely lost: 0 bytes in 0 blocks 
==12655== indirectly lost: 0 bytes in 0 blocks 
==12655==  possibly lost: 0 bytes in 0 blocks 
==12655== still reachable: 744 bytes in 7 blocks 
==12655==   suppressed: 0 bytes in 0 blocks 
==12655== 
==12655== For counts of detected and suppressed errors, rerun with: -v 
==12655== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 8 from 8) 

Antwort

5

--show-erreichbar zeigt Speicher, der nicht wirklich geleakt hat, obwohl Valgrind es einen Verlust Datensatz nennt. Ihre Testanwendung verliert keinen Speicher.

Sie benötigen für diesen speziellen Fall keine Valgrind-Unterdrückung. Für andere vielleicht, aber Sie sollten die Option --gen-suppressions von Valgrind verwenden, um diese Unterdrückungen für Sie zu generieren.

1

Die oben valgrind Protokoll meldet 0 Lecks, das heißt, es sind keine Fehler.

3
still reachable: 744 bytes in 7 blocks 

Wenn Sie QObject o freigeben? Haben Sie immer noch das gleiche Ergebnis?

Update: Nur zur Verdeutlichung wird dieser Speicher vom Betriebssystem freigegeben, wenn Sie die Anwendung schließen (so ist es kein Leck).

Allerdings ist es immer gut, einen Destruktor zu schreiben, der den Speicher freigibt, und es ist immer schön zu wissen, dass Sie die Kontrolle darüber haben, was zugewiesen und freigegeben ist. (damit Sie nicht mit echten Speicherlecks enden ...)

+0

Fühlen Sie sich frei zu kommentieren, wenn Sie downvote .... Ich sehe kein Problem damit, dass Benutzer den Speicher freigeben sollten sie (auch wenn es unter einem großen Stück qt versteckt ist) – Johan

+0

+ 1'd :) : Ich habe das persönlich als wertvolle Information empfunden. – zeboidlund