2010-07-04 6 views
40

Oder vorzugsweise alle von ihnen anstatt nur meinen Code? Mein Programm verwendet Gtk, Loudmouth und einige andere Dinge, und diese beiden (und einige dahinter, libgcrypto, libssl) verursachen selbst so viele Fehler, dass ich meine eigenen nicht finden kann. Ist es möglich, dass Valgrind Dinge ignoriert, die tiefer sind als mein eigener Code?Kann Valgrind bestimmte Bibliotheken ignorieren?

+1

+1, ich habe die gleichen Probleme. NVIDIAs GL-Bibliothek führt bedingte Sprünge basierend auf nicht initialisiertem Speicher durch, und "std :: string" wirft weiterhin falsche Positive ("möglicherweise verloren"). – Thomas

Antwort

12

Sie können Unterdrückungen für die Fehler für die Bibliotheken erzeugen, aber ich glaube nicht, dass Sie die Bibliotheken generell ausschließen können.

Es ist auch schwierig, automatisch zu erkennen, ob ein Speicherfehler in der Bibliothek durch ein Problem in Ihrem Code verursacht wird oder nicht.

+4

http: // Valgrind.org/docs/manual/manual-core.html # manual-core.suppress Dies ist der Link für Informationen zur Fehlerunterdrückung für Valgrind. – blwy10

5

Mit OpenSSL insbesondere ist dies sehr schwierig. SSL-Verschlüsselungsschlüssel basieren teilweise auf nicht initialisiertem Stapelmüll, was bedeutet, dass auch alle entschlüsselten Daten kontaminiert sind. Diese Kontamination tendiert dazu, sich über OpenSSL hinaus zu verbreiten.

Das Kompilieren von OpenSSL mit einer "PURIFY" -Option kann hier helfen. Leider wird dies aufgrund einiger schlecht durchdachter Aktionen einer großen Linux-Distribution wahrscheinlich nicht zum Standard werden.

Eine sehr stumpfe Problemumgehung ist die Option --undef-value-errors=no von mecheck.

{ 
    ignore_libcrypto_conditional_jump_errors 
    Memcheck:Leak 
    ... 
    obj:*/libcrypto.so.* 
} 

... in eine Datei und Pass:

+1

Schön. Das Ignorieren von Undef-Werten führte zu meinem speziellen Fall, bei dem ich "Mehr als 10000000 Gesamtfehler erkannt" aus einer Bibliothek (nicht OpenSSL) hatte, analysiere den Rest des Codes. –

28

Angenommen, Sie führen das memcheck Werkzeug und möchten Sie Leak Fehler in libcrypto nur ignorieren, könnten Sie eine Unterdrückung wie setzen es zu valgrind mit --suppressions=*FILENAME*.

Um Leak Fehler in alle gemeinsam genutzten Bibliotheken unter jedem lib Verzeichnis (/lib, /lib64, /usr/lib, /usr/lib64, zu ignorieren ...):

{ 
    ignore_unversioned_libs 
    Memcheck:Leak 
    ... 
    obj:*/lib*/lib*.so 
} 
{ 
    ignore_versioned_libs 
    Memcheck:Leak 
    ... 
    obj:*/lib*/lib*.so.* 
} 

Es ist unwahrscheinlich, aber Sie können zusätzliche Variationen des Verzeichnisses Muster hinzufügen müssen für die Standorte des X11 zu berücksichtigen und GTK-Bibliotheken.

Beachten Sie, dass dadurch Fehler ignoriert werden, die durch von Ihnen geschriebene Rückrufe verursacht wurden, die von den Bibliotheken aufgerufen wurden. Fangen Fehler in diesen Rückrufe könnte fast mit getan werden:

{ 
    ignore_unversioned_libs 
    Memcheck:Leak 
    obj:*/lib*/lib*.so 
    ... 
    obj:*/lib*/lib*.so 
} 
{ 
    ignore_versioned_libs 
    Memcheck:Leak 
    obj:*/lib*/lib*.so.* 
    ... 
    obj:*/lib*/lib*.so.* 
} 

... aber dies deckt Fehler in Anrufe durch eine Bibliothek, die das Valgrind malloc verwenden. Da valgrind malloc direkt in den Programmtext eingefügt wird - nicht als dynamische Bibliothek geladen - erscheint es im Stapel genauso wie Ihr eigener Code. Dies ermöglicht es Valgrind, die Zuordnungen zu verfolgen, macht es aber auch schwieriger, genau das zu tun, was Sie gefragt haben.

FYI: Ich benutze Valgrind 3.5.

+7

Die einzige Sache, die mit dieser Antwort fehlt, ist, was mit den Unterdrückungstexten zu tun ist ... – lvella

+7

Diese Einstellungen sollen in Unterdrückungsakten gespeichert werden, die gelesen werden, wenn Valgrind startet. Option --suppressions = Siehe http://valgrind.org/docs/manual/manual-core.html –

+0

@mormegil hat versehentlich die Antwort abgelehnt. Es tut uns leid – Greg