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?
"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. –
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. –
Was ist in dieser Quellzeile? Können Sie versuchen, den gdb-Server zu verwenden? –