Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

C++ builder jak podejrzeć kiedy zmienia się dana

wegrzyn 08 Mar 2018 10:12 438 6
  • #1 08 Mar 2018 10:12
    wegrzyn
    Poziom 12  

    Napisałem programik, który ma nieco ponad 1000 linii kodu i za nic nie wiem w którym momencie jedna z danych się zmienia i powoduje "wywalanie" programu. Jak to sprawdzić, jak podejrzeć, kiedy i w jakim momencie dane ulegają modyfikacji?

    0 6
  • #2 08 Mar 2018 17:57
    Dżyszla
    Poziom 42  

    Musiałbyś zlokalizować ją w pamięci i debuggując linia po linii sprawdzać zawartość spod tego adresu.
    Ale prościej - pewnie masz gdzieś wyciek lub niewłaściwą adresację, które do tego doprowadza. Po prostu analiza wszelkich adresowych (w tym tablice) odwołań.

    0
  • #3 08 Mar 2018 18:35
    JacekCz
    Poziom 36  

    1. Nie ma lepszego debuggera, niż krytyczna druga para oczu. 1000 linii to nie jest jakoś bardzo dużo. najważniejsze czy źródła mają dobry styl, są w rzeczywistym C++ (czy mix C). C użyte w kiepskim stylu (w dobrym też, tylko mniej) jest bardzo podatne na jeżdżenie po zmiennych.
    2. istnieje coś takiego jak conditional breapoint (breapoint, jak to po polsku?, z warunkiem). To ma służyć właśnie do tropienia niekontrolowanych zmian zmiennych. Działało to przeważnie nieco gorzej niż "zwykłe" breakpointy.

    0
  • #4 08 Mar 2018 19:41
    ostrytomasz
    Poziom 22  

    CodeGuard Twoim przyjacielem, przy błędach niskopoziomowych moim zdaniem wart więcej niż pięć par oczu. Project/Options/Codeguard, All Codeguard options on w wersji Debug, w wersji Release zostawiasz wyłączony.

    Do śledzenia zmiennej można użyć też Run/Add breakpoint/Data breakpoint, nie wiem tylko jaką masz wersję bo w najnowszych darmowych wersjach starter trzy czwarte funkcji debuggera jest wycięte.

    0
  • #5 16 Mar 2018 17:12
    ble___
    Poziom 11  

    Może też pomocne - "Gettery i Settery" (wyszukiwarka powinna wyjaśnić termin), jak się będzie tylko ich używać to można łatwo wstawić w nich breakpoint albo dopisać wywołanie OutputDebugString() i nie musieć nawet klikać przy breakpoint'ach jeśli wywołań będzie dużo.
    W tym środowisku jest sztuczka która umożliwia dodanie Getterów i Setterów z niewielkimi tylko zmianami kodu, nie trzeba szukać gdzie zmienna została wykorzystana:
    - zamienić nazwę zmiennej (tradycyjnie dodaje się na początku literkę F)
    - dodać property o nazwie zmiennej np.

    Code:

    String FText;
    void __fastcall SetAText(String tekst)
    {
        FText = tekst;
    };
    String __fastcall GetAText()
    {
        return FText;
    };
    __property AnsiString Text = {read = GetAText, write = SetAText};

    0
  • #7 16 Mar 2018 18:31
    JacekCz
    Poziom 36  

    O co autorowi chodziło, to nie wiemy bo się zmył.

    Nie wiemy czy to kod obiektowy, czy klasyczne tricki C.

    Jak tak coś źle alokuje, jeździ poza granicami buforów, gettery/settery tego nie zabezpieczą. Settery są dobre do kontroli dostepu do elementów, gdy kod obiektowy już jest wiarygodny. Pewne getery i settery ma Java i C# (setter jest tam 'czysty', gwarantowane, że nie ma wejść z boku) - w C++ mogą zostać oszukanie, jeśli ktoś s zboku modyfikuje ramki

    EDIT z klasycznych kanonów teoretycznego OOP które są w praktyce niedowartościowane w C++, to obiekty niezmienne (immutable). Bardzo zmniejsza stress, gdy struktury danych tzreba bardzo daleko przekazać, do innych akcji, wątków

    Propozycja @ble___@ zakłada że na rozwiązanie obiektowym, i że będzie to prowadzić w dialekcie C++ borland, de facto jedyny cel to 'bądź podobny do Delphi'. Dialektów języków zwykle nie szanuję, więcej złego zrobiło upodobnienie Borland C++ do Delphi, niż dobrego

    0