2017-05-30 17 views
-3

Wenn der Speicher mein Programm debuggen Valgrind aus den üblichen Gründen mit I durch die folgenden Fehler empfangen bin (es gibt eine Menge von ihnen sind):Sonderbare valgrind Fehler

==9895== Invalid read of size 4 
==9895== at 0x10D6C1: Shell (vshell.c:903) 
==9895== by 0x113608: exec_wrap (vib.c:111) 
==9895== by 0x111E8A: sm_thread (vproc.c:123) 
==9895== by 0x1107EC: tstart (vsched.c:130) 
==9895== by 0x55B3A8F: ??? (in /lib/x86_64-linux-gnu/libc-2.24.so) 
==9895== Address 0x5973e90 is 134,800 bytes inside a block of size 135,168 alloc'd 
==9895== at 0x4C300B6: memalign (vg_replace_malloc.c:858) 
==9895== by 0x1106D0: alloc_thread (vsched.c:95) 
==9895== by 0x110825: sthread (vsched.c:144) 
==9895== by 0x112030: Exec (mproc.c:183) 
==9895== by 0x1137D9: Execute (vlib.c:166) 
==9895== by 0x10D9A5: bshell (shell.c:965) 
==9895== by 0x111E8A: smain_thread (mproc.c:123) 
==9895== by 0x1107EC: tstart (vsched.c:130) 
==9895== by 0x55B3A8F: ??? (in /lib/x86_64-linux-gnu/libc-2.24.so) 

die üblichen Orte Probing (zB hier, Valgrind ' (Handbuch und Google) gab keinen Aufschluss darüber, warum dies passieren könnte. Soweit ich aus den Fehlermeldungen verstehe, ist der zugewiesene Block größer als der, auf den sich die Adresse bezieht, so verstehe ich das "beschweren" nicht. Wie ich anfangs sagte, gibt es viele Nachrichten genau wie diese, aber in verschiedenen Teilen des Codes - dies ist nur ein indikativer Fehler. Insbesondere, wenn das Programm beendet wird, gibt es keine tatsächlichen Lecks, wie Valgrind - nur diese Fehler. Kann jemand einen Einblick geben, warum dies geschieht?

+2

"Ungültiger Lesewert von Größe 4" bedeutet, dass Sie versuchen, einen 32-Bit-Wert zu lesen, für den Sie keinen Speicher reserviert haben. Bei einem 32-Bit-System könnte es sich um einen Zeiger handeln, andernfalls könnte es sein, dass Sie einen nicht initialisierten Zeiger dereferenzieren, um ein "int" zu lesen. Oder etwas ähnliches. Durchkämmen Sie Ihren Code, um nach nicht initialisierten lokalen Variablen zu suchen. Bauen Sie auch mit vielen Warnungen aktiviert und beheben Sie alle Warnungen, die Sie erhalten. –

+0

Es sieht so aus, als ob Sie aus dem Speicher lesen, in den Sie nie geschrieben haben, und Sie lesen einen 4-Byte-Wert aus einer ungeraden Speicheradresse. –

+0

Was ist in dieser Quellzeile? Können Sie versuchen, den gdb-Server zu verwenden? –

Antwort

0

Address 0x5973e90 is 134,800 bytes inside a block of size 135,168 alloc'd Offensichtlich Sie Zuweisung weniger Speicher auf Adresse benötigt als 0x5973e90 Es gibt fast keine Möglichkeit, mit Ihrem Programm zu helfen, wenn Sie keinen Code überhaupt zur Verfügung gestellt haben. Überprüfen Sie Ihre Zuordnung, wenn die Größe der gewünschten entspricht.

+0

Ich denke, Sie sind darin falsch; von 'Valgrind's Dokumentation und Antworten, die von SO wie [this] (https://stackoverflow.com/questions/7662008/valgrind-giving-error-but-everything-seems-fine) oder in Valgrinds Foren [this] verwandt sind (https://sourceforge.net/p/valgrind/mailman/message/23179379/) beide sagen, dass der zugewiesene Block eine Größe hat, die durch den richtigen Wert angezeigt wird, in meinem Fall 135,168, während die andere Blockgröße durch den linken Wert angezeigt wird, was hier 134.800 ist - also ist es * weniger *. Darüber hinaus ist der angegebene Lesefehler nicht * vor * oder * nach *, was zu Unter- oder Überlauf führen würde. Wie auch immer, danke. – jtimz