» »

[C#] Sesutje aplikacije

[C#] Sesutje aplikacije

ql000 ::

Delam aplikacijo, kjer je pomemebno, da sta dva fizična objekta sinhronizirana, Unibrain kamera in Microscribe roka. Kamero krmilim preko FireWire, roko pa preko serijskih vrat. Ko prileti frame iz kamere v comp, se sproži Callback metoda, ki zahteva koordinate roke v tistem trenutku. Podatki (slika in koordinate) se shranjujejo v bytno polje v memorijo, pač zaradi hitrosti, ko je pa celotna meritev opravljena pa se podatki shranijo na disk. Občasno se zgodi, da se aplikacija sesuje in vedno je kriv stavek:

Marshal.Copy(frameData, FrameBuffer, Counter*FrameSize, FrameSize);


frameData je podatke tipa IntPtr, FramBuffer je byte[], Counter*FrameSize, FrameSize sta neka indexa, ki se povečujeta z vsakim framom, ki prileti.

Zakaj pride do sesutja, kak memory leakage,...?


Tu je še cela CallBack metoda:
public static void OnFrameArrived(IntPtr frameData)
        {
            StopWatch.Reset();
            StopWatch.Start();

            RunMicroscribe(out x, out y, out z);                                        // Ko pride frame pošlji koordinate iz roke!

            StopWatch.Stop();

            System.Console.WriteLine(" Pretečen čas: {0}ms", StopWatch.Elapsed.TotalMilliseconds.ToString());

            Marshal.Copy(frameData, FrameBuffer, Counter*FrameSize, FrameSize);

            CoordArray[3*Counter] = x;          // V CoordArray vpisujem po 3 koordinate
            CoordArray[3*Counter + 1] = y;
            CoordArray[3*Counter + 2] = z;

            System.Console.WriteLine(" Koordinate so: X={0}, Y={1}, Z={2}", x, y, z); // Izpiši koordinate            
            System.Console.WriteLine(" Counter = {0}", Counter);

            Counter = Counter + 1;  // Iteracija Counterja!
        }


Ker hec je v tem, da zadeva deluje, občasno pa vseeno pride do sesutja.
  • spremenil: ql000 ()

Vesoljc ::

mogoce res ne bi skodilo, da poves KATERI eror ti debuger pljune ven...
Abnormal behavior of abnormal brain makes me normal...

mHook ::

Če se ti exception pojavi dokaj hitro (oz. znano kdaj), potem se z debugerjem priključi na proces in nastavi breakpoint.

Okoli memory leakinga pa si pomagaj s ProcessExplorerjem in/ali kakšnim profilerjem ( .NET 2 Profiler, ANTS Profiler,...).

ql000 ::

Unhandled Exception: System.ArgumentOutOfRangeException: Requested range extends
past the end of the array.
at System.Runtime.InteropServices.Marshal.CopyToManaged(IntPtr source, Object
destination, Int32 startIndex, Int32 length)
at System.Runtime.InteropServices.Marshal.Copy(IntPtr source, Byte[] destinat
ion, Int32 startIndex, Int32 length)
at Test_microscribe.Program.OnFrameArrived(IntPtr frameData) in C:\Documents
and Settings\Darinka\My Documents\Visual Studio 2005\Projects\Test microscribe\T
est microscribe\Program.cs:line 191
at Firei.FrameCallback(UInt32 uCameraIndex, Double dblSampleTime, Byte* pBuff
er, tagBITMAPINFOHEADER* pbih, Void* Context)


System.ArgumentOutOfRangeException: Requested range extends past the end of the array. --> ta mi je najbolj sumljiv, samo, zakaj zadeva potem večinoma dela?

Vesoljc ::

izpisuj si indexe ter velikost arraya
Abnormal behavior of abnormal brain makes me normal...

ql000 ::

Evo sem pogledal! Zgodba je taka, da mora biti Counter*FrameSize manjši od FrameBuffer.Length. In to dejansko je. Vrednosti indexov in velikosti so iste, tako v primeru, ko se aplikacija izvede v redu, kot tudi v primeru crash-a!

A je varijanta, da katera druga aplikacija ali proces, lahko tudi znotraj iste aplikacije, šara po tem delu memorije, ki jo jaz uporabljam?

Hec je tudi v tem, da dokler delam z malim poljem, ranga nekaj elementov, zadeva deluje 100%, tukaj delam z poljem ranga 55.290.000 bytov, se mu pa sfuzla! RAM-a imam 512MB, tako, da to ne bi smel biti problem.

Če ne bo šlo drugače, bom v ta del Marshal.Copy fliknu Exception, ta se vedno pojavi pri zadnjem fram-u. Zadnji frame in koordinato zavržem, pa bom videl, kaj bo. Ta Marshal.Copy mi malo smrdi.

Zgodovina sprememb…

  • spremenil: ql000 ()

ql000 ::

Zdej mi je kapilo! Včasih se zgodi, da mi Counter, to je nek globalni števec, ki šteje število frame-ov, ki priletijo v računalnik, preskoči v nedovoljeno vrednost.

System.Console.WriteLine(" Zaganjam kamero...");
            Camera1.InitStream(0,0);                   // Tega je treba zinicializirat, da baraba dela!!
                                                       // MFI se ne sklada z CFI!!, tako, da Help file ni ravno od koristi
            
            Camera1.CallbackFormat = FiPixelFormat.RGB_24;
            Camera1.onFrameArrived += new FiCamera.OnFrameArrived(OnFrameArrived);

            Camera1.Run();                              // Zalaufam kamero!

            for ( ; ; )                                 // Ena neskončna zanka, da vidim, kaj se sploh dogaja
            {
               
                //Camera1.SaveFrame(@"c:\programi\myframe.bmp");
                if (Counter == FrameNo)                     // XX framov poberem in zaključim
                {
                    
                    Camera1.Stop();                     // Ugasnem kamero
                    Camera1.ShutdownStream();
                    break;                              // Izhod iz zanke
                }
            }

            System.Console.WriteLine(" Shranjujem podatke! Prosim pocakaj...");



Pri if (Counter == FrameNo) zna priti do lapsusa. Counter je globalna spremenljivka, tipa Int32. Kako se zasigurat, da ne pride do overflowa dovoljene vrednosti?

Vesoljc ::

vsake tolk jih resetiras?
Abnormal behavior of abnormal brain makes me normal...

ql000 ::

Takoj ob inicializaciji ga postavim na 0. Aplikacija je živa znotraj ene meritve. Kar pomeni, da se števec uporablja samo enkrat.

Vesoljc ::

pa dejansko gres cez to mejo (232 / 2)??

cist tko, ni bolje ce najprej ugasnes stream, potem pa se kamero?
Abnormal behavior of abnormal brain makes me normal...

ql000 ::

Sej v tem je hec, ker posnamem 60 frame-ov. Glede streama in ustavljavnja kamere se strinjam, samo sem videl v nekem sourcu od proizvajalca kamere, da najprej ugasne stream, šele potem pa kamero.

Včasih se zgodi, da enostavno ne upošteva iteracije števca. Mogoče malo preveč mikrokontrolersko razmišljam :\?!

Jean-Paul ::

Se mi rahlo dozdeva, kaj bi lahko bilo. Za zacetek poskusi preverjati tvoj stevec tudi v callback rutini. Ce stevec preseze maksimalno stevilo framov, ki jih lahko shranis v svoj buffer, potem izpusti kopiranje v ta buffer. Ce bo to obrodilo sadove, smo na dobri poti. Javi!

LP


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

kako narediti program ki bere drugi program

Oddelek: Programiranje
465751 (4064) imagodei
»

[c#] naloga za maturo...rabim majhno pomoc

Oddelek: Programiranje
192333 (1670) ql000
»

C# in slika iz kamere

Oddelek: Programiranje
61352 (1236) ql000
»

[C#] IndexOutOfRange Exception

Oddelek: Programiranje
81303 (1148) ql000
»

[C#] unmanaged->managed code

Oddelek: Programiranje
112142 (2017) Zzzzzzz

Več podobnih tem