Banzai!

Imam linked listo (dvosmerno) pointerjev na neko strukturo. Ta struktura je
dolga 16 bytov. (4x integer)

Ko dodam element na listo mu rezerviram plac v ramu (malloc()), se prej pa
rezerviram plac za strukturo. In vse lepo dela.

Dodajam in briseme elemente. memprof pri polurnem preganjanju tele liste in
po ene 10000 malloc() in free() klicev ni nasel memory leaka.... Torej
predvidevam, da lista deluje normalno (Kasneje je to potrdil se zunanji vir,
ki je listo testiral na drug nacin... :))

Sedaj se pa odlocim, da mi ta struktura ni vec vsec. In da je malo predolga.
Zato jo skrajsam za en integer. Tako je cela zadeva dolga 12 bytov. No in
sedaj se spet zacnem malo igrati z dodajanjem/brisanjem elementov na listi
in mnja... zadeva zacne srat... (core dump).

Po kakih dvanajstih urah debugiranja in gledanja v kodo sem nasel bug in ga
tocno lociral. Ni mi pa tudi priblizno ne jasno zakaj pride do tega in kako
naj se temu izognem.

Takole je bilo:

Ko sem program pognal in je tekel nekaj casa (milisekund) je bil alociran
tale del pomnilnika:

element   |  struktura
----------+------------ 
0x8550B0  |  0x8550F0


S to strukturo sem potem nekaj casa delal (spreminjal vrednosti tistih treh
integerjev) Vmes sem dodajal nove elemente na listo in potem na neki tocki
najprej z free() 'odpisal' ram, ki ga je potrebovala struktura in takoj
zatem se sam element. (Seveda je bila prej linked lista popravljna, da
sosednji elementi niso kazali na nekaj kar ne obstaja.

Potem je prislo do tega, da se je ponovno ustvaril nek element in sedaj je
bila alokacija pomnilnika takale:

element   |  struktura
----------+------------ 
0x8550F0  |  0x8554D0

Ta novi element je dobil isti naslov, kot ga je prej imela struktura. Aja,
to dodeljevanje se ni dogajalo takoj en za drugim ampak je vmes se nekaj
elementov priletelo na druge naslove, prav tako strukture. In tudi kak
element se je sprostil (seveda tudi struktura).

Ko je prisel ta 'novi' element na vrsto, da ga pobrisem, sem najprej freejal
strukturo, kjer se ni bilo tezav, potem sem pa naredil se free() za element
in je celo zadevo odneslo. Pravzaprav ne takoj, program je tekel se naprej
ampak se mu je strgalo pri naslenjih dostopih na linked listo.

Kot zanimivost naj se povem, da man malloc() pravi, da se ob free()janju
enega in istega naslova v pomnilniku znajo dogajat cudne stvari. A tudi, ce
ga vmes z malloc() znova alociras? Man tudi pravi, da je tukaj se
MALLOC_CHECK_ env variable, ki jo das na 0 in take zadeve ignorira. In to se
tudi res zgodi. Tako program dela naprej in se ne obesa. Vsaj po nekaj
sekundah se ne, kaj se zgodi cez nekaj casa, nevem.

Potem pa se brainstorming malloc() vedno alocira 16 bytov v spominu tako da
si elementi sledijo takole:

0x855010
0x855020
...
0x855050
0x855060

Prav tako strukture. Moje pojasnilo samemu sebi zakaj je zadeva delala, ko
se imel strukturo dolgo 16 bytov je to, da je pri toliko daljsi strukturi
potrebno rezervirati vec rama in se naslov elementa in strukture nista
nikdar pokrila in ni prislo do dvojnega free()ja.


Hm, malo dolg mail, no ja upam da bo kdo vedel o cem govorim. :)



David!
---------------
Having Microsoft Exchange for your mail transport is the same as having
Marvin for your babysitter.

Reply via email to