Jak debugować Heisenbugi?

0

Zadanie akademickie. Nie było konieczne użycie wątków, ale ja wymyśliłem, że ich użyję. Myślałem, że to będzie takie cool, a poza tym jak głupi sądziłem, że tak mi będzie łatwiej.

No i mam. Wątek czekający na zmiennej warunkowej mi nie startuje, kiedy powinien. No to sobie wymyśliłem, że dodam fprintf(stderr, "Dupa\n") do kodu, który miał kopać tę zmienną warunkową.

I nagle okazuje się, że wątek zaczyna pięknie startować!!

Pytanie (poważne): Łatwiej będzie próbować to debugować jakoś (jak?), czy napisać od nowa (i w takim razie oddać zadanie w drugim terminie niestety)?

0

Jak program jest napisany marnie, to go przepisz tak żebyś był zadowolony. Potem szukaj bugów.
Debbuger stopuje Ci wykonanie na każdym wątku, więc może po prostu skorzystać z tego?

0

Panie, masz problem z synchronizacją. Watek nie startuje czy raczej funkcja, która miała się wykonać śpi/wiruje na zmiennej warunkowej?

Jakiego typu jest ta zmienna warunkowa? Kto ją ustawia? Tylko nie mów, że to jakaś zmienna typu volatile bool, bo zwątpię.

fprintf używa locków, a więc wprowadzi ci także barierę pamięci. Pewnie stąd ten wynik.

0

Spróbuj skompilować i odpalić z wszystkimi możliwymi (kolejno) opcjami -fsanitize=....

0

Odpowiadaj na temat w postach, a nie komentarzach.

Jeżeli kod jest zły i jesteś tego świadom, to nie skrócisz sobie drogi. Będziesz brnął w coraz większe bagno i w końcu oddasz coś z czego nie będziesz zadowolony. Co możesz zrobić gdy nie masz szans przepisać całości:

  1. Przepisz tylko ten kawałek który się sypie.
  2. Wywal wątki jeżeli są niepotrzebne i generalnie usuń niepotrzebne rzeczy które mogą być problematyczne.

I rada na koniec. Lepiej mieć 3 z drugiego terminu i program który jest dobry, oraz wiedzę jak go napisać, niż 5 w pierwszym terminie z krapem którego się powstydzisz. Jak pójdziesz na pierwsze rozmowy o pracę to nikt nie spyta w którym terminie zdałeś X przedmiot i z jaką oceną, ale na pewno zostanie ocenione to jak piszesz i ak podchodzisz do jakości.

0

Dodanie printfa to zły pomysł bo wprowadza ci automatycznie synchronizacje związaną z I/O i często przy okazji "naprawia" działanie kodu.

0

Przyznaje, że jedynym sposobem na haisenbugi jaki używam jest "filozoficzny debug". Siedze z kartką, długopisem i szukam co mogło pójść nie tak. Czasem tysiące linii.
Na ogół wynik jest taki, że program jest źle napisany i nie miał prawa nigdy dobrze działać, a błędów jest 5, z tego naprawa niektórych wymaga gruntownego przepisania kodu.

Dopiero gdy znajdę - zwykle piszę test (wielowątkowy) potwierdzający buga. Czasem nawet się to udaje (napisać test - bardzo czasem).

Głupi HACK.
Może . odpal na jednym CPU - coś w stylu:
start /affinity 1 program.exe
wtedy niektóre bugi z memory barrier się same naprawiają :-)
masz wątki - masz
zadziala.. zadziała -co z tego, że na jednym core
....po co wnikać :-)
(chociaż w C trzeba by też skompilować skrajnie nieoptymalnie ten kod... ech chyba jednak słabe)

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