eGospodarka.pl

eGospodarka.plGrupypl.comp.programming › rzadki bład w programie w C++
Ilość wypowiedzi w tym wątku: 163

  • 1. Data: 2021-08-23 14:59:03
    Temat: rzadki bład w programie w C++
    Od: Robert Magdziarz <r...@g...com>

    Napisałem program w C++. Zawiera błąd którego szczegółów nie znam. Błąd (niepoprawne
    wartości zapisywane do pliku) występuje rzadko, nie wiem w jakich okolicznościach.
    Wstawiłem asercje i testuję, niestety nie udało mi się odtworzyć problemu.
    Jak podejść do problemu, jakiej strategii użyć? Co mogę zrobić poza asercjami?
    Debugowanie nie ma sensu bo błąd występuje zbyt rzadko.


  • 2. Data: 2021-08-23 15:44:34
    Temat: Re: rzadki bład w programie w C++
    Od: Maciek Godek <g...@g...com>

    poniedziałek, 23 sierpnia 2021 o 14:59:04 UTC+2 r...@g...com napisał(a):
    > Napisałem program w C++. Zawiera błąd którego szczegółów nie znam. Błąd
    (niepoprawne wartości zapisywane do pliku) występuje rzadko, nie wiem w jakich
    okolicznościach. Wstawiłem asercje i testuję, niestety nie udało mi się odtworzyć
    problemu.
    > Jak podejść do problemu, jakiej strategii użyć? Co mogę zrobić poza asercjami?
    Debugowanie nie ma sensu bo błąd występuje zbyt rzadko.

    Strategia, która pozwoli w najprostszy sposób wyeliminować ten "błąd", to uznać go za
    ficzer.

    A tak serio, jeżeli Twoja wiedza o tym błędzie jest tak duża, jak wiedza, którą się
    tu podzieliłeś, odnośnie programu, który napisałeś, to nie widzę wielkich nadziei na
    uporanie się z nim.

    Możesz chociaż napisać:
    - w jaki sposób błąd się objawia
    - jak duży jest program
    - na jakim etapie rozwoju programu pojawił się błąd
    - czy możesz łatwo przepisać program np. na C# albo Javę

    Możesz też poszukać w okolicy jakiegoś kolegi-programisty, usiąść z nim i wspólnie
    przejrzeć kod.

    Rzecz w tym, że jak piszesz w C++ albo C, to możesz łatwo popełnić błąd w rodzaju
    przypadkowego nadpisania obszaru w pamięci, i tego rodzaju błędy są raczej trudne do
    wykrycia.

    Jeden z moich ulubionych to kod w rodzaju takiego czegoś:

    printf("liczba wynosi: "+n);

    Programista wychowany na C# będzie zaskoczony tym zachowaniem, a tymczasem to jest w
    pełni legalny kod w C: do adresu literału znakowego (który sam w sobie jest dość
    losowy) dodajemy jakąś liczbę, która w rezultacie daje nam jakiś inny adres, i spod
    tego adresu próbujemy teraz przekazać argument do funkcji printf.

    Rezultatem jest "nieokreślone zachowanie", czyli może się tak naprawdę zdarzyć
    cokolwiek.

    Czasem pomaga kompilacja kodu z flagami -Wall albo -Wextra - może pomoże wskazać
    miejsce w kodzie, w którym jest jakieś podejrzane użycie języka.


  • 3. Data: 2021-08-23 16:04:11
    Temat: Re: rzadki bład w programie w C++
    Od: Robert Magdziarz <r...@g...com>

    poniedziałek, 23 sierpnia 2021 o 15:44:35 UTC+2 Maciek Godek napisał(a):
    > Strategia, która pozwoli w najprostszy sposób wyeliminować ten "błąd", to uznać go
    za ficzer.
    mogę nie zapisywać do pliku cache.xml nic gdy strs="", tzn wtedy nie cache'ować
    > Możesz chociaż napisać:
    > - w jaki sposób błąd się objawia
    w pliku cache.xml mam atrybut strs="" a powinien być niepusty string
    > - jak duży jest program
    ok. 7 tys wierszy
    > - na jakim etapie rozwoju programu pojawił się błąd
    w trakcie testowania dokonywałem poprawek w kodzie w miarę jak znajdywałem błędy,
    poprawki mogły coś popsuć
    > - czy możesz łatwo przepisać program np. na C# albo Javę
    nie mogę bo program używa Qt5, ponadto potrzebuję binarkę dla Windows i Linuxa
    > Możesz też poszukać w okolicy jakiegoś kolegi-programisty, usiąść z nim i wspólnie
    przejrzeć kod.
    to byłby dobry pomysł gdyby nie to że teraz nie jestem zatrudniony, pracuję nad
    programem w domu; algorytmy są na tyle skomplikowane że zrozumienie programu przez
    drugą osobę wymagałoby dużego zaangażowania, dużo czasu; całego kodu źródłowego
    nieznajomym wysyłać nie chcę
    > Czasem pomaga kompilacja kodu z flagami -Wall albo -Wextra - może pomoże wskazać
    miejsce w kodzie, w którym jest jakieś podejrzane użycie języka.
    dzięki, spróbuję; czy polecasz jakieś inne narzędzia? (nie jestem zaawansowany w C++,
    na co dzień programuję w PHP).


  • 4. Data: 2021-08-23 16:48:47
    Temat: Re: rzadki bład w programie w C++
    Od: Maciek Godek <g...@g...com>

    poniedziałek, 23 sierpnia 2021 o 16:04:12 UTC+2 r...@g...com napisał(a):
    > poniedziałek, 23 sierpnia 2021 o 15:44:35 UTC+2 Maciek Godek napisał(a):

    > w pliku cache.xml mam atrybut strs="" a powinien być niepusty string

    No dobra, to już jest coś.
    A teraz kilka pytań bardziej konkretnych: w jaki sposób i w jakich okolicznościach
    tworzysz plik cache.xml?
    W jaki sposób atrybut "strs" jest reprezentowany w pamięci podczas działania
    programu?
    Czy ten atrybut ma w pliku xml tylko jedną instancję, czy może jest wiele obiektów
    posiadających taki atrybut?
    Jakich operacji dokonujesz na obiekcie, który ma zostać zapisany do tego atrybutu?

    I czy to jest jedyny problem, jaki udało Ci się zaobserwować, czy może jest ich
    więcej?

    > > - jak duży jest program
    > ok. 7 tys wierszy
    > > - na jakim etapie rozwoju programu pojawił się błąd
    > w trakcie testowania dokonywałem poprawek w kodzie w miarę jak znajdywałem błędy,
    poprawki mogły coś popsuć

    Używasz systemu kontroli wersji (np. git) do rozwijania programu?

    > > - czy możesz łatwo przepisać program np. na C# albo Javę
    > nie mogę bo program używa Qt5, ponadto potrzebuję binarkę dla Windows i Linuxa

    Tutaj akurat Java dałaby radę, ale 7 tysięcy linii kodu to już faktycznie trochę
    jest.

    > > Możesz też poszukać w okolicy jakiegoś kolegi-programisty, usiąść z nim i
    wspólnie przejrzeć kod.
    > to byłby dobry pomysł gdyby nie to że teraz nie jestem zatrudniony, pracuję nad
    programem w domu; algorytmy są na tyle skomplikowane że zrozumienie programu przez
    drugą osobę wymagałoby dużego zaangażowania, dużo czasu; całego kodu źródłowego
    nieznajomym wysyłać nie chcę
    > > Czasem pomaga kompilacja kodu z flagami -Wall albo -Wextra - może pomoże wskazać
    miejsce w kodzie, w którym jest jakieś podejrzane użycie języka.
    > dzięki, spróbuję; czy polecasz jakieś inne narzędzia? (nie jestem zaawansowany w
    C++, na co dzień programuję w PHP).

    Możesz spróbować skompilować dwoma kompilatorami (np. clang i gcc) i zobaczyć, czy
    któryś z nich da jakiś dodatkowy komunikat. Poza tym istnieją różne narzędzia do
    statycznej analizy, ale często są płatne i wcale nie ma pewności, czy pomogą.


  • 5. Data: 2021-08-23 16:55:35
    Temat: Re: rzadki bład w programie w C++
    Od: Zbych <z...@s...com>

    On 23.08.2021 16:04, Robert Magdziarz wrote:

    >> Czasem pomaga kompilacja kodu z flagami -Wall albo -Wextra - może pomoże wskazać
    miejsce w kodzie, w którym jest jakieś podejrzane użycie języka.
    > dzięki, spróbuję; czy polecasz jakieś inne narzędzia? (nie jestem zaawansowany w
    C++, na co dzień programuję w PHP).

    Dołóż do listy jeszcze użycie sanitizerów:
    https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-O
    ptions.html

    I koniecznie logowanie poszczególnych przetwarzania danych na
    poszczególnych etapach, to jest chyba najlepsza metoda na rzadkie
    przypadki (pod warunkiem, że wcześniej czy później uda się powtórzyć błąd).




  • 6. Data: 2021-08-23 20:51:35
    Temat: Re: rzadki bład w programie w C++
    Od: Maciej Sobczak <s...@g...com>

    > Jak podejść do problemu, jakiej strategii użyć? Co mogę zrobić poza asercjami?
    Debugowanie nie ma sensu bo błąd występuje zbyt rzadko.

    valgrind

    Może problem w sensie niespodziewanych wyników występuje rzadko, ale być może
    niewłaściwe operacje (odczyt zmiennych przed zapisem, użycie zaraz po zwolnieniu
    bloku, itp.) są znacznie częstsze, tylko zwykle nie dają złych objawów. Valgrind
    pomaga takie sytuacje wykryć. Przy okazji wpływa na upływ czasu w programie, co może
    zarówno utrudnić jak i ułatwić szukanie błędów związanych z wielowątkowością. W
    każdym razie - jego użycie nic nie boli, puszcza się to tak (Linux):

    $ valgrind ./mojprogram

    Są jeszcze różne fajne opcje, nie pamiętam. Ale to jedno z najzacniejszych narzędzi
    diagnostycznych, ever.

    --
    Maciej Sobczak * http://www.inspirel.com


  • 7. Data: 2021-08-23 20:57:58
    Temat: Re: rzadki bład w programie w C++
    Od: Robert Magdziarz <r...@g...com>

    poniedziałek, 23 sierpnia 2021 o 16:48:49 UTC+2 Maciek Godek napisał(a):
    > poniedziałek, 23 sierpnia 2021 o 16:04:12 UTC+2 r...@g...com napisał(a):

    > > poniedziałek, 23 sierpnia 2021 o 15:44:35 UTC+2 Maciek Godek napisał(a):
    >
    > > w pliku cache.xml mam atrybut strs="" a powinien być niepusty string
    > No dobra, to już jest coś.
    > A teraz kilka pytań bardziej konkretnych: w jaki sposób i w jakich okolicznościach
    tworzysz plik cache.xml?

    Pod koniec działania programu. Wykorzystuję bibliotkę pugixml (i xml_document). Mam z
    nią problemy, musiałem użyć atrybutu, bo zapisywanie w treści węzła nie działało mi.

    > W jaki sposób atrybut "strs" jest reprezentowany w pamięci podczas działania
    programu?

    vector<string>, robię strs = implode(magic_str, vector<string>)
    moje vector<string> to drugie składowe unordered_map<wstring, vector<string>>

    > Czy ten atrybut ma w pliku xml tylko jedną instancję, czy może jest wiele obiektów
    posiadających taki atrybut?

    wiele

    > Jakich operacji dokonujesz na obiekcie, który ma zostać zapisany do tego atrybutu?

    push_back(), find(), iteracja z begin() i end()

    > I czy to jest jedyny problem, jaki udało Ci się zaobserwować, czy może jest ich
    więcej?

    to chyba ostatni błąd, wcześniejsze naprawiłem, nowych nie dostrzegam
    miałem problemy z regexami, używam skomplikowanych regexów dla długich tekstów,
    miewałem core dumped, poradziłem sobie wprowadzając ograniczenie na długość tekstu
    (linia w wejściowym pliku tekstowym)
    w programie używam sterty na której allokuje obiekty STL i nie mam 100% pewności czy
    nie naknociłem, z new/delete

    > > > - jak duży jest program
    > > ok. 7 tys wierszy
    > > > - na jakim etapie rozwoju programu pojawił się błąd
    > > w trakcie testowania dokonywałem poprawek w kodzie w miarę jak znajdywałem błędy,
    poprawki mogły coś popsuć
    > Używasz systemu kontroli wersji (np. git) do rozwijania programu?

    nie

    > > > - czy możesz łatwo przepisać program np. na C# albo Javę
    > > nie mogę bo program używa Qt5, ponadto potrzebuję binarkę dla Windows i Linuxa
    > Tutaj akurat Java dałaby radę, ale 7 tysięcy linii kodu to już faktycznie trochę
    jest.
    > > > Możesz też poszukać w okolicy jakiegoś kolegi-programisty, usiąść z nim i
    wspólnie przejrzeć kod.
    > > to byłby dobry pomysł gdyby nie to że teraz nie jestem zatrudniony, pracuję nad
    programem w domu; algorytmy są na tyle skomplikowane że zrozumienie programu przez
    drugą osobę wymagałoby dużego zaangażowania, dużo czasu; całego kodu źródłowego
    nieznajomym wysyłać nie chcę
    > > > Czasem pomaga kompilacja kodu z flagami -Wall albo -Wextra - może pomoże
    wskazać miejsce w kodzie, w którym jest jakieś podejrzane użycie języka.
    > > dzięki, spróbuję; czy polecasz jakieś inne narzędzia? (nie jestem zaawansowany w
    C++, na co dzień programuję w PHP).
    > Możesz spróbować skompilować dwoma kompilatorami (np. clang i gcc) i zobaczyć, czy
    któryś z nich da jakiś dodatkowy komunikat. Poza tym istnieją różne narzędzia do
    statycznej analizy, ale często są płatne i wcale nie ma pewności, czy pomogą.


  • 8. Data: 2021-08-24 10:12:12
    Temat: Re: rzadki bład w programie w C++
    Od: Maciek Godek <g...@g...com>

    poniedziałek, 23 sierpnia 2021 o 20:57:59 UTC+2 r...@g...com napisał(a):
    > poniedziałek, 23 sierpnia 2021 o 16:48:49 UTC+2 Maciek Godek napisał(a):
    > > poniedziałek, 23 sierpnia 2021 o 16:04:12 UTC+2 r...@g...com
    napisał(a):
    > > > poniedziałek, 23 sierpnia 2021 o 15:44:35 UTC+2 Maciek Godek napisał(a):
    > >
    > > > w pliku cache.xml mam atrybut strs="" a powinien być niepusty string
    > > No dobra, to już jest coś.
    > > A teraz kilka pytań bardziej konkretnych: w jaki sposób i w jakich
    okolicznościach tworzysz plik cache.xml?
    > Pod koniec działania programu. Wykorzystuję bibliotkę pugixml (i xml_document). Mam
    z nią problemy, musiałem użyć atrybutu, bo zapisywanie w treści węzła nie działało
    mi.
    > > W jaki sposób atrybut "strs" jest reprezentowany w pamięci podczas działania
    programu?
    > vector<string>, robię strs = implode(magic_str, vector<string>)

    Skąd jest ta funkcja "implode"?

    > moje vector<string> to drugie składowe unordered_map<wstring, vector<string>>

    Zacząłbym od tego, że w momencie zapisywania pliku cache.xml tworzyłbym również plik
    z logami (może być nawet zapis na stderr, który byłby zrzucany do jakiegoś pliku) i
    wówczas, jeżeli bym zobaczył, że plik jest zepsuty, to bym sobie dogłębnie te logi
    przeanalizował.

    > > Używasz systemu kontroli wersji (np. git) do rozwijania programu?
    > nie

    To zacznij. Najlepiej już dziś.



  • 9. Data: 2021-08-24 10:57:41
    Temat: Re: rzadki bład w programie w C++
    Od: Robert Magdziarz <r...@g...com>

    wtorek, 24 sierpnia 2021 o 10:12:13 UTC+2 Maciek Godek napisał(a):
    > poniedziałek, 23 sierpnia 2021 o 20:57:59 UTC+2 r...@g...com napisał(a):
    > > poniedziałek, 23 sierpnia 2021 o 16:48:49 UTC+2 Maciek Godek napisał(a):
    > > > poniedziałek, 23 sierpnia 2021 o 16:04:12 UTC+2 r...@g...com
    napisał(a):
    > > > > poniedziałek, 23 sierpnia 2021 o 15:44:35 UTC+2 Maciek Godek napisał(a):
    > > >
    > > > > w pliku cache.xml mam atrybut strs="" a powinien być niepusty string
    > > > No dobra, to już jest coś.
    > > > A teraz kilka pytań bardziej konkretnych: w jaki sposób i w jakich
    okolicznościach tworzysz plik cache.xml?
    > > Pod koniec działania programu. Wykorzystuję bibliotkę pugixml (i xml_document).
    Mam z nią problemy, musiałem użyć atrybutu, bo zapisywanie w treści węzła nie
    działało mi.
    > > > W jaki sposób atrybut "strs" jest reprezentowany w pamięci podczas działania
    programu?
    > > vector<string>, robię strs = implode(magic_str, vector<string>)
    > Skąd jest ta funkcja "implode"?

    to moja funkcja a la PHP - łączy stringi z kolekcji przedzielone pierwszym parametrem
    w jeden string

    > > moje vector<string> to drugie składowe unordered_map<wstring, vector<string>>
    > Zacząłbym od tego, że w momencie zapisywania pliku cache.xml tworzyłbym również
    plik z logami (może być nawet zapis na stderr, który byłby zrzucany do jakiegoś
    pliku) i wówczas, jeżeli bym zobaczył, że plik jest zepsuty, to bym sobie dogłębnie
    te logi przeanalizował.
    > > > Używasz systemu kontroli wersji (np. git) do rozwijania programu?
    > > nie
    > To zacznij. Najlepiej już dziś.

    na razie czytam książkę o git-cie


  • 10. Data: 2021-08-24 11:19:49
    Temat: Re: rzadki bład w programie w C++
    Od: Mateusz Viste <m...@x...invalid>

    2021-08-24 o 01:57 -0700, Robert Magdziarz napisał:
    > na razie czytam książkę o git-cie

    Sztuka dla sztuki. Więcej czasu spędzisz na głowieniu się co
    wklepać żeby zadowolić gita niż na pisaniu kodu. Proponuję
    zainteresować się klasycznym svn-em, w codziennym użyciu ogarniesz go
    czterema poleceniami:

    svn up (zaciągnij najświeższy kod projektu)
    svn diff (porównaj mój lokalny kod z ostatnim commitem)
    svn st (zobacz które pliki lokalne są inne od tych w repo)
    svn commit (zapisz moje zmiany)

    Nie mówię przy tym, że git jest zły - jest po prostu bardziej
    skomplikowany, zarówno w swojej koncepcji jak i użytkowaniu. Pozwala
    też na więcej, ale w moim doświadczeniu to "więcej" jest zupełnie
    nieprzydatne i tylko wprowadza zamieszanie, przynajmniej przy
    kilkuosobowych projektach.

    Mateusz

strony : [ 1 ] . 2 ... 10 ... 17



Szukaj w grupach

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: