Avatar billede martinr Nybegynder
20. juni 2010 - 03:35 Der er 7 kommentarer

Hvordan ser man "stack'en" i Delphi ??????????

Hej eksperter

Jeg håber virkelig, I kan hjælpe mig, efter jeg nu flere gange har oplevet den samme fejl (tror jeg), uden at hverken Delphi eller noget andet har været mig behjælpelig.

Fejlen, jeg får, er en EStackOverflow, og i dialogboksen, som fremkommer lige efter fejlen, står der "Project UndertekstEditor.exe raised exception class EStackOverflow with message 'Stack overflow'. Process stopped. Use Step or Run to continue."

Når man så trykker OK for at finde fejlens placering, hopper den til lige efter "end." efter alt det med Application.Initialize og Application.Run (I ved, koden der fremkommer ved Project -> View Source), og det bliver man jo ikke klogere af. Den viser også nogen gange CPU/FPU-vinduet, hvor fejllinien er markeret, men det siger mig absolut ingenting...

Jeg har forsøgt noget debugging i Delphi, bl.a. med Call Stack-vinduet (View -> Debugging Windows -> Call Stack), men der står kun projektets navn eller oftest "Process is not accessible", selvom jeg kører det fra IDE'en. De andre debugging-vinduer (Local Variables, Breakpoints, Threads etc.) har heller ikke været til nogen hjælp.

Jeg ville gerne vise jer noget kode, men det er meget svært, når jeg ikke ved, hvor fejlen opstår, og projektet derudover er en del omfattende. Fejlen kommer først ca. 15-20 minutter inde i programmet (efter stack'en er fyldt op, tror jeg).

Det er kort fortalt et program til at lave undertekster med, og jeg bruger bl.a. en normal TListview-komponent til at liste underteksterne og active-x versionen af windows media player (ikke TMediaPlayer) til video'en (klasse: TWindowsMediaPlayer).

Systemoplysninger (hvis nødvendigt):
- OS: Windows Vista Home Premium (32-bit) inkl. Service Pack 2.
- Processor: AMD Turion 64 X2 Mobile Technology TL-66  2.30 GHz.
- RAM: 3 GB.
- Delphi: Delphi 7 Enterprise Edition.

Den eneste måde, jeg umiddelbart kan se til at finde en løsning med, er, hvis man somehow kan få vist den famøse stack, mens programmet kører, så man kan se hvilken funktion/procedure etc., der bliver ved med at overfylde stack'en og med hvad, men da jeg ikke ved, hvordan man gør, er mit spørgsmål derfor som i overskriften: hvordan ser man stack'en i Delphi ??????????

Hjælp, please!

Jeg vil gerne smide flere points i, hvis det er.
Jeg håber, jeg har beskrevet det godt nok (selvom det blev lidt langt), men ellers må I spørge.
Avatar billede hrc Mester
20. juni 2010 - 09:22 #1
Hvis dit program stopper med en stack overflow er der normalt tale om en uendelig løkke.

I Delphi's debugtilstand kan du klikke på de enkelte led i stakken og blive placeret i koden hvor det sker - men hvis den, stakken, er 2 mia. høj, så er det lidt svært at se der hvor det går galt.

Du kan evt. få hjælp ved at installere Madshi eller EurekaLog som sandsynligvis sorterer lidt i stakken.
Avatar billede martinlind Nybegynder
20. juni 2010 - 12:26 #2
alternativt kan du prøve at sætte din stack - plads lidt op

meeen der er nok som hrc skriver, en uendelig løkke :-)
Avatar billede hrc Mester
21. juni 2010 - 23:34 #3
Dit program har vel en mainform eller et sted hvor tingene starter. Hvis du sætter et breakpoint ind der, så burde du da kunne singlesteppe dig ind til fejlen (vha. F7 og F8)
Avatar billede martinr Nybegynder
22. juni 2010 - 04:01 #4
Mange tak for jeres kommentarer og løsningsforslag, men det er desværre ikke noget, jeg har kunnet bruge til noget.

hrc:
Du har muligvis ret i det med den uendelige løkke, men jeg har ikke rigtig nogen af dem i min kode, så det tror jeg ikke forårsager problemet (men jeg vil da ikke afskrive muligheden 100%).

