FAQ spolecznosciowe.

Moderators: niski, Saibamen

Post Reply
Haos
Test Team
Posts: 2954
Joined: Thu Mar 22, 2007 5:42 am
Contact:

FAQ spolecznosciowe.

Post by Haos »

Updated 04.11.2010

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:>
powinienes znalezc komunikat, z przyczyna, na przyklad:

Code: Select all

*** Fatal System Error: 0x0000004e
                       (0x00000007,0x00039F64,0x00000001,0x00000000)

[7hEntered debugger on embedded INT3 at 0x0008:0x808e4234.
kdb:>
W tym przypadku KDBG (Kernel Debugger) wylapal bugchecka, czyli znany wszystkim BSOD, ich pelna liste znajdziecie tu, wraz z opisem i parametrami: http://msdn.microsoft.com/en-us/library ... S.85).aspx

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
(od backtrace), by uzyskac ze stosu liste kolejnych wywolan. Jest to niezbedne dla ustalenia przyczyn kraksy. Aby sprobowac opuscic tryb debuggera, uzywamy polecenia

Code: Select all

cont
Spis komend jest na wiki, ale tez dostepny z poziomu debuggera, poleceniem

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
. Jest on niezbedny do rozkodowywania ramek w logach, takich jak w temacie, ale tylko do tych plikow ktore byly kompilowane w rosbe, czyli pochodza z naszego projektu. Pliki te maja zapisane symbole debugowania. To dodatkowe informacje, ktore pozwalaja odczytac, gdzie w kodzie znajduje sie konkretna instrukcja, jaka wylapal debugger, co do numeru linii w kodzie.

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
Jako ze Wojo wrzucil w bugreporcie owa biblioteke dll, wychodzi u mnie cos takiego:

Code: Select all

lib/sdk/crt/mem/i386/memcpy_asm.s:53 (memcpy)
UWAGA!!!!
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
Powyzszy komunikat mowi nam, ze program emergeCore.exe zostal zamkniety z kodem bledu 0xC0000005 (Page Fault). Do tego dostajemy adres pamieci w ktorym wystapil oraz baseaddress dla tej aplikacji, czyli miejsce w pamieci od ktorego zostala zaladowana.

Inny przyklad:

Code: Select all

Unhandled exception
ExceptionCode:    c0000005
Faulting Address: f282567b
Po tych liniach wyswietlany jest stan rejestrow procesora w chwili wystapienia wyjatku, a jeszcze nizej zrzut stosu wywolan, czyli znany z poprzednich punktow backtrace.

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
a nastepnie wracamy do systemu komenda

Code: Select all

cont
Wywolujemy blad i jesli wszystko poszlo ok, tym razem system pownien sam przejsc do debuggera z ponizszym komunikatem:

Code: Select all

Entered debugger on first-chance exception (Exception Code: 0xc0000005) (Page Fault)
wykonujemy nastepnie komende

Code: Select all

bt
oraz, by kontynuowac wykonywanie aplikacji -

Code: Select all

cont
Po tej komendzie albo znow zobaczymy jeden z dwoch komunikatow o wystapieniu wyjatku krytycznego, lub zlapiemy kolejny pierwszy wyjatek. W drugim przypadku potwarzamy komendy i tak az do skutku, tzn do oryginalnego komunikatu o wyjatku krytycznym. Interesuje nas szczegolnie ten pierwszy wyjatek, ktory zlapiemy tuz przed krytycznym jako ostatni, gdyz to on najpewniej jest wlasnie zrodlem naszego bledu. Musimy jeszcze wykonac raddr2line na tych wywolaniach ktore pochodza z plikow ReactOSa (patrz FAQ punkt 3) a w przypadku drugiego rodzaju komunikatu - porownac obie listy wywolan, juz po uzyciu raddr2line (z jakiegos powodu czasem offsety roznia sie w przypadku pierwszego i drugiego wyjatku, mimo to nadal w obrebie tej samej linii kodu).


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
Taka sama nazwe podajemy w konfiguracji maszyny wirtualnej (bo to w jej przypadku zwykle uzywamy nazwanych laczy. UWAGA! Jesli uzywasz adaptera COM-USB, to po zainstalowaniu sterownikow, musisz sprawdzic jaki numer portu COM system przypisal adapterowi. Najprosciej - w menedzerze urzadzen, Porty (COM i LPT), a tam szukac nazwy adaptera. We wlasciwosciach tego wpisu mozna nawet domyslny numer portu COM zmienic.
Last edited by Haos on Thu Nov 04, 2010 11:09 pm, edited 2 times in total.
wojo664
Posts: 320
Joined: Mon Jul 06, 2009 5:39 pm

Re: FAQ spolecznosciowe.

Post by wojo664 »

A ciekawscy mogą także podejrzeć co znajduje się w danym pliku ;)

Zakładka
Wiki, sekcja Developing -> Online Code Browser
Dalej Trunk->reactos-> i według ścieżki: lib/sdk/crt/mem/i386/memcpy_asm.s
po kliknięciu w plik memcpy_asm.s klikamy w view.
Najlepiej klikać w view na zamej górze, bo to najnowsza wersja pliku.
Życzę udanych debugów ;)

