Dlaczego rzadko używa się odwrotnego debugowania? [Zamknięte]

56

gdb zaimplementował obsługę odwrotnego debugowania w 2009 roku (z gdb 7.0). Nigdy o tym nie słyszałem do 2012 roku. Teraz uważam, że jest to bardzo przydatne w przypadku niektórych rodzajów problemów związanych z debugowaniem. Żałowałem, że nie słyszałem o tym wcześniej.

Popraw mnie, jeśli się mylę, ale mam wrażenie, że technika jest wciąż rzadko używana i większość ludzi nie wie, że ona istnieje. Dlaczego?

Czy znasz jakieś społeczności programistyczne, w których powszechne jest stosowanie odwrotnego debugowania?

Informacje podstawowe:

Philipp Claßen
źródło
47
Z korzyścią dla tych, którzy nie wiedzą, że istnieje, czym jest odwrotne debugowanie?
Mason Wheeler
5
MS nazwało swój system intelitrace, który wydaje się podobny do tego, co nazywacie debugowaniem, może to być kwestia wielu nazw w zależności od środowiska, co sprawia, że ​​wydaje się mniej używany.
Ryathal
1
Właśnie za to, co jest warte: jest naprawdę dużo starszy, niż się wydaje - Microsoft wspierał go w QuickC (około 1989 lub 90, jeśli pamięć służy).
Jerry Coffin
41
@MasonWheeler, wyraźne odwrócenie debugowania polega na dodawaniu błędów do kodu. Nie zgadzam się z założeniem PO, że jest to rzadka praktyka.
Ben Lee,
3
@BenLee, nazywamy to ponawianiem.
OldFart

Odpowiedzi:

26

Po pierwsze, uruchomienie w trybie debugowania z włączonym nagrywaniem jest bardzo drogie w porównaniu do nawet normalnego trybu debugowania; zużywa również dużo więcej pamięci.

Łatwiej jest zmniejszyć ziarnistość z poziomu linii do poziomu wywołania funkcji. Na przykład standardowy debugger w środowisku Eclipse umożliwia „upuszczenie do ramki”, co jest w zasadzie przeskoczeniem do początku funkcji z resetowaniem wszystkich parametrów (nic nie zrobione na stercie jest cofane, a finallybloki nie są wykonywane , więc nie jest to prawdziwy debugger odwrotny; bądź ostrożny).

Pamiętaj, że jest to dostępne od kilku lat i działa równolegle z wymianą kodu.

maniak zapadkowy
źródło
1
Bardzo dobra odpowiedź. Mogę potwierdzić, że nagrywanie jest drogie. Musisz ją włączyć tuż przed wejściem do krytycznej części aplikacji, co nie zawsze jest banalne. Zgadzam się również, że „drop to frame” jest często wystarczająco dobry. Jednak nie działa dobrze z pętlami lub algorytmami rekurencyjnymi.
Philipp Claßen
2
To do rr ( rr-project.org ). prędkość podczas nagrywania wykonania przy użyciu rr jest nieznacznie mniejsza. Następnie możesz odtwarzać, wkraczać, przewijać do tyłu, ustawiać obserwatorów w swoim ulubionym środowisku IDE ( github.com/mozilla/rr/wiki/Using-rr-in-an-IDE ) ... Sposób debugowania kodu nigdy nie będzie podobnie.
jyavenard
11

Jak już wspomniano, wydajność jest kluczowa, np. W przypadku odwracalnego debugowania gdb, uruchomienie czegoś takiego jak gzip powoduje spowolnienie 50 000 razy w porównaniu z uruchomieniem natywnym. Istnieją jednak komercyjne alternatywy: pracuję dla Undo undo.io , a nasz produkt UndoDB robi to samo, ale ze spowolnieniem mniejszym niż 2x. Dostępne są również inne komercyjne debugery odwracalne.

użytkownik1839284
źródło
1
Ciekawe, na pewno spróbuję. W kilku artykułach jest powiedziane, że jest darmowy do użytku niekomercyjnego, ale nie znalazłem żadnych informacji potwierdzających to na twojej stronie głównej. Czy to nadal prawda? Dziękujemy za ujawnienie swojej przynależności.
Philipp Claßen
2
Jakie są ceny wersji Starter i Professional UndoDB? Nie widzę ich na stronie edycji UndoDB.
tcrosley,
3
Jak się macie w porównaniu do Mozilli rr?
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
10

Aby zapoznać się z wyborem technologii i produktami, zobacz serię postów na blogu, o których pisałem rok temu (i kilka dalszych działań od tego czasu):

Mam wrażenie, dlaczego jest tak rzadko używany, że wymaga specjalnego sprzętu, specjalnego debuggera lub właściwej konfiguracji systemu. Niestety większość ludzi nie inwestuje czasu, aby uzyskać maksymalną wartość ze swoich narzędzi do debugowania.

