dev.gamez.lv Forum Index dev.gamez.lv
Latvian Game Developers Community
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups 

Programma darbojas pareizi vienīgi iekš debuggera

 
dev.gamez.lv Forum Index -> Programmēšana
View previous topic :: View next topic  
Author Message
programmer



Joined: 15 Sep 2006
Posts: 71
Location: Latvija, Limbaži

PostPosted: 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
View user's profile Visit poster's website
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: 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
View user's profile Send e-mail
programmer



Joined: 15 Sep 2006
Posts: 71
Location: Latvija, Limbaži

PostPosted: 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
View user's profile Visit poster's website
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: 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
View user's profile Send e-mail
programmer



Joined: 15 Sep 2006
Posts: 71
Location: Latvija, Limbaži

PostPosted: 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 Very Happy 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
View user's profile Visit poster's website
programmer



Joined: 15 Sep 2006
Posts: 71
Location: Latvija, Limbaži

PostPosted: 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. Very Happy
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
View user's profile Visit poster's website
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: 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
View user's profile Send e-mail
elvman
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 09 Apr 2003
Posts: 1278
Location: Kuldiga

PostPosted: 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
View user's profile Visit poster's website
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: 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
View user's profile Send e-mail
elvman
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 09 Apr 2003
Posts: 1278
Location: Kuldiga

PostPosted: 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
View user's profile Visit poster's website
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: 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
View user's profile Send e-mail
elvman
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 09 Apr 2003
Posts: 1278
Location: Kuldiga

PostPosted: 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
View user's profile Visit poster's website
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: 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
View user's profile Send e-mail
elvman
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 09 Apr 2003
Posts: 1278
Location: Kuldiga

PostPosted: 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
View user's profile Visit poster's website
Display posts from previous:   
dev.gamez.lv Forum Index -> Programmēšana All times are GMT + 2 Hours
Page 1 of 1

 
Jump to:  
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