Jesli macie jakis konkretny problem z czyms na ROSie - zapraszam do zadawania pytan. Uwaga, chodzi o typowe kwestie zwiazane z wykonaniem jakiejs czynnosci. Nie kopiujemy tutaj bugzilli! Prosze wiec unikac pytan w stylu "Nie dziala aplikacja X" czy "Nie moge uruchomic ROSa na komputerze Y". Postaram sie pare przykladowych pytan wrzucic, w razie czego nie krepujcie sie, zadawajcie, najwyzej sie usunie. Jesli cos wymaga doprecyzowania - tez pytajcie. Uprzedzajac, FAQ jest Windowso-centryczne, glownie z powodu mojej specjalizacji w tym systemie. Jesli beda chetni, zamieszczenie pytan badz uzupelnien *nixowych nie bedzie problemem.
1. Co powinno znalezc sie w raporcie o błędzie?
Tresciwy i niezby dlugi tytul, w opisie - co najmniej testowana rewizja (lub wydanie), czy to oficjalne iso czy wlasna kompilacja (a jesli wlasna to czy to samo dzieje sie na oficjalnej), logi debug, informacja o maszynie testowej (wirtualna lub fizyczna, wraz z konfiguracja), sposob replikacji bledu. Jesli blad jest regresja, tzn, nie dziala cos co juz dzialalo, przydaloby sie zrobic testy regresji, czyli znalezc rewizje w ktorej blad sie pojawia.
2. System przestaje odpowiadac, w logach widze znaczek "kdb:>" i to co pisze, pojawia mi sie w logach, co robic?
Z jakiegos powodu ReactOS przeniosl sie do wbudowanego debuggera. Jesli nie nacisnales TAB+k by znalezc sie tam na wlasne zyczenie, prawdopodobnie doszlo do jakiejs kraksy systemu. Linijke wyzej, przed
Code: Select all
kdb:>
Code: Select all
*** Fatal System Error: 0x0000004e
(0x00000007,0x00039F64,0x00000001,0x00000000)
[7hEntered debugger on embedded INT3 at 0x0008:0x808e4234.
kdb:>
Przyczyn moze byc wiele, ale najpopularniejsze to Fatal System Error i Assertion.
Jak juz znalezlismy sie w debuggerze, to uzywamy komendy
Code: Select all
bt
Code: Select all
cont
Code: Select all
help
3. Po komendzie bt dostalem cos jak <msvcrt.dll:191e0>, w bugzilli kaza mi zrobic raddr2line, co to takiego? (inspired by wojo)
Program raddr2line jest dostepny zarowno w ROSBE (build environment) jak i w samym kodzie jako osobny program do skompilowania. Zrobic jest go latwo, wpisujac
Code: Select all
make raddr2line
Odkodowywanie jest proste. Poslugujac sie przykladem z tematu. Potrzebujemy plik msvcrt.dll z ReactOSa i raddr2line.exe. Wrzucamy je do jednego katalogu i wpisujemy polecenie (najlepiej w cmd):
Code: Select all
raddr2line msvcrt.dll 0x191e0
Code: Select all
lib/sdk/crt/mem/i386/memcpy_asm.s:53 (memcpy)
Do raddr2line nalezy ZAWSZE uzywac DOKLADNIE TEGO SAMEGO PLIKU, jaki byl uzyty w systemie z ktorego powstal debuglog z taka ramka. Uzycie innego pliku spowoduje zwrocenie nieprawidlowego rezultatu i moze utrudnic analize bledu.
4. W debuglogu badz na ekranie widze blad z costam Exception. Co robic? (inspired by dj_pajak)
Przeczytac dokladnie co to za komunikat. Jesli jest na ekranie, zrob screenshota na wszelki wypadek. W logach z kolei mozemy spotkac dwa rodzaje bledow zwiazanych z wyjatkami krytycznymi (Exceptions):
Code: Select all
(ntoskrnl/ke/i386/exp.c:1089) Kill emergeCore.exe, ExceptionCode: c0000005, ExceptionAddress: 780191e0, BaseAddress: 400000
Inny przyklad:
Code: Select all
Unhandled exception
ExceptionCode: c0000005
Faulting Address: f282567b
W obu przypadkach trzeba oczywiscie sprawidzic czy blad sie powtarza za kazdym razem. Po tym potwierdzeniu nalezy, szczegolnie w pierwszym przypadku zlapac tzw pierwszy wyjatek krytyczny. Generalnie liczymy trzy klasy wyjatkow. Pierwszych moze byc bardzo wiele ale nigdy do nas nie docieraja. Z reguly sa one obslugiwane przez sama aplikacje. W momencie gdy wyjatek nie zostanie obsluzony, zmienia sie w wyjatek krytyczny aplikacji a jego obsluge przejmuje system operacyjny. Zwykle zabija on aplikacje z ktoryms z powyzszych komunikatow. Zlapanie pierwszego wyjatku w pierwszym przypadku pozwoli nam uzyskac liste wywolan (backtrace) ktore do niego doprowadzily a w drugim - potwierdzic czy wyswietlony backtrace nie zostal przypadkiem zmieniony przy przejsciu wyjatku na drugi stopien (krytyczny). Istnieje jeszcze trzeci rodzaj wyjatku. Jesli podczas obslugi wyjatku krytycznego (czyli drugiego stopnia) zdarzy sie ponownie blad, wowczas system dozna kraksy i zostanie wyswietlony komunikat o tzw potrojnym bledzie (triple fault). Zdarza sie to jednak tak rzadko, iz nie mam przykladu na podoredziu.
Aby wlaczyc lapanie pierwszych wyjatkow, po potwierdzeniu bledu, musimy przed jego wystapieniem przejsc do debuggera skrotem TAB+k. Jesli aplikacja wywala sie przy uruchamianiu, nalezy wlaczyc lapanie przed jej uruchomieniem. Jesli zdarza sie to przy okreslonej czynnosci w czasie dzialania aplikacji - przed wykonaniem tej czynnosci. Im blizej momentu wystapienia bledu wlaczysz lapanie wyjatkow, tym mniejsza szansa ze zlapiesz pierwszy wyjatek zupelnie niezwiazany z naszym problemem.
Kiedy juz przejdziesz do debuggera i widzisz w debuglogu znak zachety (kdb:>) wowczas podajesz komende:
Code: Select all
set condition * first always
Code: Select all
cont
Code: Select all
Entered debugger on first-chance exception (Exception Code: 0xc0000005) (Page Fault)
Code: Select all
bt
Code: Select all
cont
1. Jakim programem odbierac debuglog z ReactOS?
Sporo zalezy od tego na czym testujemy system ale najbardziej uniwersalnym programem jest Putty. Umozliwia on podlaczenie sie zarowno do nazwanych laczy (named pipes), jak i do sprzetowych i wirtualnych (np com0com) portow szeregowych. W obu przypadkach uzywamy opcji polaczenia Serial. W przypadku portow COM sprawa jest prosta, wpisujemy jego nazwe (COM[numer portu]) a w przypadku nazwanych laczy - stosujemy ponizsza skladnie:
Code: Select all
/.//pipe/[nazwa lacza] - na przyklad: /.//pipe/virtualbox_dbg