logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[AS7][Debuger] - ciągle nie radzi sobie z long int - czy to ja coś knocę?

11 Gru 2015 20:16 1341 18
  • #1 15231751
    Konto nie istnieje
    Konto nie istnieje  
  • #2 15231910
    tmf
    VIP Zasłużony dla elektroda
    To nie kwestia debugera, tylko trywialności przykładu, który został przez optymalizator potraktowany tak, że połowę kodu wyrzucił, w tym zmienną lokalną. A nie da się debugować czegoś, czego nie ma. Zaglądnij do pliku lst a się przekonasz. Utwórz zmienną globalną, dodaj ewentualnie volatile, żeby zniweczyć dzieło optymalizatora i sprawdź wtedy. A tak BTW, to debuguje się zwykle przy -O1, a nie Os i wtedy problemu w większości przypadków też nie ma.
  • #3 15231939
    Konto nie istnieje
    Konto nie istnieje  
  • #4 15231964
    tadzik85
    Poziom 38  
    To ty się mylisz. rejestr to nie zmienna.
  • #6 15231970
    Konto nie istnieje
    Konto nie istnieje  
  • #7 15231974
    tadzik85
    Poziom 38  
    Piotrus_999 napisał:
    Jak optymalizator wywali to:
    [AS7][Debuger] - ciągle nie radzi sobie z long int - czy to ja coś knocę?


    wywali != zoptymalizuje
  • #8 15232115
    Konto nie istnieje
    Konto nie istnieje  
  • #9 15232371
    zumek
    Poziom 39  
    A w poczciwym AvrS 4.xx, przy optymalizacji -O1 ...

    [AS7][Debuger] - ciągle nie radzi sobie z long int - czy to ja coś knocę?
  • #10 15232385
    Konto nie istnieje
    Konto nie istnieje  
  • #11 15232949
    tmf
    VIP Zasłużony dla elektroda
    Postaraj się zrozumieć jak działa debuger to wszystko stanie się jasne. Debuger nie analizuje kodu asemblerowego, lecz posługuje się informacjami dla debugera generowanymi przez kompilator. Jeśli jakaś zmienna jest wyrzucana w trakcie optymalizacji ze względu na trywialność to informacja o niej nie znajdzie się w generowanych informacjach dla debugera i podczas debugowania takiego kodu ona po prostu nie istnieje.Generalnie tak dzieje się zawsze jeśli optymalizator dokona znaczących zmian w kodzie - nie ma wtedy prostego przełożenia z kodu programu na wygenerowany kod wynikowy, w efekcie nie ma sensu dla takiego fragmentu generować informacji dla debugera. To, że to działa np. w starym AVRStudio nie zależy od IDE lecz najpewniej od innych opcji kompilacji, czy faktu, że wykorzystuje on stary (sprzed 5 lat) kompilator, który po prostu może tak agresywnie nie optymalizować kodu. Tak czy siak, to co masz podczas debugowania nie zależy od IDE lecz od informacji generowanych przez kompilator.
    BTW, przetestowałem twój kod i stwierdzam, że co najmniej wprowadzasz nas w błąd. Przy wyłączonej optymalizacji zmienna ind jest widoczna w czasie debugowania... co w 100% potwierdza to o czym z kolegą @tadzik85 pisaliśmy wcześniej.
  • #12 15233265
    Konto nie istnieje
    Konto nie istnieje  
  • #14 15233590
    tmf
    VIP Zasłużony dla elektroda
    Piotrus_999 napisał:
    Wybacz tmf - wiem jak dziala debuger.

    przechowywanie w pamięci nie ma nic do rzeczy do debug info.

    gdyby tak bylo jak piszesz to wszystkie typy zmiennych zachowywały by sie identycznie. A tak nie jest


    No cóż, jeśli wiesz lepiej to tkwij w swoim problemie. Warto się zastanowić dlaczego z float nie miałeś problemów. Nic też nie pisałem o przechowywaniu w pamięci. Przeczytaj jeszcze raz to co napisałem jako uzasadnienie dlaczego czasami takich zmiennych nie widać.
    A tu mój screenshot dla niedowiarków:
    [AS7][Debuger] - ciągle nie radzi sobie z long int - czy to ja coś knocę?
  • #15 15233858
    Konto nie istnieje
    Konto nie istnieje  
  • #16 15234510
    tmf
    VIP Zasłużony dla elektroda
    Piotrus_999 napisał:
    @tmf - napisałeś posrednio - brak optymalizacji oznacza przechowywanie w pamieci - co zresztą widac na Twoim sreenshocie. Jak widzisz strukture tez wyswietla bez problemow. Jedyny typ z problemami to long int. To wszystko. Zadzwonię w poniedzialek do atmela i zapytam o ten przypadek. Tym co powiedza podziele sie na forum :)

    Milego weekendu życze.


    Źle zrozumiałeś moją wypowiedź. Ta zmienna równie dobrze mogłaby być w rejestrach i też byłaby poprawnie wyświetlana. Tylko, że przykład musiałby być nietrywialny. Ważna jest nie lokalizacja zmiennej, lecz jej istnienie. W powyższym kodzie, optymalizator tak zmienia kod programu, że zmienna w postaci jawnej przestaje istnieć i nie są w związku z tym generowane informacje dla debugera, z czego wynika brak możliwości jej śledzenia w AS. Aby to ominąć musiałem wyłączyć optymalizator (-O0). Problem jest częsty, stąd też debuguje się kod zazwyczaj na poziomach -O0 lub -O1 (tu już niektóre zmienne znikają, ale za to łatwiej wykryć problemy z brakiem modyfikatora volatile. Dla -O0 praktycznie nie da się wykryć problemów związanych z brakiem tego modyfikatora.
  • #17 15234888
    Konto nie istnieje
    Konto nie istnieje  
  • #18 15240122
    Konto nie istnieje
    Konto nie istnieje  
  • #19 15242854
    Konto nie istnieje
    Konto nie istnieje  
REKLAMA