Jak debugować Heisenbugi?

Jak debugować Heisenbugi?
KM
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 4 lata
  • Postów:473
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)?

KM
PS. Program jest napisany marnie (nawet jak na mnie ;P), bo się spieszyłem… No i mam konsekwencje.
kq
Źródełka?
krzysiek050
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 4 lata
  • Postów:1272
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?

KM
Jak program jest napisany marnie, to go przepisz tak żebyś był zadowolony Gdyby nie to, że wtedy nie zdążę oddać na czas i będę musiał zgodzić się na II termin to tak bym zrobił.
nalik
  • Rejestracja:około 9 lat
  • Ostatnio:10 dni
  • Postów:1039
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.

edytowany 6x, ostatnio: nalik
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 7 godzin
  • Lokalizacja:Szczecin
0

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


krzysiek050
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 4 lata
  • Postów:1272
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.

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
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.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 5 godzin
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
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)


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 7x, ostatnio: jarekr000000
hauleth
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:9 dni
0

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.