[C++/QT4/Windows] Błąd aplikacji. Naruszenie pamięci.

0

Witam.

Mam problem z aplikacją, która jest aktualnie w trakcie tworzenia.

Otóż jest to aplikacja bazodanowa ( C++ / MySQL / QT4 ).

Edit : IDE Code::Blocks

Na maszynie, na której aplikacja jest tworzona wszystko działa bez problemów.

Problem zaczął się gdy chciałem przetestować aplikację na czystym systemie ( zrobiłem to na fizycznej i wirtualnej maszynie ).

Gdy uruchamiam aplikację pojawia się błąd naruszenia pamięci.

Uruchomiłem więc Ollydbg, żeby sprawdzić co się dzieje i tutaj byłem zaskoczony. Otóż aplikacja uruchomiona poprzez debuger Ollydbg ( na maszynie testowej ) działa bez problemów. Nie ma żadnych błędów.

Testowałem aplikację w wersji release jak i debug.

Poproszę o jakieś sugestie bo jak na razie nie wiem o co chodzi. Trochę mało informacji, ale może ktoś już spotkał się z takim problemem.

Pozdrawiam.

0

Trochę mało informacji! Czy jest to aplikacja wielowątkowa? Czy róznica jest miedzy wersjami build i realace

Jeśli błąd pojawia się tylko podczas normalnego działania programu musisz dodać logi do programu, a potem przeanalizować te logi (dużo głupawej roboty, ale zwykle pomaga).

Herk napisał(a)

Testowałem aplikację w wersji release jak i debug.
No i jaki wynik? Rożnica jest miedzy tymi wersjami, czy może między nimi nie ma różnicy a ważne jest czy program jest uruchomiony przez debugger?

0

Różnica pomiędzy release a debug polega na użyciu różnych bibliotek mysql ( dla release opt a dla wersji debug bibliotegi debug ).

Obie werje zachowują się tak samo, zarówno przy zwykłym uruchamianiu jak i poprzez debugger.

Chyba nie pozostaje nic innego jak spróbować dodać logi do programu.

Dzięki za tą wskazówkę.

0

Tak więc logi już okazały się być przydatne :-)

Aplikacja "wysypuje się" podczas inicjalizacji zmiennych danymi pobranymi z bazy.

Robię to w dość specyficzny sposób, ponieważ rezultat zapytania bazy danych, przechowywany jest w zmiennej typy MYSQL_ROW, a pobrane dane muszę przypisać do zmiennych typu char. W dokumentacji MySQL ( praktycznie też to sprawdziłem ) strcpy dla typu MYSQL_ROW i char nie działa poprawnie.

Robię to w ten sposób :

Jest to metoda klasy odpowiedzialnej za logowanie użytkownika do bazy danych.

_wiersz - tak jak wyżej napisałem, typ MYSQL_ROW ( tablica wiersz[0], wiersz[1] )

element - składnik klasy typu char *

pole - numer kolumny danego wiersza

_dlugosc - to mysql_fetch_lengths(rezultat), również typ tablicowy, określa rozmiar kolejnych elementów pobieranych z bazy danych

mysqlrow_to_char(MYSQL_ROW _wiersz, unsigned long  * _dlugosc, char *& element, int pole)
    {
        char str_buffer[100];   // zmienna pomocnicza

        // wyzerowanie zmiennej str_buffer
        ZeroMemory(str_buffer, sizeof(str_buffer));

        if(element != NULL)
        {
            delete element;
            element = 0;

            // kopiowanie obszaru pamięci
            memcpy(str_buffer, _wiersz[pole], _dlugosc[pole]);
            // dbcięcie zmiennej buffer
            str_buffer[_dlugosc[pole]] = 0;
            // alokowanie pamięci dla składnika klasy
            element = new char[strlen(str_buffer)+1];
            // przypisanie składnikowi klsay wartosci
            strcpy(element, str_buffer);

        }
        else
        {
            // kopiowanie obszaru pamięci
            memcpy(str_buffer, _wiersz[pole], _dlugosc[pole]);
            // dbcięcie zmiennej buffer
            str_buffer[_dlugosc[pole]] = 0;
            // alokowanie pamięci dla składnika klasy
            element = new char[strlen(str_buffer)+1];
            // przypisanie składnikowi klsay wartosci
            strcpy(element, str_buffer);
        }

    }

Pewnie tutaj coś jest źle, ale za bardzo nie potrafię dojść co.

Można prosić o uwagi co do tego kodu ?

Pozdrawiam

0

Nie lepiej wykorzystać tutaj moduł QtSQL ?

http://doc.trolltech.com/4.5/qtsql.html

Powinieneś nie mieć tego typu problemów wtedy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1