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
|
Zaslal: 29. červen 2010, 17:57:37 Předmět: Visual C++ release build a crash |
|
|
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 |
|
 |
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 29. červen 2010, 18:21:05 Předmět: |
|
|
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 |
|
 |
programator

Založen: 28. 07. 2007 Příspěvky: 38
|
Zaslal: 29. červen 2010, 19:32:00 Předmět: |
|
|
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ší  |
|
Návrat nahoru |
|
 |
micky

Založen: 28. 02. 2008 Příspěvky: 348 Bydliště: Plzeň, Praha
|
|
Návrat nahoru |
|
 |
quas4
Založen: 18. 10. 2007 Příspěvky: 199
|
Zaslal: 29. červen 2010, 21:30:26 Předmět: Re: Visual C++ release build a crash |
|
|
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 |
|
 |
micky

Založen: 28. 02. 2008 Příspěvky: 348 Bydliště: Plzeň, Praha
|
Zaslal: 29. červen 2010, 22:00:43 Předmět: |
|
|
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.
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 |
|
 |
Quiark

Založen: 29. 07. 2007 Příspěvky: 816 Bydliště: Chlívek 401
|
Zaslal: 29. červen 2010, 22:18:33 Předmět: |
|
|
Vítej ve světě C++ 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 |
|
 |
micky

Založen: 28. 02. 2008 Příspěvky: 348 Bydliště: Plzeň, Praha
|
Zaslal: 29. červen 2010, 22:19:48 Předmět: |
|
|
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 |
|
 |
if.then
Založen: 13. 04. 2008 Příspěvky: 579
|
Zaslal: 29. červen 2010, 22:29:04 Předmět: |
|
|
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 |
|
 |
micky

Založen: 28. 02. 2008 Příspěvky: 348 Bydliště: Plzeň, Praha
|
Zaslal: 29. červen 2010, 22:35:14 Předmět: |
|
|
Paranoia způsobená dneškem. Kdyby náhodou ten objekt byl NULL, abych nevolal jeho metody.
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 |
|
 |
if.then
Založen: 13. 04. 2008 Příspěvky: 579
|
Zaslal: 29. červen 2010, 22:37:29 Předmět: |
|
|
No jo, jenže co když bude 0 a ty jeho metody zavoláš? V tom asi chyba nebude, ale...
EDIT: No tak za to tedy může prakticky cokoliv kromě vectoru. Ano, vítej ve světě C++  _________________ 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 |
|
 |
micky

Založen: 28. 02. 2008 Příspěvky: 348 Bydliště: Plzeň, Praha
|
|
Návrat nahoru |
|
 |
if.then
Založen: 13. 04. 2008 Příspěvky: 579
|
Zaslal: 29. červen 2010, 22:46:37 Předmět: |
|
|
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
EDIT: Taky bych se měl odnaučit psát na začátek každé části příspěvku slovo "mimochodem"  _________________ For guns and glory, go to www.ceske-hry.cz.
For work and worry, execute VC++. |
|
Návrat nahoru |
|
 |
micky

Založen: 28. 02. 2008 Příspěvky: 348 Bydliště: Plzeň, Praha
|
Zaslal: 29. červen 2010, 23:37:50 Předmět: |
|
|
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.  _________________ https://www.bluepulsar.cz/
https://twitter.com/11thDream_Game/ |
|
Návrat nahoru |
|
 |
if.then
Založen: 13. 04. 2008 Příspěvky: 579
|
Zaslal: 30. červen 2010, 06:25:35 Předmět: |
|
|
Ajajaj, to naštve. Každopádně, pokud mohu poradit, dělej release build častěji.  _________________ For guns and glory, go to www.ceske-hry.cz.
For work and worry, execute VC++. |
|
Návrat nahoru |
|
 |
|