Du skriver noget med at "klikke på de enkelte led i stakken og blive placeret i koden..." Er det CPU/FPU-vinduet, du mener (for der sker intet som helst, når jeg enkelt-/dobbeltklikker på linierne deri) eller måske det Call Stack-vindue, jeg selv omtalte i spg. (som der som oftest ikke står noget brugbart i)?

Jeg har prøvet både Madshi (madExcept) og EurekaLog uden held - Madshi installerer fint men fanger ikke min exception; min applikation bryder ved fejlen blot ned med Vistas fine "programmet er holdt op med at fungere..."-dialogboks, hvor man kan vælge enten at fejlfinde (hjælper ikke) eller lukke programmet. Jeg har prøvet at køre applikationen både i og uden for IDÉ'en med Madshi aktiveret men uden held. EurekaLog kunne ikke installeres ordentligt hos mig af en ukendt grund (der kommer intet frem i IDÉ'en om nogen settings - jeg har kigget rundt i næsten alle menuerne men fandt intet), så desværre :(

martinlind:
Jeg havde faktisk selv en overgang haft overvejet det med at sætte stack-pladsen op, som du skriver, men jeg ved ikke, hvordan man gør (skal det programmeres?), og desuden løser det jo sådan set ikke mit problem men udskyder vel bare fejlen...

hrc (3. kommentar):
Mit program har ganske rigtig en mainform (og faktisk også andre forme, men her opstår fejlen ikke; det er jeg ret sikker på), og jeg har haft prøvet det med breakpoints, men problemet er, at min applikation som tidligere skrevet er en hel del omfattende, og fejlen først sker omkring 15-20 min. efter kørsel, så det bliver ret langvarigt at skulle "steppe" sig frem i 15-20 min... (læs: det gider jeg altså ikke). Desuden har mit program mange funktioner og procedurer, der kører afhængige af flere valg (menuer, knapper, tastetryk etc.), så det er en del omstændeligt.

Jeg kan kort forklare jer, at mit program lige inden, det crasher, tilsyneladende skriver min listview med underteksterne ud igen et andet sted i programmet og oven på andre komponenter (håber I forstår, det er svært at forklare) - det ligner lidt en slags repaint af min listview, men jeg har ikke kunnet finde ud af hvorfor. Det lykkedes mig på et tidspunkt at tage et screenshot, som jeg gerne ville prøve at uploade her, hvis jeg vidste, hvordan man gjorde... Jeg ved dog ikke, om fejlen opstår pga. min listview, eller om det kan skyldes andre af mine komponenter.

Puha, nu blev det vist en lang tekst igen... Jeg lader spørgsmålet stå åbent indtil videre, da det i skrivende stund stadig ikke er besvaret.
Avatar billede hrc Mester
22. juni 2010 - 17:50 #5
En uendelig løkke kan også camoufleres som et rekursivt kald. Et eksempel er hvis man nedarver fra TObjectList (der har en property kaldet Items):

type
  TMyList = class(TObjectList)
  private
    function GetItems(const aIndex: integer): TMyObject;
  public
    property Items[const aIndex: integer]: TMyObject read GetItems;Default;
  end;

..

function TMyList.GetItems(const aIndex: integer): TMyObject;
begin
  result := inherited Items[aIndex] as TMyObject;
end;

Hvis du glemmer ovenstående "inherited" så kommer der stakoverflow.

Jeg kan ikke forstå du ikke kan stille dig i mainformens OnCreate-event og debugge derfra, eller bare trykke F8 og starte ude i DPR-filen på allerførste linje i programmet.
Avatar billede kloge Nybegynder
23. juni 2010 - 10:01 #6
Du må da kunne følge dit program i debuggeren (step/into) og finde ud af, hvor det begynder at loope. Har
Avatar billede hrc Mester
23. juni 2010 - 12:07 #7
Prøv at koble dit listview ud af programmet. I øvrigt bør du bruge lv.Items.BeginUpdate og lv.Items.EndUpdate (i en try-finally naturligvis) for at speede tingene op. Bruger du listen til max. 2000 linjer kan det bruges. Hastigheden går meget ned herefter.

Er der flere linjer end det, må du lave en virtuel liste som kan klare 2 mia. linjer uden at blinke. Det viser jeg gerne et eksempel på.

kloge: Meget kortfattet svar du har lagt :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester