[BCB2007] Debug-kiedy zmienia się wart zmiennej. RUCH MYSZY!

0

Witam,

CodeGear C++Builder 2007.
próbuję znaleźć błąd w programie. Jest forma, która tworzy wątek (klasa K_WATEK dziedzicząca po TThread). Klasa K_WATEK ma jako składnik strukturę, której jeden składnik to też struktura (w uproszczeniu):

ypedef struct{
  BITMAPINFOHEADER bmiHeader;
  RGBQUAD pal[256];
} BITMAPA;

class K_WATEK{
 public:
    BITMAPA binf;
...
}

Podczas działania wątku gdzieś zmienia mi się składnik binf.bmiHeader.biClrUsed i inne (tylko w wątku są używane).

Jak debuggera ustawić, żeby zgłaszał mi każdą zmianę określonej zmiennej? Tryb kompilacji jest oczywiście DEBUG, poustawiane w opcjach projektu opcje...

0

słówko public już wskazuje, że się źle do tego zabrałeś!
Najwyraźniej naruszasz podstawową zasadę, należy używać akcesorów, by operować na zmiennych na zewnątrz klasy. W takim wypadku, wykrywanie debuggerem kto zmienia zmienną będzie dziecinnie proste (nie mówiąc już o tym, że powinieneś zapewnić synchronizację).

0

słówko public już wskazuje, że się źle do tego zabrałeś!

Ok, źle napisałem - to nie jest w public - jest tak:

class K_WATEK : public TThread{
    BITMAPA binf;
 public:    
...
}

NIE chodzi mi o wykrycie zmiany typu:

binf.bmiHeader.biClrUsed = 4;

tylko o zmiany typu, wyjechania poza zakres np. tablicy i zamazanie obszaru binf.bmiHeader.biClrUsed.

0

Nie da się.
Jedyne co możesz zrobić to postawić gdzieś brakepoint warunkowy - program zatrzyma się na brakepoincie jeśli jakiś warunek będzie spełniony (wyrażenie zwróci true):
View->Debug windows->Brakepoints->[prawy klik na wybrany brakepoint]->Properties->Condition.

0

=====================================================
Do problemu powyżej: doszedłem do tego, że jak nie ruszam myszą to jest OK,
a jak ruszam na oknie, nad kontrolkami to się wywala!! Do wątku nie jest przekazywany
żaden wskaźnik na kontrolkę z formy. Generalnie wywalają się funkcje GetDIBits i SetDIBits.

OK, koniec.
W wątku tworzyłem 2 TBitmapy dynamicznie i tylko w tym wątku ich używałem. Rozwiązaniem jest Lock / Unlock Canvasów.

0
adf88 napisał(a)

Nie da się.
Jedyne co możesz zrobić to postawić gdzieś brakepoint warunkowy - program zatrzyma się na brakepoincie jeśli jakiś warunek będzie spełniony (wyrażenie zwróci true):
View->Debug windows->Brakepoints->[prawy klik na wybrany brakepoint]->Properties->Condition.

da sie, przynajmniej w bardziej rozwinietych debuggerach -- nie iwem jak z tym CG stoi -- w kazdym badz razie, w pewnym miejscu programu gdzie ow obiekt bitmapy jest tworzony fizycznie, nalezy sobie postawic breaka, poczekac az sie zlapie, zapisac sobie adres tejże, obliczyc adres owego konkretnego pola, a nastepnie ustawic hardware breakpoint: write na ten adres na szerokosc np. 4B. et voila, juz masz wylapane wszystkie momenty zmiany tegoż miejsca w pamieci. ida/visualstudio obsluguja hwbpx

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