» »

[C++] Stack corrupted? Memory allocation f****p?

[C++] Stack corrupted? Memory allocation f****p?

BigWhale ::

Tole je sample kode, ki mi nagaja:


myclass::myclass (UniStr param)
{
  UniStr fafa("fafafa");
printf("? %s\n", fafa.c_str());
  ..krah..

}

myclass *lpMyclass;

int main()
  UniStr lala("lalal");
printf("? %s\n", lala.c_str());
  lpMyclass = new myclass("LALAL");
....




Da zadeva crkne v metodi c_str() razreda myclass, kjer se izvede:

mpC_Str = new char [max_char_len]; (mpC_Str je char *)

Se dodatek k temu vsemu. Prvi klic c_str() v main() dela brez problema in printf pljune ven 'lalal'. Drugi klic, v konstruktorju myclass pa crkne. tale myclass je PRECEJ pogosto uporabljen class, ki naceloma dela povsod... UniStr je se bolj pogosto uporabljen custom string class, ki tudi dela, ze nekaj let, na nekaj tisoc mestih in tudi tista c_str() metoda ze klice zilijonkrat.

Crkne mi izkljucno v tem primeru.

Ker je petek, 16:45 mi tole ze rahlo najeda in ne vem vec kje iskat napako... Probal sem 1001 varianto linkanja, razlicnih includov, ustvarjanja myclass-a na stacku in na heapu... isti smorn vedno.

Ideas? Napako bom ze nasel, samo me zanimajo alternativne moznosto, kje naj tega hudica isem... ;)

[vsc - no no...]
  • spremenil: Vesoljc ()

Sergio ::

Jaz sem mel zadnje case podoben problem. Najbrz sploh nima veze, a vseeno v premislek.

Ista metoda se je klicala iz dveh procesov. Vsak proces je imel svoj heap. Ker se je zadeva kreirala na heapu prvega procesa, in ker je bila spremenljivka (class variable) staticna, in ker drugi proces ni imel dostop do heapa prvega procesa oziroma je bil naslov do spremenljivke na heapu foo, KRAH. :)

Happy debugging.

PS: Ce so to pogosto uporabljeni razredi, najbrz ni problem v kodi, ampak v kaksni od teh obskurnosti.

Ce se tvoj UniString prenasa po referenci v class kontruktor, zna biti kaj na tem.
Tako grem jaz, tako gre vsak, kdor čuti cilj v daljavi:
če usoda ustavi mu korak,
on se ji zoperstavi.

CCfly ::

Vau creepy bug. Jaz v tej kodi na žalost ne vidim nič narobe.
"My goodness, we forgot generics!" -- Danny Kalev

64202 ::

valgrind!

Senitel ::

Imaš slučajno kaj od tega v kakšnem DLL-ju?

BigWhale ::

Ja, ICU od ibma, ki je podlaga za UniStr je v dlljih. Linkano z /DELAYLOAD in brez. Isti smorn.


CC: Ja, tudi jaz in kaki trije sodelavci nismo videli nic narobe v kodi. ;) To je hec, ker koda zgleda da je ok. Ostane mi se precesovanje .h filetkov in islanje kakega globala, ki je deklariran kje v kaki * materni... in sem ga spregledal. :)

Gundolf ::

Moje izkušnje so take, da se bugi ponavad manifestirajo na tistem koncu kode, ki ima z bugom najmanj zveze. V smislu, ce te branje iz diska zafrkava, pol isci bug v GUIju :D

Po moje tud ni napaka v tem delu kode, ki si ga napisu. Lahko pa vseeno poveš še za točno kakšno vrsto napake sploh gre. Razen če je to ta stack corrupted, za kar pa še nisem nikoli slišal.

64202 ::

A nima IBM kaksenga memory debuggerja?

BigWhale ::

Napaka je taksna, da se program pozene, ko bi moral izpisat doticni string pa obvisi, nekaj sekund visi in potem crkne, pa sem nazaj v konzoli oz cmd.exe.

Isto na win2000 in 2003. Na unixih afaik dela tako kot treba, kar je se bolj hecno.

:)

Sumum, da je problem v ibmovih knjiznicah... ampak zakaj ravno zdaj, mi pa ni jasno...

OwcA ::

Kaj pa če rezultat c_str() shraniš (po vrednosti) v začasno spremenljivko in potem to izpišeš?
Otroška radovednost - gonilo napredka.

BigWhale ::

Cim cstr() poklicem crkne zadeva...

V cstr najprej preveri dolzino stringa, ki je v eni member variabli zapisan (nevem napamet tocno kot kaj, mogoce kar en byte array oz array unicode karakterjev). Potem tej dolzini doda 'mau rezerve' in poklice

mTmp = new char [dolzina+rezerva];

in na tem mestu crkne, exception error pravi visual c debugger.

CCfly ::

Čisto iz obupa. Kaj pa če ima dolzina kakšno čudno vrednost ?
"My goodness, we forgot generics!" -- Danny Kalev

Nerdor ::

Čist banalen predlog, kaj pa če bi ti za te razrede potem rezerviral prostor s malloc !? ;)
... for lifetime!

BigWhale ::

Zdaj sem naredil v tisti knjiznici MyClass2 in stvar dela.

Sedaj se bom pa lotil in precesal vse ostale knjiznice, ki jih linkam v tale exe. Ker ocitno se tam en global al kaj jaz vem kak debilni MyClass najde not in se mu sfuzla..

BigWhale ::

Probleme je delal en define, ki se je nahajal v Makefile.
Zato je zgleda prislo do problemov s simboli pri linkanju.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Gcc linkanje .so

Oddelek: Programiranje
51497 (1062) golobich
»

[C++] Kopiranje char arraya v drug char array

Oddelek: Programiranje
71194 (1065) win64
»

C# je mozna referenca do int izven funkcije (direkt v classu torej)

Oddelek: Programiranje
81556 (1370) TopCat
»

[C++] dolžina niza

Oddelek: Programiranje
81227 (1129) Gundolf
»

operator +

Oddelek: Programiranje
71213 (1086) MasterBlaster

Več podobnih tem