I fakt, że „tanie domyślne” gdb jest prawie bezużyteczne i ma sporo problemów ze stabilnością dla wszystkich oprócz najpopularniejszych systemów docelowych.

jakobengblom2
źródło
4

Z mojego doświadczenia jako inżyniera sprzedaży debuggera TotalView ludzie wiedzą, że istnieje, ale nie sądzą, że działa, niezależnie od (akceptowalnego lub nie) spowolnienia.

Niedawno University of Cambridge przeprowadził ankietę „Niepowodzenie w stosowaniu odwrotnego debugowania kosztuje globalną gospodarkę 41 miliardów dolarów rocznie” .

Wracając do GDB, słyszałem (bardzo dużo), że spowolnienie czyni go całkiem bezużytecznym w „prawdziwej” aplikacji.

Chciałbym osobiście usłyszeć odpowiedzi od większej liczby osób korzystających z odwrotnego debugowania w aplikacjach innych niż „Witaj świecie!”

SebGR
źródło
4
Myślę, że znacznie lepiej byłoby połączyć to badanie niż spam „Cofnij oprogramowanie”, który udaje, że dotyczy badań.
Bulwersator
1
W mojej poprzedniej pracy pracowałem nad zbudowaniem odwrotnego debuggera ( ghs.com/products/timemachine.html ). Bardzo intensywnie wykorzystaliśmy debugger wewnętrznie i mogę powiedzieć, że to było niesamowite. Oczywiście było świetnie na naprawdę owłosionych wyścigach, ale to było coś więcej. Kiedy odwrotne debugowanie jest włączone przez cały czas, twoja mentalność związana z debugowaniem zmian. Wykonujesz mniej iteracji i możesz być mniej ostrożny przy testowaniu kodu. Możesz także zapisać przebieg wykonywania i wysłać go komuś, więc świetnie nadaje się do wyszukiwania błędów w kodzie innych osób.
Speedplane
2

Myślę, że ważne jest, aby rozwinąć nieco dalej to debugowanie „odwrotne” lub „historyczne”. Myślę, że zrozumienie złożonych systemów i zachowań w nich, odtworzenie „zdarzeń”, które wyraźnie określają stan, jest absolutnie kluczowe.

Chcę wyrazić to, że nie jesteście sami, zastanawiając się, dlaczego ta technika nie jest dziś tak często stosowana lub dlaczego powiązane problemy rzadko są jasno omawiane.

Podkreślmy tutaj dwie bardzo ważne koncepcje:

1. Aby zrozumieć system programowania, pomocne jest określenie stanu

2. Aby jeszcze bardziej zrozumieć system programowania, odtwarzanie sekwencji stanu (zdarzeń) może bardzo pomóc.

Oto niektóre źródła, które rozwiązały problem i zaproponowały lub zaprojektowały rozwiązania problemu (radzenie sobie ze stanem w złożonych systemach):

- Poza bitem smoły, papier: http://shaffner.us/cs/papers/tarpit.pdf Główne pomysły: unikaj, izoluj lub wyraźnie określ stan

-CQRS http://www.cqrs.nu/ Jest to połączenie dwóch pojęć: Segregacja zapytań poleceń i Pozyskiwanie zdarzeń. Istnieją różne implementacje (Java, C #, Scala). Odgrywanie sekwencji Tate'a i ewolucja modelu domeny są tutaj kluczowymi częściami.

Jeśli naprawdę pomniejszysz i zobaczysz bardzo szeroki obraz, zobaczysz już, że wraz ze „wzrostem” programowania funkcjonalnego ludzie są już ((nie) świadomie) przyciągani do fp, ponieważ to wyraźnie określa stan! Ale dotyczy to tylko punktu pierwszego, aby zająć się drugim, potrzebujesz innej koncepcji, którą można by „luźno” opisać jako funkcjonalne programowanie reaktywne.

Więc możesz powiedzieć wszystko dobrze i dobrze, ale kto faktycznie używa CQRS i FRP? Powiedziałbym (IMO, ponieważ nie mam konkretnych liczb), w rzeczywistości wiele firm po prostu nie wie, że praca, którą wykonują ma taką terminologię. Być może przeszukujesz trochę Google i słyszysz od firm korzystających z CQRS, istnieją już pewne historie sukcesu. Także FRP rośnie powoli jako przykład, który mogę podać Netflixowi: http://techblog.netflix.com/2013/02/rxjava-netflix-api.html Który właśnie wydał implementację RX, która jest oparta na .NET (ale ma implementacja Javascript). Dlatego ludzie już dziś używają tych technik, W DUŻYM, aby zrozumieć złożone systemy i uczynić je jeszcze lepszymi. Dlatego używają technik odwrotnego debugowania.

AndreasScheinert
źródło