Beispiel Programm, um die malloc-Fehler konsolidieren
Ich testen wollen, die mcheck-Funktionalität auf meinem PC zuerst zu erkennen, die malloc konsolidieren Fehler.
Ich habe auf diese Weise werden Sie sicher, dass dies helfen wird, herauszufinden, einen ähnlichen Absturz auf embedded-linux-box. Leider, der Absturz dauert mindestens 3-4 Tage. So, ich bin auf der Suche nach einem sample-Programm, das zu erzeugen, der eine ähnliche Art von Absturz, wie unten gezeigt.
Program terminated with signal 6, Aborted.
#0 0x2c73ebb8 in __syscall_kill (pid=900, sig=6) at kill.c:15
15 static inline _syscall2(int, __syscall_kill, __kernel_pid_t, pid,
int, sig);
Current language: auto; currently c
#0 0x2c73ebb8 in __syscall_kill (pid=900, sig=6) at kill.c:15
__res = 716485696
__err = 16
#1 0x2c73eb5c in kill (pid=900, sig=6) at kill.c:19
No locals.
#2 0x2aafb2e0 in pthread_kill (thread=900, signo=6) at signals.c:73
handle = (pthread_handle) 0x2ab3f2e0
pid = 900
#3 0x2aafbbb8 in raise (sig=6) at signals.c:241
retcode = 6
#4 0x2c730a5c in abort () at abort.c:94
sigset = {__val = {32, 0 <repeats 31 times>}}
#5 0x2c738054 in __malloc_consolidate (av=0x2c798860) at free.c:227
fb = (mfastbinptr *) 0x2c798864
maxfb = (mfastbinptr *) 0x2c798880
p = (mchunkptr) 0x2c798894
nextp = (mchunkptr) 0x4a2b2948
unsorted_bin = (mchunkptr) 0x2c798894
first_unsorted = (mchunkptr) 0x4a22f7e0
nextchunk = (mchunkptr) 0x2c798894
size = 0
nextsize = 0
prevsize = 0
nextinuse = 1
bck = (mchunkptr) 0x4a2b2948
fwd = (mchunkptr) 0x4a2b2948
#6 0x2c735ff0 in __malloc_inner (bytes=300) at malloc.c:912
av = (mstate) 0x2c798860
nb = 304
idx = 32
bin = (mbinptr) 0x2ac0dab4
fb = (mfastbinptr *) 0x2ae11e50
victim = (mchunkptr) 0x2ac0d9a4
size = 719396432
victim_index = 718311332
remainder = (mchunkptr) 0x49759b58
remainder_size = 40000
block = 719396432
bit = 718500504
map = 719396432
fwd = (mchunkptr) 0x1
bck = (mchunkptr) 0x4a2164ac
sysmem = (void *) 0x4975c9ac
#7 0x2c736c18 in malloc (bytes=300) at malloc.c:1172
- Nicht bekommen Sie eine Meldung, die den Fehler beschreibt im detail zusammen mit diesem?
- Ich habe aktualisiert die gesamte Meldung hier.
- Möchte nur hinzufügen ein detail, ich bin mit uclibc auf meinem Linux-embedded-box.
- Sind Sie mit einem normalen Linux-kernel mit MMU aktiviert, oder die no-mmu/uclinux-Sorte, die nicht dynamisch zuordnen Speicher?
- Es ist ein normales Linux mit MMU aktiviert.
- Da ich noch nie verwendet uclibc, nach meiner glibc memory/free-debug-Erfahrung, Sie sollten zuerst suchen Sie den Fehlercode, um zu sehen, was genau den Fehler verursacht hat. Bis Sie bekommen, was der Grund ist, Sie bekommen die chance, um den setup-test case.
- nicht sagen, dass der Versuch der Zuweisung 304 bytes, wenn es nur 300 zur Verfügung??
#6 0x2c735ff0 in __malloc_inner (bytes=300) at malloc.c:912 av = (mstate) 0x2c798860 nb = 304 idx = 32
- Ja, sieht aus wie mein Programm hat ausgewichen wird mit der malloc-management-Felder.
- Ich finde es NICHT zu glauben, dass malloc einen Fehler aufweist. Wie einige vorgeschlagen haben, ist Ihr code möglicherweise schädlich sein malloc Kette von kostenlosen Speicher. Oder, am wahrscheinlichsten, Sie sind das mischen von Versionen von malloc und free. Das ist, malloc ist vom liba version1.0 und frei ist von libb version 2.0??
InformationsquelleAutor dexterous_stranger | 2013-09-12
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das ist, weil Ihr Programm zerstört die Daten-Struktur von der Speicherverwaltung verwendet, die durch libc malloc/free. malloc/free hat seine eigenen Daten Einwohner in user program Speicherplatz auf der Spur zu bleiben, die Liste der zugewiesenen/freigegebenen Platz in verschiedenen chunk-Größe. Irgendwie, vielleicht hat dein Programm hat Pufferüberlauf oder unsichere random access modifiziert, dass die Daten oder Zeiger der Speicher-management. Und zu der Zeit Punkt Ihres Programms aufrufen von malloc/free, verwendet er eine falsche Adresse und bewirken, dass der segfault oder Abbrechen.
Läuft valgrind ist extrem langsam. Vielleicht können Sie versuchen, setenv MALLOC_CHECK_ auf 1 und führen Sie das Programm, um zu sehen, eine Diagnose-Nachricht den ersten.
Ist es das, was Sie fordern?
Beispiel, wenn Sie erstellen ein Haufen mit dem Namen *txt mit Größe 100 char.
Dann durch Fehler reasign kleinere variable, die Zeiger:
Dann zuweisen wollen, einen normalen text in der fehlerhaften heap;
Könnte sein, dass Sie brauchen, um eine Ablaufverfolgung der Variablen (pointer), und überprüfen Sie jede Neuzuweisung.