pozdrawiam wojo664

PS: Nie sądziłem że przyczynie się do powstania Tutoriala :D
dj_pajak
Posts: 15
Joined: Fri Aug 13, 2010 1:14 pm
Location: Chmielnik/Kielce

Re: FAQ spolecznosciowe.

Post by dj_pajak »

Myślę, że przydałoby się tu coś o testowaniu na prawdziwym sprzęcie: jaki sprzęt jest do tego potrzebny i jakie oprogramowanie do odbierania logów. Ja właśnie zamówiłem kabel więc mogłoby mi się to przydać ;)
wojo664
Posts: 320
Joined: Mon Jul 06, 2009 5:39 pm

Re: FAQ spolecznosciowe.

Post by wojo664 »

Jak zbierać logi z ReactOS?

Wersja Sprzętowa

Wymagany sprzęt:Dwa komputery, każdy z wolnym portem COM, Komputer testowy: minimalna wielkość twardego dysku: 500 mb, procesor:hm.... minimum to chyba będzie 233 Mhz :D, Komputer zbierający logi: Każdy komputer, który potrafi odpalić normalnie win XP, bądź jakiegoś Linuksa ;), + ewentualnie przejściówka USB <-->COM gdyby w którymś komputerze nie było normalnego portu COM, i oczywiście kabel Null Modem.

Ale jak to zrobić?To proste.
Po pierwsze, musimy do tego celu mieć pod ręka co najmniej 2 komputery, po drugie, musimy posiadać kabel do portu szeregowego zwany Null Modem,
po trzecie, musimy mieć jakiś program, którym odbierzemy logi.
W systemie Windows możemy użyć domyślnie instalowanego programu o nazwie HyperTerminal, badz zainstalować inny program. Polecam program o nazwie Putty - mały i prosty w obsłudze, nie trzeba instalować, wystarczy odpalić pobrany z internetu plik .exe

1 Zaczynamy
(Zakładam że Obraz systemu został pobrany i wypalony na płycie CD (WAŻNE!!! OBRAZ MUSI ZAWIERAĆ WERSJE SYSTEMU KTÓRA NA STRONIE JEST OZNACZONA SUFIKSEM DBG!!NA PRZYKŁAD "bootcd-49559-dbg" , a także, że komputer odbierajacy logi ma zainstalowany system Windows)

Po pierwsze, upewniamy się, że oba komputery posiadaja porty COM.
Po drugie, podpinamy kabel PRZED właczeniem komputerów.
Po trzecie, upewniamy się, czy komputer testowy, ma uaktywniona w BIOS opcje uruchamiania z CD.
Na komputerze, w którym będziemy zbierać logi, odpalamy program HyperTerminal, badz Putty.
2

HyperTerminal

Po pierwsze, trzeba anulować kreatora "Informacje o lokalizacji",

[ external image ]
(ANULUJ, potem opcja TAK, potem OK)

Teraz mamy okno, w którym podajemy nazwe połaczenia, i ikonke. Moga być dowolne.
[ external image ]
Po kliknięciu OK, znowu anulujemy kreatora
[ external image ]

(ANULUJ, potem opcja TAK, potem OK)

I w koncu ....

[ external image ]

Mamy okno wyboru portu szeregowego :D

Teraz zostawiamy na chwile obecny komputer, i idziemy właczyć drugi, na którym jest badz ma być zainstalowany ROS.

Przechodzimy do komputera odbierajacego logi.
Po zatwierdzeniu pola wyboru portu pojawi się okno właściwości połaczenia.
[ external image ]

Szybkość (bity na sekunde) ustawiamy na 115200.

Wciskamy OK

HyperTerminal teraz czeka na dane.
wracamy do komputera testowego, i zaczynamy instalacje(Uruchamiamy komputer z wcześniej wypalonej płyty.

(wciskamy jakikolwiek klawisz klawiatury, gdy na komputerze pojawi się komunikat "Press any key to boot from CD..." )


Podczas instalacji systemu tryb debugowania włacza sie automatycznie
.), badz uruchamiamy ROS-a i powtarzamy czynność, przy której nam sie ostatnio zawiesił, badz przestał dobrze działać. ;)

