2010-11-11 1 views
5

Ich habe angefangen valgrind verwenden nur zu lernen, verwenden und die --tool = memcheckWie valgrind effektiv

Aber was ich mit, um die Probleme tatsächlich zu finden, Probleme haben.

z.B.

Ein solches Problem ist das.

==12561== Conditional jump or move depends on uninitialised value(s) 
==12561== at 0x425779: Server::HandleReceiveFrom(boost::system::error_code const&, unsigned long) (mUUID.h:63) 
==12561== by 0x428EC4: boost::asio::detail::reactive_socket_recvfrom_op<boost::asio::mutable_buffers_1, boost::asio::ip::basic_endpoint<boost::asio::ip::udp>, boost::_bi::bind_t<void, boost::_mfi::mf2<void, Server, boost::system::error_code const&, unsigned long>, boost::_bi::list3<boost::_bi::value<Server*>, boost::arg<1> (*)(), boost::arg<2> (*)()> > >::do_complete(boost::asio::detail::task_io_service*, boost::asio::detail::task_io_service_operation*, boost::system::error_code, unsigned long) (mem_fn_template.hpp:280) 
==12561== by 0x42E589: boost::asio::detail::task_io_service::run(boost::system::error_code&) (task_io_service_operation.hpp:35) 
==12561== by 0x42720C: Server::Run() (io_service.ipp:57) 
==12561== by 0x42FB00: main (obbs.cpp:198) 

und eine andere ist dies

== Use of uninitialised value of size 8 
==12561== at 0x5E56091: _itoa_word (_itoa.c:196) 
==12561== by 0x5E573D8: vfprintf (vfprintf.c:1613) 
==12561== by 0x5F0EA6F: __vsnprintf_chk (vsnprintf_chk.c:65) 

ich nach einigen Hinweisen bin, wie man am effektivsten diese Art von Problemen zu verfolgen. (Bedingte Sprünge und uninitialised Werte.)

EDIT

Ist das etwas zu befürchten? Scheint mit der Option --run-libc-freeres=no verschwinden. Bedeutet das, ich habe eine fehlerhafte C-Bibliothek?

==14754== Invalid free()/delete/delete[] 
==14754== at 0x4C27D71: free (vg_replace_malloc.c:366) 
==14754== by 0x5F43A0A: free_mem (in /lib/libc-2.12.1.so) 
==14754== by 0x5F435A1: __libc_freeres (in /lib/libc-2.12.1.so) 
==14754== by 0x4A2366B: _vgnU_freeres (vg_preloaded.c:62) 
==14754== by 0x5E4A4A4: exit (exit.c:93) 
==14754== by 0x5E2FD94: (below main) (libc-start.c:258) 
==14754== Address 0x4046bb8 is not stack'd, malloc'd or (recently) free'd 
+0

+1 ein sehr wichtiges Tool, das Sie verwenden können –

+0

Nicht initialisierte Werte werden in Valgrinds QuickStart http://valgrind.org/docs/manual erklärt /QuickStart.html (ungefähr 12 Absätze insgesamt, weniger über nicht initialisierte Werte.) – isomorphismes

Antwort

15

Grundsätzlich zeigt jeder Valgrind-Fehler einen Stack-Trace an. Die höheren Teile des Stack-Trace sind möglicherweise für Sie nicht sehr nützlich, da sie sich auf den Bibliothekscode beziehen. Letztendlich sind diese Probleme jedoch auf Probleme in Ihrem Code zurückzuführen. Beginnen Sie damit, nach dem ersten Teil des Stack-Trace zu suchen, der sich auf eine Codezeile in Ihrer Anwendung bezieht (im Gegensatz zu einer Bibliotheksfunktion). Wenn Sie den Stack-Trace untersuchen, sehen Sie, dass Zeile 198 von obbs.cpp der Punkt in ist Ihre Anwendung führt zur Ursache Ihres ersten Problems. Weiter oben im Stapel können Sie sehen, dass die Zeile 63 von mUUID.h letztendlich der Punkt ist, an dem die nicht initialisierte Variable entweder über eine if-Anweisung oder eine Schleife ausgewertet wird.

Der Fehler "Conditional jump or move depends on uninitialised value(s)" bedeutet, dass Sie eine nicht initialisierte Variable haben, die verwendet wird, um den Fluss Ihres Programms zu beeinflussen. In Ihrem Fall sieht es so aus, als würden Sie eine nicht initialisierte Variable an eine Boost-Bibliotheksfunktion übergeben, und die Bibliotheksfunktion ruft Ihre Handler-Klasse auf, die die nicht initialisierte Variable in einer bedingten Anweisung auswertet. Das bedeutet, dass Ihr Programm undefiniertes Verhalten aufweist.

Ein triviales Beispiel, das dieses Problem wie wäre etwas bewirken würde:

int i; // uninitialized value 
if (i == 10) { /* ... do something */ } 

starten indem Sie Linie 198 von obbs.cpp und bewegen Sie den Stack-Trace, bis Sie das Problem erkennen.

Ich werde auch hinzufügen, dass Fehler wie diese manchmal vom Compiler abgefangen werden können, wenn Sie mit allen Warnungen kompilieren. (Stellen Sie in GCC beispielsweise sicher, dass Sie mit dem Flag "-Wall" kompilieren.)

+1

Danke für den Hinweis. Ist Valgrind manchmal falsch? Es gibt keine nicht initialisierten Variablen, die ich sehen kann. Was ist mit späte Initialisierung? – Matt

+3

Valgrind meldet fast nie falsch positive Ergebnisse. –

+0

Versuchen Sie, den Stack-Trace weiter oben zu suchen, zum Beispiel in Zeile 63 von 'mUUID.h', wo Ihr Callback-Handler aufgerufen wird. Sind alle Mitgliedsvariablen Ihrer Handler-Klasse initialisiert? –