-
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