NASZE SERWISY:    ANDROID   LINUX   MAEMO   SYMBIAN   WEBOS




Hosting sponsoruje:



GRIN3 - polskie fonty

Profesjonalne czcionki z polskimi znakami - czcionki.com

OpenMobile on Facebook


 

Jak wykryć Panic'a ALLOC w DBMS

Jak wykryć Panic'a ALLOC w DBMS

Postprzez baroo_symbian » 2 grudnia 2008, o 19:03

Witam
Próbuję odpalić do swoich potrzeb nieco zmodyfikowany przykład z http://wiki.forum.nokia.com/index.php/D ... Navigation . Problem w tym, że niby wszytko działa ok, ale jeżeli w trakcie porgramu wywołuję funkcję dodającą rekordy do tabeli to porgram kończąc wyrzuca Panic ALLOC. Funkcje, kórymi to wywołują mają następującą postać:

Kod: Zaznacz cały
   TMyTableItem obiekt;

   CMyDatabase* baza = CMyDatabase::NewL();
   
   _LIT(KItem1, "Juice");
   
   obiekt.Reset();
   obiekt.iName.Copy(KItem1);
   obiekt.iDone = 0;
   obiekt.iKey = 0;
   
   baza->AddMyTableRecord(obiekt);  // <- to powoduje Panic ALLOC przy wyjściu
   
   baza->RemoveMyTableRecord(obiekt);
   
   obiekt.Reset;
   
   baza->GetMyTableFirstRecord(obiekt);
   
   TInt count;
   
   baza->RemoveAllMyTableRecords(count);
   count = baza->GetMyTableCount();
   
   // Clean memory
   delete baza;


Wiem, że istanieje coś takiego jak HookLogger, ale dla mnie zrozumienie idei w jaki sposób można odszukać obiekt powodujący panica jest co najmniej trudne. Jeżeli ktoś byłby chętny do pomocy, lub wytłumaczenia jak wykryć panica będę wdzięczny.

Pozdrawiam
Bartek

poprawiłem temat // matchojs85
Ostatnio edytowano 2 grudnia 2008, o 19:05 przez matchojs85, łącznie edytowano 1 raz
Powód: temat
baroo_symbian
1%
1%
 
Posty: 2
Dołączył(a): 2 grudnia 2008, o 18:16
    WindowsXPOpera

Re: Jak wykryć Panic'a ALLOC w DBMS

Postprzez sebax » 9 grudnia 2008, o 10:13

Generalnie nie zwalniasz jakiejs tam pamieci, robisz new czy malloc ale nie ma delete czy free. Dobrą praktyką jest zwalnianie zajetej wczesniej pamieci, jest to szczegolnie wazne kiedy program dziala dlugo np czasami telefonu nie wylacza sie przez nawet kilka miesiecy i powiedzmy ksiazka adresowa dziala praktycznie caly czas... gdyby przy kazdym przegladaniu tracila 1kB to po jakims czasie pamiec by sie zapchala i trzebaby wylaczyc program albo nawet zrestarwoac telefon.

To okienko z panic na koncu programu wyswietla adres niezwolnionej pamieci, kiedys byl taki trick w visual studio, ze mozna bylo w momencie panicwpisac w okno watch ten adres z castem na cbase i podejrzec nazwe klasy w vftable ale nie wiem czy to dziala z nowymi sdk i nowym visualem, lepiej uzyc hookloggera:P

