|
dev.gamez.lv Latvian Game Developers Community
|
View previous topic :: View next topic |
Author |
Message |
programmer
Joined: 15 Sep 2006 Posts: 71 Location: Latvija, Limbaži
|
Posted: Sat Jul 28, 2007 7:45 pm Post subject: Programma darbojas pareizi vienīgi iekš debuggera |
|
Problēma tāda, ka palaižot programmu iekš Visual Studio 2003 Debug vai Release modē, tā darbojas pilnīgi perfekti, taču, kad palaižu debug vai release exi bez debuggera, tad debug exe darbojas "uz pusi" kā vajadzētu, taču release exe galīgi nedod tos rezultātus, kādus vajag.
Ar Visual Studio 2005 Express notiek tieši tas pats.
Googlē uzmeklēju vienu postu microsoft forumā ar tādu pašu problēmu, taču tur netika atbildēts. |
|
Back to top |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: Sat Jul 28, 2007 10:18 pm Post subject: |
|
Ko nozīmē "darbojas uz pusi kā vajadzētu"?
Un kā izpaužas "galīga rezultātu nedošana kādus vajag"?
Īsti nesaprotu - tad ar debugeri vai bez debugera nestrādā? Jo studijas IDĒ programmu var laist gan zem debugera (F5) vai arī bez debugera (Ctrl+F5) gan debug, gan release modēs.
Lūdzu cilvēki saprotiet taču, ka nav neviens te gaišreģis. Nevaram uzminēt jūsu problēmas. |
|
Back to top |
|
|
programmer
Joined: 15 Sep 2006 Posts: 71 Location: Latvija, Limbaži
|
Posted: Sat Jul 28, 2007 11:42 pm Post subject: |
|
Es domāju, ka diezgan skaidri pateicu, ka ar attach'otu debuggeri strādā, bet bez debuggera (ctrl+F5) nestrādā.
Es neminēju, kas tieši nedarbojas, jo domāju, ka tas neko neizteiks - iespējams, ka kļūdos. Es neceru, ka kāds no jums ir gaišreģis, bet es cerēju, ka kāds no jums kādreiz būs saskāries ar šo problēmu. Šī nav tāda "parasta" problēma, kad es varu pateikt, ko gribu panākt, bet nezinu kā. Pamatā programma strādā perfekti, kā es to biju iecerējis.
Taisu savam spēles dzinim GUI. Salieku testam dažus logus, pogas, čekboxus utt., lai paskatītos vai viss iet kā nākas. Ar debuugeri viss ir štokos (parādās "root" logs, uz tā vēl divi logi un visi elementi, kam jābūt uz šiem logiem).
Tagad ir trīs varianti kā viss darbojas BEZ debuggera:
* Palaižot Debug exi ar dubultklikšķi uz exes, parādās tikai "root" logs ar visiem uz tā esošajiem elementiem, izņemot pārējos divus logus, kas ir šī loga "bērni".
* Palaižot Debug exi ar Ctrl+F5 (iekš VS), parādās tikai "root" logs ar uz tā esošajiem elementiem un vēlviens logs, bet uz šī loga ir tikai viens no 7 elemetiem, kam būtu jāatrodas uz šī loga. Otrs logs neparādās.
* Ar Release exi abos variantos (dubultklikšķis uz exes; Ctrl+F5 iekš VS) neparādās pilnīgi nekas no GUI.
Nav ne jausmas, kas ir pie vainas. Varbūt kautkas saistīts ar atmiņu? Debugeris noteikti tās lietas ar atmiņu kārto savādāk, lai varētu visu izsekot. Nevaru spriest par to, ko nezinu. |
|
Back to top |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: Sun Jul 29, 2007 2:17 am Post subject: |
|
Kā notiek to dažu logu/pogu/čekbokšu salikšana testam? Kas tā par GUI sistēmu un uz kā bāzēta? Vai gadījumā nelādē failu ar relatīvu ceļu? Tad ņem vērā, ka tekošā direktorija taisot dubultklikšķi uz exe's ir exe's direktorija, bet laižot no studijas - projekta faila (.vcproj) direktorija. Šo kļūdu vari pārbaudīt pārbaudot atgrieztās vērtības no failu atvēršanas funkcijām, tb vai tās ir valīdas. Tekošo direktoriju laižot no IDE's var nomainīt projekta propertijos zem Debugging sadaļas.
Jā, par valīdumu runājot - vai pārbaudi visu funkciju darbības rezultātu? Vai tās nostrādā un neatgriež kļūdainu rezultātu (tipa FALSE vai tml)? Izstrādes stadijā ļoti ieteicams to darīt, jo tas palīdz atrast lielumlielo vairumu kļūdu. Vēlāk, ja to vajag ātrdarbības dēļ, var pārbaudes atslēgt, kad esi pārliecinājies, ka tas strādā kā gribēji.
Neko citu kā kārtīgi izdebugot savu kodu ieteikt nemācēšu.
Ar debug modes atmiņu tam visam ir tikai sakars tādā gadījumā, ja pats nepareizi kautkā atmiņu aiztiec un raksti vērtības tur, kur nevajag. Bet tādā gadījumā diez vai kautkam vispār vajadzētu strādāt, visdrīzāk tad viss vienkārši krašotu, nevis "gandrīz" strādātu. |
|
Back to top |
|
|
programmer
Joined: 15 Sep 2006 Posts: 71 Location: Latvija, Limbaži
|
Posted: Sun Jul 29, 2007 6:16 am Post subject: |
|
Logu/pogu/čekbokšu salikšana testam notiek veidojot jaunas šo klašu instances. GUI sistēma bāzēta uz scene-graph struktūras. Katram elementam sava klase, kas manto vienu bāzes klasi. Nekas jauns - domāju, ka gandrīz visas GUI sistēmas darbojas līdzīgi.
Ar problēmu par relatīvo faila ceļu biju saskāries jau agrāk un vairāk tādas kļūdas cenšos nepieļaut, taču šis nav tas gadījums. Nekādus failus gui sistēma pašlaik vēl neielādē, izņemot fontus, kas ielādējas pareizi (esmu pārliecināts).
Cenšos pārbaudīt visus funkciju darbības rezultātus, taču tos es pats nedabūju zināt Laikam vajadzēja pierakstīt vienu rindiņu katrā vietā, lai izvada konsolē rezultātu. Tas būs jāizdara.
Atmiņu es pats uz dullo neaiztieku, tātad šī problēma atkrīt.
Taču es vēl aizvien nesaprotu, kāpēc, debugerī un ārpus tā, programma darbojas savādāk? Un vēl tas, ka Ctrl+F5 un palaišana no exes dod citādus rezultātus.
EDIT: Tikko atklāju ceturto variantu. Kad palaižu Debug exi caur command-promt, tad notiek tas pats, kas ar Release exi - neparādās nekas no gui.
Kāda starpība palaižot exi ar dubultklikšķi vai caur command-promt? |
|
Back to top |
|
|
programmer
Joined: 15 Sep 2006 Posts: 71 Location: Latvija, Limbaži
|
Posted: Sun Jul 29, 2007 8:59 am Post subject: |
|
Atnāca rīts, melnie mākoņi izklīda un manam skatam pavērās divi ne-inicializēti mainīgie, to starpā arī m_Visible, kas nosaka vai elements būs redzams.
Tagad arī skaidrs kāpēc dažādās modēs bija dažādi rezultāti. Dažreiz atmiņā bija palicis TRUE, citreiz - FALSE.
Vai ir kāda iespēja, ka debugeris visus mainīgos inicializē pats, jeb tā ir vienkārši sakritība? |
|
Back to top |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: Sun Jul 29, 2007 12:25 pm Post subject: |
|
Debug modē kompilēta exe (vienalga kā tu to palaid) visus neinicializetos lokālos mainīgos inicializē ar 0xcccccccc vērtību. Vismaz 2005 studija. Vecākās studijā iespējams vērtība ir nedaudz cita, bet tā ir kautkāda konstante.
Globālie mainīgie laikam satur vērtību kāda vien tā pagadās atmiņā. Uz to nevar paļauties. |
|
Back to top |
|
|
elvman Indago Uzvarētājs
Joined: 09 Apr 2003 Posts: 1278 Location: Kuldiga
|
Posted: Sun Jul 29, 2007 2:59 pm Post subject: |
|
Quote: | Debug modē kompilēta exe (vienalga kā tu to palaid) visus neinicializetos lokālos mainīgos inicializē ar 0xcccccccc vērtību. |
Tieši šito gribēju teikt. Man arī ir bijušas problēmas ar to, ka debug versijā viss it kā ir OK, bet kad iedod savu programmu kādam citam, t;a atskan zvans: "man visu laiku crashojas". Vai ir kaut kāda iespēja noņemt šo "fīču"? _________________ long time; /* know C */ |
|
Back to top |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: Sun Jul 29, 2007 4:01 pm Post subject: |
|
em.. nesapratu. Gribi debug modē atslēgt to? Vai nav vienkārši nedod debug modē kompilētu exe citiem?
Šī "fīča" taču ir ļoti noderīga, kad vajag kodu debugot. Jo tad debugerī var ļoti vienkārši redzēt, kādi mainīgie ir neinicializēti. Nez, man ar šo fīču nekad nav bijušas nekādas problēmas. Tieši otrādi, ar tās palīdzību daudzus citus bugus tieši esmu izlabojis :) Debug modes būtība jau ir būt par debug modi - veikt papildus pārbaudes un čekus. Ja jau visas pārbaudes atslēgsi - dabūsi vienkārši neoptimizētu release modi... Cita atšķirība starp release un debug modēm nav - daži settingi tikai (debug mode = release mode - optimizācija + papildus pārbaudes).
Padomā, kas notiks, kad atslēgi šo fīču - ieejot funkcijā pieņemsim, ka stekā atradās pointeris uz sen izdzēstu objektu, bet tā atmiņa vēl nav pārrakstīta. Un tu esi nodefinējis lokālo mainīgo, kuram kompilators piešķir atmiņas vietu tieši tajā pašā steka vietā. Programma visdrīzāk krašos, jo aiztiks sabojātus datus. Bet debugerī tu nevarēsi saprast neko, jo tas uzrādīs sakarīgas vērtības - uz to atbrīvto, bet vēl neizmainīto atmiņas vietu. Tb debugeris uzrādīs, ka lokālais neinicializētais mainīgais ir itkā inicializēts.
To vajag pieņemt to sev kā par likumu - mainīgos vienmēr inicializēt! It īpaši lokālos, jo pirms tam stekā var sazin kas atrasties. |
|
Back to top |
|
|
elvman Indago Uzvarētājs
Joined: 09 Apr 2003 Posts: 1278 Location: Kuldiga
|
Posted: Sun Jul 29, 2007 4:21 pm Post subject: |
|
Piekrītu, šī "fīča" ir noderīga, kad tu programmu debug'o, bet ja es programmu palaižu bez debug'ošanas, viņš dara tieši tā pat. Es nevaru atļauties tērēt laiku katrai programma buildot gan Release, gan Debug versiju, tāpēc arī prasu, vai viņu, kad vajag, var atslēgt. _________________ long time; /* know C */ |
|
Back to top |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: Sun Jul 29, 2007 4:36 pm Post subject: |
|
Un buildot vēlreiz, kad gribi programmu bez šīs fīčas, tu gribi? :) Kur atsķirība uzbuildot release modē projektu?
Sproti, ka tas nav nekās boolean flags. Tā inicializēšana ar 0xccc... ir iekompilēta mašīnkodā - katru reizi kad koda vadība nonāk funkcijas sākumā, tā vietā, lai tikai atbrīvotu vietu stekā - atņemtu no steka pointera reģistra konstanti - tiek izdarīta šī atņemšana un tā visa vieta tiek aizpildīta ar to maģisko konstanti. Tas ir papildus kods. Kura protams release modē, nav jo tas padara visu programmu nedaudz lēnāku.
"Atslēgt" to var tikai pārkompilējot kodu. |
|
Back to top |
|
|
elvman Indago Uzvarētājs
Joined: 09 Apr 2003 Posts: 1278 Location: Kuldiga
|
Posted: Sun Jul 29, 2007 4:45 pm Post subject: |
|
Nē, nē, tu nesaproti. Kad palaižu savu Debug programmu no Visual C++ ar Shift+F5 (bez debug'ošanas), viņš inicializē visus mainīgos ar šo vērtību (0xcccccc), bet, kad palaižu programmu no explorera visi mainīgie tiek pagrābti no atmiņas uz dullo (tā kā strādātu normāla programma), tātad tas ir kaukāds fīčers iebūvēts iekš VC++, kas liek visiem mainīgajiem inicializēties ar šo mainīgo. Tas prasa laiku atrast programmu un laist viņu no explorera vai arī buildot Release versiju, tāpēc man būtu ērtāk, ka viņš programmu palaiž kautkādā "normal mode", nevis tā, kā viņš to dara tagad. Domāju, ka to vajadzētu varēt atslēgt. _________________ long time; /* know C */ |
|
Back to top |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: Sun Jul 29, 2007 4:55 pm Post subject: |
|
Nē, tā nav tiesa.
Reku, uztaisīju mazu main.cpp failu:
Code: | #include <cstdio>
int main()
{
int x;
int y;
y = x*2;
std::printf("x=%x y=%x\n", x, y);
return y;
} |
Nokompilēju 2k5 express studijā debug modē. Aizvēru studiju, un tagad skatos exe failu diasemblerī (tb nekāds tavs fīčers iebūvēts iekš VC++ nevar darboties, jo viss, kas saistīts ar VC++ ir aizvērts)
main funkcijas kods: (visu programmas mašīnkodu rakstīt šeit būtu neprātīgi ;)
Code: | .004113A0: 55 push ebp
.004113A1: 8BEC mov ebp,esp
.004113A3: 81ECE4000000 sub esp,0000000E4 ;" õ"
.004113A9: 53 push ebx
.004113AA: 56 push esi
.004113AB: 57 push edi
.004113AC: 8DBD1CFFFFFF lea edi,[ebp][-000000E4]
.004113B2: B939000000 mov ecx,000000039 ;" 9"
.004113B7: B8CCCCCCCC mov eax,0CCCCCCCC ;"╠╠╠╠"
.004113BC: F3AB repe stosd <------- reku aizpilda lokālos mainīgos ar šo maģisko konstanti
.004113BE: C68523FFFFFF00 mov b,[ebp][-000000DD],000 ;" "
.004113C5: 80BD23FFFFFF00 cmp b,[ebp][-000000DD],000 ;" "
.004113CC: 750D jne .0004113DB -----↓ (1)
.004113CE: 682F144100 push 00041142F -----↓ (2)
.004113D3: E8D7FCFFFF call .0004110AF -----↑ (3) <------ kautkāda papildus čekošanas procedūras izsaukšana
, kas release modē nemaz nav
.004113D8: 83C404 add esp,004 ;"♦"
.004113DB: 8B45F8 mov eax,[ebp][-08] <---------- tas ir x
.004113DE: D1E0 shl eax,1 <----------- reku reizina ar 2
.004113E0: 8945EC mov [ebp][-14],eax <---------- tas ir y
.004113E3: 80BD23FFFFFF00 cmp b,[ebp][-000000DD],000 ;" "
.004113EA: 750D jne .0004113F9 -----↓ (4)
.004113EC: 682F144100 push 00041142F -----↓ (5)
.004113F1: E8B9FCFFFF call .0004110AF -----↑ (6) <------ papildus cheks
.004113F6: 83C404 add esp,004 ;"♦"
.004113F9: 8BF4 mov esi,esp
.004113FB: 8B45EC mov eax,[ebp][-14] <------ y
.004113FE: 50 push eax
.004113FF: 8B4DF8 mov ecx,[ebp][-08] <------ x
.00411402: 51 push ecx
.00411403: 683C574100 push 00041573C -----↓ (7)
.00411408: FF15BC824100 call printf ;MSVCR80D.dll <------ printf
.0041140E: 83C40C add esp,00C ;"♀"
.00411411: 3BF4 cmp esi,esp
.00411413: E823FDFFFF call .00041113B -----↑ (8) <------ papildus cheks
.00411418: 8B45EC mov eax,[ebp][-14]
.0041141B: 5F pop edi
.0041141C: 5E pop esi
.0041141D: 5B pop ebx
.0041141E: 81C4E4000000 add esp,0000000E4 ;" õ"
.00411424: 3BEC cmp ebp,esp
.00411426: E810FDFFFF call .00041113B -----↑ (9) <------ papildus cheks
.0041142B: 8BE5 mov esp,ebp
.0041142D: 5D pop ebp
.0041142E: C3 retn |
Pie tam, palaižot programmu no explorera, tiek parādītas divas kļūdas messageboxī, ka tiek lietots neinicializēts mainīgais x, un programma izdrukā:
Code: | x=cccccccc y=99999998 |
x=cccccccc !!
Tie papildus čeki (procedūru izsaukšanas) ir tieši tas, kas debugerī vai arī bez tā paziņo par debug kļūdām - steka pārpildīšanās, neinicializētu mainīgo lietošana, utt.
Pie tam, kad tu no studijas laid programmu ar Ctrl+F5 (tb without Debugging), tad tā tiek laista identiski dubultklikšķim explorerī. Tikai laižot ar Debuggingu (F5) apakšā darbojas studijas debugeris. |
|
Back to top |
|
|
elvman Indago Uzvarētājs
Joined: 09 Apr 2003 Posts: 1278 Location: Kuldiga
|
Posted: Sun Jul 29, 2007 5:54 pm Post subject: |
|
Hmm. Pats izstestējos tā un šitā, un tiešām, šī "fīčera" nav. Ar aprakstu biju nedaudz kļūdijies, bija nedaudz savādāk. UNDU kodēju uz VC++ 2005 Express un bija tā, ka klašu lokālie vairabļi (pointeri) debug versijā palaižot no VC++ vienmēr bija 0, tāpēc izdarot šo darbību nekad neradās kļūdas:
Code: | if (m_pVariablis)
{
delete m_pVariablis;
m_pVariablis=NULL;
} |
Kad palaidu UNDU testēšanai plašākai pulbikai, izrādijās, ka daudzu klašu konstruktoros biju aizmirsis ielikt m_pVariablis=NULL;
Tagad mēģināju testēt līdzīgu piemēru, bet nekas tāds nenotiek. Visu laiku pointer'im ir no RAM'a pagrābta vērtība vērtība (nevis NULL). Interesanti. Arī tavs skaidrojums ir pārliecinošs. Noteikti es kaut ko jaucu. _________________ long time; /* know C */ |
|
Back to top |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|