.[ ČeskéHry.cz ].
Visual C++ release build a crash
Jdi na stránku 1, 2, 3  Další
 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
micky



Založen: 28. 02. 2008
Příspěvky: 348
Bydliště: Plzeň, Praha

PříspěvekZaslal: 29. červen 2010, 17:57:37    Předmět: Visual C++ release build a crash Odpovědět s citátem

Zdravím vás, už se vám někdy stalo, že po přepnutí na Release Build ve Visual C++ a následném otestování začne aplikace crashovat? (A to crashovat podle přesných pravidel - dvakrát hru načteš, potřetí acces violation)

Možná jsem tam něco zapomněl, nejsem si úplně jistý, jestli se třídami vector<> stačí pracovat na bázi push_back(), clear() a vector[i]...

Ještě taková drobnost - ačkoliv aplikace neobsahuje debug informace, po odkliknutí varování a během "pod" Visual C++ nevykazuje sebemenší problémy. Snažil jsem se, necrashnul jsem. Při přímém spuštění .exe to dokážu poměrně přesně předpovídat.

Má s tím někdo zkušenosti?
_________________
https://www.bluepulsar.cz/
https://twitter.com/11thDream_Game/
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
rezna



Založen: 27. 07. 2007
Příspěvky: 2156

PříspěvekZaslal: 29. červen 2010, 18:21:05    Předmět: Odpovědět s citátem

zkontroluj si ze inicializujes pointery na NULL apod. - nejcastejsi problem - v release se tohle nedeje a tudiz treba omylem uvolnujes nesmyslnou adresu - ted jsem to resil...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
programator



Založen: 28. 07. 2007
Příspěvky: 38

PříspěvekZaslal: 29. červen 2010, 19:32:00    Předmět: Odpovědět s citátem

Alebo ci nepresahujes rozsahy poli - debug verzia alokuje vacsie, ako su definovane, release alokuje presne tak, ako je definovane.
Ak napriek tomu bude aplikacia crashovat, posli zdrojak, pozrieme sa na to...
_________________
To sa kráti, to sa ruší, rovnica sa neporuší Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
micky



Založen: 28. 02. 2008
Příspěvky: 348
Bydliště: Plzeň, Praha

PříspěvekZaslal: 29. červen 2010, 19:33:51    Předmět: Odpovědět s citátem

Díky, to byly tak nějak moje domněnky, zkusím tomu věnovat ještě nějakou tu chvíli.
_________________
https://www.bluepulsar.cz/
https://twitter.com/11thDream_Game/
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
quas4



Založen: 18. 10. 2007
Příspěvky: 199

PříspěvekZaslal: 29. červen 2010, 21:30:26    Předmět: Re: Visual C++ release build a crash Odpovědět s citátem

micky napsal:
vector[i]...


operator[](size_t) neprovadi vubec range checking (je jedno jestli debug nebo opt). Provadi jej funkce at(size_t).
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
micky



Založen: 28. 02. 2008
Příspěvky: 348
Bydliště: Plzeň, Praha

PříspěvekZaslal: 29. červen 2010, 22:00:43    Předmět: Odpovědět s citátem

ERROR c0000005 ... po chvilce googlení je to prachsprostý Access Violation...

No, spíš mě překvapuje, že při běhu pod Visual C++ to ani neštěkne, nic, naprosto bez crashů. A tím mám na mysli release verzi. Jakmile spustím .exe soubor, pak vím, kdy přesně ten crash očekávat. Smile

Tedy si myslím, že Visual studio předpřipraví paměť nebo tak nějak... Na druhou stranu, crashuje to nejspíš v samotných alokacích uvnitř vector<>, tedy to by mělo padat už v debugu, ne?

Zkusil jsem dokonce na celý objekt, ve kterém se to děje, delete a nasledne znova new - tím bych čekal, že se to bude pokaždé chovat jako poprvé, tedy bez crashe. Ne, nechová.
_________________
https://www.bluepulsar.cz/
https://twitter.com/11thDream_Game/
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Quiark



Založen: 29. 07. 2007
Příspěvky: 816
Bydliště: Chlívek 401

PříspěvekZaslal: 29. červen 2010, 22:18:33    Předmět: Odpovědět s citátem

Vítej ve světě C++ Wink Další věc co můžeš zkusit je pustit to samostatně a po chvíli VC++ debugger připojit - pomocí Attach to Process. Zřejmě ta chyba není úplně deterministická a přítomnost debuggeru na ni má vliv.

Jinak vector<> je v pohodě, dostaneš z něj přesně to, co jsi tam dal. Takže pokud tam házíš pointery nebo čísla, u něj chyba nebude. Pokud tam dáváš nějaká objekty, musíš pamatovat na to, že se mohou při realokaci vektoru (a koneckonců i při push_back) kopírovat, takže se přesvědč, že máš správně kopírovací konstruktor i operator=. Typická chyba je, že objekt A má pointer na B, udělá se kopie A, takže nyní máme dva pointery na B a pak se oba A pokusí to stejné B v destruktoru smazat.
_________________
Mám strach
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
micky



Založen: 28. 02. 2008
Příspěvky: 348
Bydliště: Plzeň, Praha

PříspěvekZaslal: 29. červen 2010, 22:19:48    Předmět: Odpovědět s citátem