HyperTerminal powinien zaczać wyświetlać logi w oknie na białym tle.


Putty

A teraz odbieranie logów w programie Putty

Wykonujemy punkt pierwszy tutorialu (1)

(2)
Uruchamiamy program Putty na komputerze zbierajacym logi.

[ external image ]

Pierwsza zakładka: Session
Zaznaczamy kropkę przy Serial.
Oba pola tekstowe zmienia nazwy. W polu Serial line wpisujemy port naszego komputera, pod który podpięty jest komputer testowy.
W pole Speed wpisujemy 115200 .
Potem wchodzimy do zakładki Logging,
[ external image ]
zaznaczamy pole "All session output"
Dzięki temu w pliku loga będziemy mieli wszystko to co wysyła nam system ROS.
Pole Log File Name - Tutaj wpisujemy nazwe loga, potem klikamy Browse, i wskazujemu folder do zapisu loga(WAŻNE - TRZEBA WSKAZAĆ FOLDER, BO INACZEJ PUTTY MOŻE NIE ZAPISAĆ LOGA DO PLIKU, I ZOSTANIEMY TYLKO Z TYM CO WIDAĆ W KONSOLI PUTTY).

Klikamy następnie Open - Sesja logowania zostanie otwarta.

uruchamiamy ROS-a i powtarzamy czynność, przy której nam sie ostatnio zawiesił, badz przestał dobrze działać. ;)

Wersja 1 komputer z użyciem maszyny wirtualnej
Wkrótce...

PS: Wybaczcie brak literki a z ogonkiem, ale wredny program typu adblok przejał skrót a+alt jako aktywator ręcznej blokady pop-upów, a także to że tutorial może zawierać pewne błędy logiczne... obecnie jest północ i padam ze zmęczenia :P ...
djpajak
Posts: 6
Joined: Thu Dec 02, 2010 10:23 pm

Re: FAQ spolecznosciowe.

Post by djpajak »

Pozwolę sobie dokończyć wersję z maszyną wirtualną:
1. Pobieramy program com0com i instalujemy go z domyślnymi ustawieniami. Gdy podczas instalacji Windows będzie krzyczał o niepodpisanych sterownikach, zezwalamy na ich instalacje. Domyślnie program utworzy nam 2 porty: \\.\CNCA0 oraz \\.\CNCB0, które będziemy traktowali tak jak zwykłe porty COM np. COM1. Te dwa porty to dwa końce wirtualnego kabla Null Modem. Jeśli przy prawdziwym kablu jeden koniec podłączamy do komputera wysyłającego logi a drugi do odbierającego, to w przypadku wirtualnego postępujemy podobnie.
2. W programie, którym będziemy odbierać logi ustawiamy wszystko tak jak w przypadku prawdziwego sprzętu, tylko jako port podajemy \\.\CNCA0 lub \\.\CNCB0 (Chyba, ze zdefiniowaliśmy sobie inne nazwy portów)
3. W ustawieniach maszyny wirtualnej w programie Oracle VM VirtualBox wybieramy zakładkę "Porty szeregowe":
- W zakładce "Port 1" zaznaczamy opcję "Włącz port szeregowy".
- "Numer Portu" zostawiamy na pozycji COM1,
- "Tryb pracy portu" ustawiamy jako "Sprzętowy port gospodarza",
- W pole "Ścieżka portu/pliku" wpisujemy nazwę naszego portu. (Gdy w programie odbierającym logi ustawiliśmy port \\.\CNCA0 to tu wpisujemy \\.\CNCB0)
4. Uruchamiamy program obierający logi i maszynę wirtualną. Miłej zabawy :)