A hookloggera uzywa sie prosto..
1) scagasz i instalujesz
2) odpalasz coommand prompta, wchodzisz do katalogu gdzie jest hooklogger i wykonujesz setuphooks, jak wpiszesz samo setuphooks to wyswietli ci sie help co i jak wpisac
3) uruchamiasz emulator i swoj program, konczysz program i pojawia sie panic z alloc, ide zatrzymuje sie w na panic w jakiejsbibliotece systemowej
4) przechodzisz do hookloggera, na zakladce threads szukasz swojego programu, zaznaczasz tylko swoj program....
5) przechodzisz do zakladki heap, naciskasz list all allocs i pojawia ci sie lista allokacji
6) w zaleznosci od tego ile napsules tyle jest wpisow, proponuje zaczac od gory i naciskac na elementy listy
7) po nacisnieciu pojawi ci sie cos nazywanego callstack czyli stos wywolania, na liscie szukasz funkcji ze swojego programu, np w sdk s60 brak symboli do debugowania i wszystkie funkcje systemowe oznaczone sa jako ordinalcostam, w sdk uiq sa nazwy ladnie, czasami na liscie moga byc wpisy calkowicie bez twoich funkcji, olej je
8) naciskasz na wpis z twoja funkcja i pokazuje ci sie okienko z twoim kodem i dokladnie miejsce w ktorym zrobiles new czy jakas funkcje ktora zrobila new
9) poprawiasz w kodzie wyciek, moze wiecej z listy i znow zabawa od nowa az na koncu programu nie bedzie juz panic

PS kod ktory podales nikomu nic nie powie, jakbys dodatkowo podal kod funkcji CMyDatabase::AddMyTableRecord to moze ktos by mogl pomoc...
PS2 najczesciej ludzie nie kasuja obiektu CDbColSet, CDbColSet* colSet=mojaTabela.ColSetL(); :/
sebax
10%
10%
 
Posty: 48
Dołączył(a): 19 grudnia 2006, o 00:06
    WindowsXPFirefox

Re: Jak wykryć Panic'a ALLOC w DBMS

Postprzez baroo_symbian » 10 grudnia 2008, o 00:51

Wygląda to tak:
Kod: Zaznacz cały
TInt CMyDatabase::AddMyTableRecord(TMyTableItem& aMyTableItem)
{
    if(aMyTableItem.iName.Length()==0)
   {
        return KErrGeneral;
    }
   
   TQueryBuffer QueryBuffer;
   // Query: SELECT * FROM MyTable
   QueryBuffer.Copy(_L("SELECT * FROM "));
   QueryBuffer.Append(KMyTable);
   
   iMyDatabase.Begin();

   RDbView MyView;
   MyView.Prepare(iMyDatabase, TDbQuery(QueryBuffer));
   CleanupClosePushL(MyView);

   MyView.InsertL();
      
   MyView.SetColL(2, aMyTableItem.iName);
   MyView.SetColL(3, aMyTableItem.iDone);
   MyView.SetColL(4, aMyTableItem.iKey);
   
   MyView.PutL();
   
    // Here we are getting autoincremented unique MyTableId.
   aMyTableItem.iPrimeId = MyView.ColInt(1);
   
   CleanupStack::PopAndDestroy(1); // Myview
   
   // Apply changes
   iMyDatabase.Commit();

   // Set cursor on the firts row
   iMyTableView.Reset();
   
   // Refresh table view
   PrepareMyTableView();

   // Return values
   GetMyTableLastRecord(aMyTableItem);
    return KErrNone;
}
baroo_symbian
1%
1%
 
Posty: 2
Dołączył(a): 2 grudnia 2008, o 18:16
    WindowsXPOpera

Re: Jak wykryć Panic'a ALLOC w DBMS

Postprzez sebax » 19 grudnia 2008, o 23:34

Sprawdzaleś hookloggerem? Podajesz jakies swoje klasy a skad ja mam wiedziec co jest w srodku?

PS widze, ze wzioles ten przyklad z wiki na forumnokia, moim zdaniem ten przyklad jest lekko glupawy, zaciemnia ogolne idee przez jakies zabawy z buforami... dla poczatkujacego to jest mylace, lepiej zobacz sobie przyklad dbms z sdk, nie ma tam takich glupot, pamietaj, ze wiki jest wiki i nie zawsze tam musi byc wszystko super
sebax
10%
10%
 
Posty: 48
Dołączył(a): 19 grudnia 2006, o 00:06
    WindowsVistaFirefox


Powrót do Symbian C++

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość

cron