Runtime -fel 216 vid 00404302 i Visual Basic 6 (VB6) indikerar vanligtvis en
"stacköverflöde" fel. Detta innebär att ditt program har överskridit det tillgängliga stackutrymmet tilldelat det. Stacken används för att lagra information om samtal, lokala variabler och returadresser. När stacken fylls, kraschar programmet.
Så här felsöker du och potentiellt fixar detta:
1. Identifiera den skyldige:
* oändlig rekursion: Den vanligaste orsaken är ett oändligt rekursivt funktionssamtal. En rekursiv funktion kallar sig utan ett korrekt basfall (ett villkor som stoppar rekursionen). Granska noggrant alla dina rekursiva funktioner för att säkerställa att de har ett väldefinierat basfall som så småningom avslutar rekursionen.
* Djupt kapslade funktionssamtal: Även utan rekursion kan ett mycket stort antal kapslade funktionssamtal uttömma stacken. Försök att refaktorera din kod för att minska häckningsdjupet. Överväg att dela upp stora funktioner i mindre, mer hanterbara.
* Stora lokala variabler: Att förklara mycket stora matriser eller andra datastrukturer eftersom lokala variabler inom funktioner kan konsumera betydande stackutrymme. Överväg att använda dynamisk minnesallokering (t.ex. att använda "dim" med "redim" för matriser eller objekt som kan växa i storlek) eller passera dessa stora strukturer som argument istället för att skapa dem lokalt inom varje funktion.
* Stora datastrukturer på stacken: Undvik att placera alltför stora datastrukturer direkt på bunten. Överväg att använda Dynamic Memory Allocation (HEAP) istället med "Nya" för objekt eller "dim" med "redim" för matriser för att fördela dem på högen.
2. Felsökningsstrategier:
* Debugger: Använd en felsökare (som den som är integrerad i VB6:s IDE) för att gå igenom din kodlinje för rad. Var uppmärksam på samtalsstacken, som visar sekvensen för funktionssamtal. Detta hjälper till att fastställa platsen där stacköversvämningen inträffar. Själva felmeddelandet (00404302) ger en minnesadress; Även om det inte är direkt användbart på egen hand, är det viktigt att hitta vad som körs vid den punkten i din kod.
* förenkla: Försök att kommentera delar av din kod för att isolera problemområdet. Om du har en stor, komplex funktion kan du försöka förenkla den eller dela upp den i mindre delar.
* Öka stackstorleken (minst rekommenderad): Du * kunde * försöka öka den stackstorlek som tilldelats till din VB6 -applikation. Detta är emellertid i allmänhet inte en bra lösning eftersom det bara maskerar det underliggande problemet. En sann lösning innebär att man tar upp grundorsaken till den överdrivna stackanvändningen. Metoden för att öka stackstorleken beror på ditt operativsystem och hur du kör VB6 -applikationen (t.ex. genom IDE eller en körbar). Det uppnås ofta genom operativsystemets länkinställningar eller miljövariabler (konsultera ditt OS:s dokumentation).
3. Exempel på oändlig rekursion:
`` VB.net
Privat Sub Infiniterecursion ()
Infiniterecursion 'Detta kommer att orsaka ett stacköversvämning!
Slutsub
`` `
Korrigerad version:
`` VB.net
Privat subrekursivfunktion (byVal n som heltal)
Om n> 0 då
Rekursivfunktion (n - 1) 'Basfall:Stoppar när n blir 0
Slut om
Slutsub
`` `
Genom att systematiskt undersöka dessa punkter och använda felsökningstekniker bör du kunna hitta och fixa orsaken till stackens överflödesfel. Kom ihåg att det är mycket bättre att fixa det underliggande problemet - enhetskontrollerad rekursion eller överdriven stackanvändning - är mycket bättre än att bara öka stackstorleken. Att öka stackstorleken skjuter bara upp den oundvikliga kraschen om grundorsaken inte är adresserad.