110
pazuRiry
Debugger i pro/iler
Enter an environment number, or 0 to exit Selection: 1 Brousing in the environment with cali:
funkcjaCnapis")
Called from: debugger.look(ind)
Bro»se[l]> x [1] "napis"
Browse[i]>
Available environments had calls:
1: funkcjaCnapis")
2: log(x)
3: .execute(.PrimitlveClog"), x, envir = sys.parent(l))
Enter an environment number, or 0 to exit Selection: 0
Po uruchomieniu funkcji debuggerO wyświetla się lista dostępnych przestrzela,;! nazw związanych z wywoływaniami kolejnych funkcji. W rozważanym przypadki! ' błąd został zgłoszony przez wbudowaną w R funkcję oznaczoną .Primitive("log"}.i‘d Ta wbudowana funkcja została wywołana przez funkcję log(base), a ta z kolei prz^||j funkcję funkcjaO. Pierwsze pytanie debuggera dotyczy numeru przestrzeni nazw, którą chcemy prześledzić. W powyższym przykładzie wybieramy 1, a więc prze® strzeń nazw widzianą przez funkcją funkcjaO. Po tym wyborze linia rozpoczyna) się prefixem Browse[l]>, który oznacza, że jesteśmy w przestrzeni nazw opatrzoąSf indeksem 1. Możemy teraz sprawdzić wartości zmiennych w tej przestrzeni, nazvrf w chwili, w której pojawił się błąd. W naszym przykładzie sprawdziliśmy war.ti zmiennej x, czyli argumentu funkcji funkcjaO. Okazało się, że jest to napis, ąwg wiemy już na czym polegał problem! Możemy teraz opuścić debugger klikając EN1 a następnie wybierając przestrzeń nazw o numerze 0.
Zaletą debugowania z zapisywaniem całego środowiska R jest to, że jeżeli błądŁ,, pojawił się podczas wykonywania programu w trybie wsadowym lub na innym końj^Jr"
'> tracebackO 1 2: funkcja(y) 1: funkcja2(1,
> tt podajemy argument złego typu, to musi wywołać błąd
> funkcjaCnapis") log: Using log baae e.
Error in log(x) : Non-numeric argument to mathematical functlon Execution halted
Po napotkaniu błędu (a więc w chwili, gdy próbowaliśmy wyznaczyć logąrikn z napisu) zostało wywołane polecenie dump. f rames ( " errorDump " , TRUE). Zapis ono stan R do pliku errorDump. rda. Możemy teraz odczytać ten stan i przeanaj zować go funkcją debuggerO. Prześledźmy poniższy przykład.
> tt wczytujemy zawartość pliku “errorDump.rda"
> load C"errorDump.rda M)
> tt uruchamiamy debugger na odczytanym środowisku
> debugger(errorDump)
Execution halted
Available envlronments had calls:
1: funkcjaCnapis")
2: log(x)
3: .execute<.Primitive("log"), x, envir « sys.parent(l))
literze, to możemy błędogenną sytuację skopiować na inny komputer i tam ją prze-lizować lub wysłać ją komuś z prośbą o pomoc. Gdybyśmy chcieli, by po napotkają błędu natychmiast pojawiło się okienko debuggera, możemy skorzystać z funkcji |||£i:over(utils). W tym celu należy wykonać następujące polecenie.
IłiptipjiE (error * recover)
Jeżeli błąd już wystąpił, a my nie kazaliśmy wcześniej zapisać informacji o sta-t '■ . nie zmiennych w chwili wystąpienia błędu, to do zorientowania się, gdzie błąd mógł * i j ĄwystąP*t. możemy użyć funkcji traceback(base). Funkcja ta wypisuje listę wywo-iCłanych funkcji wraz z argumentami z jakimi zostały one wywołane. Prześledźmy poniższy przykład.
•
■ J zdefiniujmy jeszcze jedną pomocniczą funkcję | ;i.j;1f)uikcja2 = fimction(x,y) ffunkcja(x); funkcja(y)} to wywołanie prowadzi do błędu > funkcja2(l,"jeden")
Error in log(x) : Non-numeric argument to mathematical function :■ s'V' '# prześledźmy, które funkcje i z jakimi argumentami były wywoływane
"jodan")
Jeszcze innym sposobem szukania błędów jest debugowanie funkcji krok po kro-:£ku. Do tego celu służy funkcja debug(base). Zaznacza ona, że wskazana argumentem funkcja ma być uruchamiana w trybie śledzenia krok po kroku. W trakcie wykony-' ; wania tej funkcji można korzystać z poleceń n (wykonaj kolejną linię kodu), c (wykonaj całą funkcję) lub Q (zamknij debugger). Debugowanie wyłącza się funkcją undebug(base). Na poniższym przykładzie prezentujemy działanie funkcji debugO.
-^^r7jr:*-iCTrrifgrr Tiirii"ji g-ki# zaznacz funkcje funkcja2() do debuggowania ■ > debug(funkcja2)
> i wywołujemy funkcje funkcja2(), uruchamia się też debugger tJy&nkoj a2 (1, "jeden”) debugging in: funkcja2(l, “jeden")
-debug: { j’ '
funkcja(x)
Ife funkcja(y)
. .|^.ó''deCl]> x tt przed pierwszym poleceniem, sprawdźmy wartość x
JBfbyseCl]> n tt wykonywana jest pierwsza linia i przechodzimy do kolejnej llfdbug: funkcja(x)
ifięowse[l]> y tt przed drugim poleceniem, sprawdźmy wartość y !J[1] "jeden"
n # wykonywana jest druga linia debug: funkcja(y)
'■‘Brnyse[1] > n tt napotykamy błąd
jĘfror in log(x) : Non-numeric argument to mathematical function