PS. Co do programu putty to dobrze jest sobie zapisać ustawienia, by nie wpisywać ich za każdym razem ;)
wojo664
Posts: 320
Joined: Mon Jul 06, 2009 5:39 pm

Re: FAQ spolecznosciowe.

Post by wojo664 »

!!UWAGA!!
Raddr2line nie przyjmuje długich ścieżek ze spacjami!
Haos
Test Team
Posts: 2954
Joined: Thu Mar 22, 2007 5:42 am
Contact:

Re: FAQ spolecznosciowe.

Post by Haos »

Przyjmuje jak wcisniesz je pomiedzy ""
wojo664
Posts: 320
Joined: Mon Jul 06, 2009 5:39 pm

Re: FAQ spolecznosciowe.

Post by wojo664 »

Nie zdaje egzaminu...
[ external image ]
Adres efr to po prostu losowe litery, ale przy poprawnych adresach też taki błąd wyświetla.
Haos
Test Team
Posts: 2954
Joined: Thu Mar 22, 2007 5:42 am
Contact:

Re: FAQ spolecznosciowe.

Post by Haos »

Code: Select all

D:\ReactOS\Raddr2line>raddr2line.exe "d:\ReactOS\Raddr2line\Test Dir\ntdll.dll" 0xbbad
lib/rtl/heap.c:3068 (RtlReAllocateHeap@16)
RADDR2LINE to nie RELADDR2LINE. RADDR2LINE to proste niezautomatyzowane narzedzie, ktore uwielbiam i ktore nie ma nic wspolnego z automatami na nim bazujacymi. Aby je uzyskac, wystarczy ROSBE, zrodla ReactOS i wpisanie komendy:

Code: Select all

make raddr2line
wojo664
Posts: 320
Joined: Mon Jul 06, 2009 5:39 pm

Re: FAQ spolecznosciowe.

Post by wojo664 »

Dzięki za info. No cóż myślałem że raddr2line będzie domyślnie obecny w ROSBE... czyli nowy komunikat :P

!!UWAGA!! W ROSBE DOMYSLNIE OBECNY JEST PROGRAM RELADDR2LINE, KTÓRY TO Z TEGO CO WIDAĆ BAZUJE NA RADDR2LINE, ALE MA INACZEJ ZAIMPLEMENTOWANĄ OBSŁUGE DŁUGICH ŚCIEŻEK DOSTĘPU ZE SPACJAMI :D
Haos
Test Team
Posts: 2954
Joined: Thu Mar 22, 2007 5:42 am
Contact:

Re: FAQ spolecznosciowe.

Post by Haos »

Niestety, dreimer wcisnal reladdr2line w batch o nazwie raddr2line.bat. Trzeba wiec podawac nazwe wlacznie z rozszerzeniem: raddr2line.exe
wojo664
Posts: 320
Joined: Mon Jul 06, 2009 5:39 pm

Re: FAQ spolecznosciowe.

Post by wojo664 »

ReactOS na VMware Server - tworzenie maszyny.
http://www.youtube.com/watch?v=M7IXkBKlX8A
Haos
Test Team
Posts: 2954
Joined: Thu Mar 22, 2007 5:42 am
Contact:

Re: FAQ spolecznosciowe.

Post by Haos »

KDCOM.dll: biblioteka odpowiedzialna za protokol komunikacyjny debuggera NT, przekazujacego dane poprzez port serial.
pool
Posts: 1
Joined: Fri Jul 22, 2016 1:58 pm

Re: FAQ spolecznosciowe.

Post by pool »

Widzę, że odświeże temat :-)

Mam pytanie, czy drugim komputerem może być Raspberry Pi 2 model B z podłączoną płytką, która zawiera złącze RS232:

http://elty.pl/pl/p/X105-EXPANSION-BOARD-/1574

Tak posiadam kabel typu Null Modem, z jednej strony mam RS232, a z drugiej jest USB.

Posiadam RP 2 z taką płytką, ponieważ mam monitor z wyjściem VGA. Wszystko działa bez zarzutu na Ubuntu Mate oraz Raspbian. Jeżeli RP 2 moze być tym drugim komputerem, to jakiego używać oprogramowania ? Może by ktoś napisał tutorial z taką konfiguracją ?
Post Reply

Who is online

Users browsing this forum: No registered users and 8 guests