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:
- Stackoverflow: Jak działa odwrotne debugowanie?
- gdb używa terminu „odwrotne debugowanie”, ale inni dostawcy używają innych terminów dla identycznych lub podobnych technik:
- Microsoft nazywa to IntelliTrace lub „Historyczne debugowanie”
- Istnieje odwrotny debuger Java o nazwie Omniscient Debugger , chociaż prawdopodobnie nie działa już w Javie 6
- Istnieją inne odwrotne debugery Java
- Debuger OCaml (ocamldebug) nazywa to podróżą w czasie
Odpowiedzi:
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
finally
bloki 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.
źródło
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.
źródło
rr
?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.
źródło
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!”
źródło
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.
źródło