Co proboha může crashnout v tomto kousku kódu?!

kód:

for (i = 0; i < (int)DatObjects.size() ; i++)
if (DatObjects.at(i))
{
if (!DatObjects.at(i)->Model) DatObjects.at(i)->Model = new CAnimModelDX(dev,&caps);
}


Konstruktor je úplně ok, jen tam přiřadí pointery dovnitř do třídy. Zkouším i tu fintu s at(i). Pořád stejný výsledek.

To Quiark: No, to bude asi moje chyba... Platí to i pro pointer na objekt?
EDIT: Počkej, už tu blbnu... tohle by neměl být můj případ, nic tam není kopírováno....
_________________
https://www.bluepulsar.cz/
https://twitter.com/11thDream_Game/
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
if.then



Založen: 13. 04. 2008
Příspěvky: 579

PříspěvekZaslal: 29. červen 2010, 22:29:04    Předmět: Odpovědět s citátem

EDIT: Taky už blbnu.
Mimochodem, proč je tam ta podmínka na to, aby nebyl ten prvek pole 0? Mně to nějak nedává smysl.
Jinak crashnutí v určitém kusu kódu může svědčit i o kritické chybě v předešlé části programu.
_________________
For guns and glory, go to www.ceske-hry.cz.
For work and worry, execute VC++.


Naposledy upravil if.then dne 29. červen 2010, 22:36:13, celkově upraveno 1 krát
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
micky



Založen: 28. 02. 2008
Příspěvky: 348
Bydliště: Plzeň, Praha

PříspěvekZaslal: 29. červen 2010, 22:35:14    Předmět: Odpovědět s citátem

Paranoia způsobená dneškem. Kdyby náhodou ten objekt byl NULL, abych nevolal jeho metody. Smile

Teď nevím, jestli je to dobrá zpráva, ale není to chyba vector<>. Zkusil jsem ho nahradit statickým polem, samozřejmě to crashlo znovu. Ale konstruktor? Co ten za to chudák může?
_________________
https://www.bluepulsar.cz/
https://twitter.com/11thDream_Game/
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
if.then



Založen: 13. 04. 2008
Příspěvky: 579

PříspěvekZaslal: 29. červen 2010, 22:37:29    Předmět: Odpovědět s citátem

No jo, jenže co když bude 0 a ty jeho metody zavoláš? V tom asi chyba nebude, ale... Confused
EDIT: No tak za to tedy může prakticky cokoliv kromě vectoru. Ano, vítej ve světě C++ Twisted Evil
_________________
For guns and glory, go to www.ceske-hry.cz.
For work and worry, execute VC++.


Naposledy upravil if.then dne 29. červen 2010, 22:40:31, celkově upraveno 1 krát
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
micky



Založen: 28. 02. 2008
Příspěvky: 348
Bydliště: Plzeň, Praha

PříspěvekZaslal: 29. červen 2010, 22:40:26    Předmět: Odpovědět s citátem

Po těch tisících řádek už se mi portovat do game makeru nechce Razz

No, díky za pomoc, snad už na to nějak přijdu.
_________________
https://www.bluepulsar.cz/
https://twitter.com/11thDream_Game/
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
if.then



Založen: 13. 04. 2008
Příspěvky: 579

PříspěvekZaslal: 29. červen 2010, 22:46:37    Předmět: Odpovědět s citátem

Mimochodem, tady je docela pěkný článek na toto téma: http://www.codeproject.com/KB/debug/survivereleasever.aspx - Surviving -the release version.

Jinak, taky jsem jednou měl totálně divné bugy v releasu. Po několika hodinách jsem přišel na to, co to způsobilo: Upsal jsem se a místo matice 4x4 jsem udělal matici 4x3. Takže hledej podobné prkotiny Wink

EDIT: Taky bych se měl odnaučit psát na začátek každé části příspěvku slovo "mimochodem" Rolling Eyes
_________________
For guns and glory, go to www.ceske-hry.cz.
For work and worry, execute VC++.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
micky



Založen: 28. 02. 2008
Příspěvky: 348
Bydliště: Plzeň, Praha

PříspěvekZaslal: 29. červen 2010, 23:37:50    Předmět: Odpovědět s citátem

Ano, chyba byla úplně jinde, samozřejmě v kódu, který leží ladem už přes měsíc.

Taková perla, stačí pseudokód....
kód:

 nacti pocet vrcholu
 pokud ma objekt pocet vrcholů větší než nula
     potom smaž vrcholy
 vytvoř pole vrcholů


...ta podmínka má být před načtením počtu, když by se objekt načítal znovu. Nu, jsem rád, že je to opravené. Ono se zase najde něco dalšího. Very Happy
_________________
https://www.bluepulsar.cz/
https://twitter.com/11thDream_Game/
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
if.then



Založen: 13. 04. 2008
Příspěvky: 579

PříspěvekZaslal: 30. červen 2010, 06:25:35    Předmět: Odpovědět s citátem

Ajajaj, to naštve. Každopádně, pokud mohu poradit, dělej release build častěji. Wink
_________________
For guns and glory, go to www.ceske-hry.cz.
For work and worry, execute VC++.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++ Časy uváděny v GMT + 1 hodina
Jdi na stránku 1, 2, 3  Další
Strana 1 z 3

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna