Avatar billede _et Praktikant
13. juni 2012 - 09:16 Der er 15 kommentarer og
1 løsning

Udskrive stak forbrug

Hvordan udskrives det aktuelle stack forbrug?

Det er pga en stack overflow fejl..
mvh
Avatar billede Syska Mester
13. juni 2012 - 09:21 #1
Lidt kode ... det burde være rimelig nemt at se.
Avatar billede bvli Praktikant
13. juni 2012 - 09:57 #2
Jeps - det er 90% af gangene fordi du kalder en metode eller - især - en property rekursivt.
Avatar billede _et Praktikant
13. juni 2012 - 10:06 #3
I har ret omkring kode eksempel. Problemet er at det er en kæmpe statemaskine KUN implementeret i main(). Derfor er jeg nød til at have et udskrift der viser mig at stackforbrug vokser før jeg begynder at rette i koden. koden er total overskuelig ved første øjekast. Derfor ingen kode

Findes der ikke et kald i stil med dette?
Console.WriteLine("Stack use: " + this.stackSice());

som udskriver størrelsen main()'s stack?
Avatar billede Syska Mester
13. juni 2012 - 10:16 #4
Måske du kan bruge:
var stackTrace = new StackTrace();
stackTrace.FrameCount

mvh
Avatar billede _et Praktikant
13. juni 2012 - 11:03 #5
Jaa.. Lidt.

Men jeg har nu direkte brug for memory relateret info.
Avatar billede Syska Mester
13. juni 2012 - 11:09 #6
Hvorfor? Det har intet med memory at gøre.

Som "bvli" skriver, er det helt sikkert noget rekursivt der går galt.

Hvis du kører i debug mode med en debugger attached, så burde du kunne se stacktrace.
Avatar billede bvli Praktikant
13. juni 2012 - 11:54 #7
Enig. Du går uden om problemet og symptombehandler i stedet for at gå ned i koden og finde fejlen.

Enten - som buzzzz - skriver step dig igennem koden, eller endnu bedre; refactor din kode - del den ud i fornuftige metoder og find ud af hvor den dør.
Avatar billede _et Praktikant
13. juni 2012 - 12:22 #8
Jeg giver dig ret. Men programmet er implementeret med en DEL goto sætninger hvilket jeg mistænker for at føre til en akkumulering af mem forbrug. derfor ønsker jeg også at overvåge størrelsen af stack/heep ("antal/sizeof" variable) foruden bare antallet af funktions kald i stack for det er nemlig altid 1.
Avatar billede _et Praktikant
13. juni 2012 - 12:25 #9
ang. refactor, så er det noget med deadline. Der skal senere laves et nyt system til at overtage, men dette allerede lavede skal virke om én ude SIDEN...

Det er ikke min beslutning, jeg arbejder her bare. ;-)
Avatar billede Syska Mester
13. juni 2012 - 12:36 #10
Fortæl dem det er en dum beslutning.

Nu har du allerede ventet i flere timer på en løsning i stedet for at refactor ud og løse problemet på den rigtige måde.

GoTo i .NET er da sygt ... det har jeg aldrig set i produktions kode ... men ... hvis det er lavet med GoTo så er det klart at stack trace ikke vil virke.

Hvad er det du vil vide mem forbruget på? Hvis du vil derhen, skal du vist have fat i "memdbg" eller hvad det nu hedder, men så er det vist hurtigere at skrive det om.

Jeg kan ikke forstå det kan betale sig ikke at lave det om nu, i stedet for at bruge så mange timer og resourcer på at fikse et problem der burde være lige til.

Jeg håber dine kollegaer over dig bliver  mere fornuftige i fremtiden :-)
Avatar billede _et Praktikant
13. juni 2012 - 12:42 #11
Jeg kan kun give dig ret, men det er nu engang sådan det er..

Takker for forsøget, svar hvis i ønsker point
Avatar billede Syska Mester
13. juni 2012 - 12:47 #12
Hvis du får stackoverflow i "GoTo" kode ... så er det helt sikkert også noget der kommer til at ske rekursivt.

Så er der kun en vej ... debug debug debug på den hårde måde.

Kan du ikke bare bruge: Console.WriteLine en masse steder, så må du da til sidst finde ud af hvad der bliver kaldt igen og igen.

Memory footprint giver ikke stackoverflow, men MemoryException af en eller anden art.
Avatar billede _et Praktikant
13. juni 2012 - 13:50 #13
Takker..
Avatar billede arne_v Ekspert
17. juni 2012 - 01:21 #14
Jeg er ogsaa meget sketisk overfor udskrivning af stack forbrug som en noedvendig del til at finde et stack overflow.

Men hvis du vil saa er 32 bit koden her (64 bit koden vil se lidt anderledes ud).

sp.c


#include <windows.h>

__declspec(dllexport) DWORD get_sp()
{
    CONTEXT ctx;
    BOOL stat;
    ctx.ContextFlags = (CONTEXT_FULL);
    stat = GetThreadContext(GetCurrentThread(), &ctx);
    return stat ? ctx.Esp : -1;
}


spwrap.cs


using System;
using System.Runtime.InteropServices;

namespace NativeUtil
{
    public class SPWrap
    {
        [DllImport("sp.dll")]
        private static extern int get_sp();
        private long basesp;
        public SPWrap()
        {
            basesp = get_sp();
        }
        public long DeltaStack
        {
            get { return basesp - get_sp(); }
        }
    }
}


sptest.cs


using System;

using NativeUtil;

public class Test
{
    private static SPWrap sp;
    private static void Rec(int n)
    {
        Console.WriteLine(sp.DeltaStack);
        if(n > 0) Rec(n - 1);
    }
    public static void Main(string[] args)
    {
        sp = new SPWrap();
        Console.WriteLine(sp.DeltaStack);
        Rec(100);
        Console.WriteLine(sp.DeltaStack);
    }
}
Avatar billede _et Praktikant
18. juni 2012 - 08:04 #15
Jeg ønsker primært at verificere at stack ikke vokser. Derfor ønsker jeg at udskrive hvordan forbruget udvikler sig.

Jeg takker for hjælpen.
Kom med et svar arne..
Avatar billede arne_v Ekspert
18. juni 2012 - 14:24 #16
ok
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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