Unul din factorii care întârzie repararea unei probleme este modul în care aceasta este raportată. Prin crearea acestui ghid, sperăm să îmbunătăţim comunicarea dintre developer şi utilizator. Repararea problemelor raportate de utilizatori este o componentă foarte importantă, dacă nu crucială, a calităţii unui proiect, şi sperăm să devină un succes.
În timp ce rulaţi comanda emerge sau în timp ce rulaţi un program şi ceea ce n-ar trebui să se întâmple se întâmplă -- aţi găsit un bug! Bug-urile vin în diferite forme, cum ar fi probleme de emerge sau segmentation faults. Indiferent care este cauza, o asemenea problemă trebuie rezolvată. Câteva exemple de bug-uri:
$ ./bad_code `perl -e 'print Ax100'` Segmentation fault
/usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.2/include/g++-v3/backward/backward_warning.h:32:2: warning: #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <sstream> instead of the deprecated header <strstream.h>. To disable this warning use -Wno-deprecated. In file included from main.cc:40: menudef.h:55: error: brace-enclosed initializer used to initialize ` OXPopupMenu*' menudef.h:62: error: brace-enclosed initializer used to initialize ` OXPopupMenu*' menudef.h:70: error: brace-enclosed initializer used to initialize ` OXPopupMenu*' menudef.h:78: error: brace-enclosed initializer used to initialize ` OXPopupMenu*' main.cc: In member function `void OXMain::DoOpen()': main.cc:323: warning: unused variable `FILE*fp' main.cc: In member function `void OXMain::DoSave(char*)': main.cc:337: warning: unused variable `FILE*fp' make[1]: *** [main.o] Error 1 make[1]: Leaving directory `/var/tmp/portage/xclass-0.7.4/work/xclass-0.7.4/example-app' make: *** [shared] Error 2 !!! ERROR: x11-libs/xclass-0.7.4 failed. !!! Function src_compile, Line 29, Exitcode 2 !!! 'emake shared' failed
Aceste probleme sunt foarte neplăcute. Ce trebuie să faceţi odată ce au
fost detectate? Următoarele secţiuni descriu două unelte importante
folosite în repararea erorilor descoperite în timpul rulării programelor.
Apoi, vom arunca o privire la erorile de compilare. Să începem cu prima
unealtă de depanare a problemelor de rulare --
GDB, sau (G)NU (D)e(B)ugger, este un program folosit pentru diacnosticarea
problemelor de corupţie de memorie. Mai întâi, să vedem în ce constă
procesul de depanare. Primul lucru care trebuie făcut este să
(fără simboluri de depanare) -rwxr-xr-x 1 chris users 3140 6/28 13:11 bad_code(cu simboluri de depanare) -rwxr-xr-x 1 chris users 6374 6/28 13:10 bad_code
Pentru referinţă,
CFLAGS="-O1 -pipe -g -ggdb" CXXFLAGS="${CFLAGS}"
Apoi, puteţi adăuga debug între indicatorii USE corespunzători pachetului
respectiv. Aceasta se poate face modificând fişierul
# echo "category/package debug" >> /etc/portage/package.use
Apoi reinstalaţi pachetul cu modificările de mai sus după cum se arată mai jos.
# FEATURES="nostrip" emerge pachet
Acum, că simbolurile sunt incluse, putem începe operaţia de depanare.
Să presupunem că avem un program numit "bad_code". Cineva susţine că programul returnează eroare şi ne dă un exemplu. Începem testarea:
$ ./bad_code `perl -e 'print Ax100'` Segmentation fault
Se pare că utilizatorul a avut dreptate, acesta este în mod clar un bug. A
venit timpul să ne folosim de
$ gdb --args ./bad_code `perl -e 'print Ax100'` GNU gdb 6.3 Copyright 2004 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "i686-pc-linux-gnu"...Using host libthread_db library "/lib/libthread_db.so.1".
Ar trebui să vedeţi un prompt intitulat "(gdb)" care aşteaptă comenzi.
Mai întâi pornim programul. Introducem
(gdb) run Starting program: /home/chris/bad_code Program received signal SIGSEGV, Segmentation fault. 0xb7ec6dc0 in strcpy () from /lib/libc.so.6
Vedem aici programul pornind şi primind notificarea SIGSEGV sau Segmentation
Fault. Acesta este GDB spunându-ne că programul a eşuat. De asemenea, ne
spune care a fost ultima funcţie care a rulat înainte de crash. Totuşi,
informaţia nu este teribil de folositoare, există nenumărate locuri în
program unde funcţia strcpy este chemată, şi este dificil de determinat
care din ele a generat problema. Pentru a ajuta pe developer trebuie să
generăm ceea ce se numeşte un backtrace. Un backtrace este o listă a
funcţiilor care au fost executate în succesiune de program, terminând cu
funcţia care a generat crash-ul. Funcţiile care au fost returnate fără
crash nu apar în backtrace. Pentru a genera backtrace-ul, introduceţi comanda
(gdb) bt #0 0xb7ec6dc0 in strcpy () from /lib/libc.so.6 #1 0x0804838c in run_it () #2 0x080483ba in main ()
Backtrace-ul ne spune că funcţia main() a fost chemată prima, urmată de
funcţia run_it(), iar undeva în această funcţie se găseşte apelul
funcţiei strcpy() care a generat problema. Există un număr mic de
excepţii când un backtrace nu ne oferă informaţia pe care o căutăm.
Primul este cazul în care uităm să adăugăm simboluri de depanare cu
(gdb) bt #0 0xb7e2cdc0 in strcpy () from /lib/libc.so.6 #1 0x0804838c in ?? () #2 0xbfd19510 in ?? () #3 0x00000000 in ?? () #4 0x00000000 in ?? () #5 0xb7eef148 in libgcc_s_personality () from /lib/libc.so.6 #6 0x080482ed in ?? () #7 0x080495b0 in ?? () #8 0xbfd19528 in ?? () #9 0xb7dd73b8 in __guard_setup () from /lib/libc.so.6 #10 0xb7dd742d in __guard_setup () from /lib/libc.so.6 #11 0x00000006 in ?? () #12 0xbfd19548 in ?? () #13 0x080483ba in ?? () #14 0x00000000 in ?? () #15 0x00000000 in ?? () #16 0xb7deebcc in __new_exitfn () from /lib/libc.so.6 #17 0x00000000 in ?? () #18 0xbfd19560 in ?? () #19 0xb7ef017c in nullserv () from /lib/libc.so.6 #20 0xb7dd6f37 in __libc_start_main () from /lib/libc.so.6 #21 0x00000001 in ?? () #22 0xbfd195d4 in ?? () #23 0xbfd195dc in ?? () #24 0x08048201 in ?? ()
Acest backtrace conţine un număr mare de ??, deoarece fără simboluri de
depanare,
(gdb) bt #0 0xb7e4bdc0 in strcpy () from /lib/libc.so.6 #1 0x0804838c in run_it (input=0x0) at bad_code.c:7 #2 0x080483ba in main (argc=1, argv=0xbfd3a434) at bad_code.c:12
Mult mai multă informaţie este disponibilă în acest caz. Nu numai numele funcţiei dar şi numărul liniei de cod sursă este disponibil. Aceasta este metoda preferată, preţul plătit este o creştere a dimensiunilor executabilului. Iată cum variază această dimensiune pentru un program cu sau fără simboluri de depanare, şi cu indicatorul -ggdb activ:
(fără simboluri de depanare) -rwxr-xr-x 1 chris users 3140 6/28 13:11 bad_code(cu simboluri de depanare) -rwxr-xr-x 1 chris users 6374 6/28 13:10 bad_code(idicatorul -ggdb activ) -rwxr-xr-x 1 chris users 19552 6/28 13:11 bad_code
După cum se vede, -ggdb adaugă
(gdb) quit The program is running. Exit anyway? (y or n) y $
Aceasta încheie demonstraţia noastră de
Deseori, programele folosesc alte fişiere pentru a obţine informaţia de
configuraţie, pentru a accesa informaţille hardware sau pentru a scrie
jurnalele. Uneori, programele încearcă să acceseze aceste fişiere în
mod incorect. Pentru a diagnostica astfel de probleme se foloseşte utilitarul
$ ./foobar2 Configuration says: bar
Versiunea originală folosea configuraţia setată în foo, deci să
încercăm
Folosim
# strace -ostrace.log ./foobar2
Această comandă crează un fişier intitulat
open(".foobar2/config", O_RDONLY) = 3 read(3, "bar", 3) = 3
Aha! Deci aceasta era problema. Cineva a modificat numele directorului de
configurare din
În acest mod sunt diagnosticate problemele de rulare a programelor. Aceste
probleme devin vizibile numai în cazul în care programul este rulat. În
unele cazuri nu ajungem atât de departe, s-ar putea ca programul nici să nu
compileze. Să vedem cum se diagnostichează problemele de compilare
rezultate la
Erorile
Presupunem următoarea eroare
gcc -D__TEST__ -D__GNU__ -D__LINUX__ -L/usr/lib -I/usr/include -L/usr/lib/nspr/ -I/usr/include/fmod -c -o foobar2-7.o foobar2-7.c gcc -D__TEST__ -D__GNU__ -D__LINUX__ -L/usr/lib -I/usr/include -L/usr/lib/nspr/ -I/usr/include/fmod -c -o foobar2-8.o foobar2-8.c gcc -D__TEST__ -D__GNU__ -D__LINUX__ -L/usr/lib -I/usr/include -L/usr/lib/nspr/ -I/usr/include/fmod -c -o foobar2-9.o foobar2-9.c gcc -D__TEST__ -D__GNU__ -D__LINUX__ -L/usr/lib -I/usr/include -L/usr/lib/nspr/ -I/usr/include/fmod -c -o foobar2.o foobar2.c foobar2.c:1:17: ogg.h: No such file or directory make: *** [foobar2.o] Error 1 !!! ERROR: sys-apps/foobar2-1.0 failed. !!! Function src_compile, Line 19, Exitcode 2 !!! Make failed! !!! If you need support, post the topmost build error, NOT this status message
Toate merg bine până când compilarea se opreşte brusc cu un mesaj de eroare. Această eroare particulară poate fi împărţită în trei secţiuni: mesajul de compilare, eroarea de build şi eroarea de emerge după cum se arată mai jos.
(Mesaje de compilare) gcc -D__TEST__ -D__GNU__ -D__LINUX__ -L/usr/lib -I/usr/include -L/usr/lib/nspr/ -I/usr/include/fmod -c -o foobar2-7.o foobar2-7.c gcc -D__TEST__ -D__GNU__ -D__LINUX__ -L/usr/lib -I/usr/include -L/usr/lib/nspr/ -I/usr/include/fmod -c -o foobar2-8.o foobar2-8.c gcc -D__TEST__ -D__GNU__ -D__LINUX__ -L/usr/lib -I/usr/include -L/usr/lib/nspr/ -I/usr/include/fmod -c -o foobar2-9.o foobar2-9.c gcc -D__TEST__ -D__GNU__ -D__LINUX__ -L/usr/lib -I/usr/include -L/usr/lib/nspr/ -I/usr/include/fmod -c -o foobar2.o foobar2.c(Eroare build) foobar2.c:1:17: ogg.h: No such file or directory make: *** [foobar2.o] Error 1(Eroare emerge) !!! ERROR: sys-apps/foobar2-1.0 failed. !!! Function src_compile, Line 19, Exitcode 2 !!! Make failed! !!! If you need support, post the topmost build error, NOT this status message
Mesajele de compilare stau la baza erorii. În general, este bine să includem cel puţin 10 linii cu informaţie de compilare, pentru a-l informa pe developer unde exact se afla compilarea.
Erorile de build (sau erori de make) sunt erorile în sine, şi este ceea ce developer-ul are nevoie. Când vedeţi "make: ***", acesta este în general locul în care eroarea s-a produs. În general puteţi copy şi paste 10 linii deasupra erorii make iar dezvoltatorul va putea rezolva problema. În cazul în care aceasta nu este suficient, vom vedea ulterior o alternativă.
Eroarea emerge este generată de utilitarul
PORT_LOGDIR este o variabilă portage care setează directorul de log pentru
emerge. Să aruncăm o privire să vedem ce înseamnă aceasta. Mai
întâi, rulaţi emerge setând PORT_LOGDIR pentru locaţia dumneavostră
favorită. Să presupunem că dorim să o setăm ca
# PORT_LOGDIR=/var/log/portage emerge foobar2
Acum, emerge va eşua din nou. Totuşi, în acest caz avem un log cu care putem lucra. Îl putem ataşa la raport de bug ulterior. Să aruncăm o privire în directorul de log.
# ls -la /var/log/portage total 16 drwxrws--- 2 root root 4096 Jun 30 10:08 . drwxr-xr-x 15 root root 4096 Jun 30 10:08 .. -rw-r--r-- 1 root root 7390 Jun 30 10:09 2115-foobar2-1.0.log
Formatul fişierului log este [contor]-[nume pachet]-[versiune].log. Counter este o variabilă specială al cărui scop este de a număra global pachetele care au fost emerged. Această variabilă are scopul de a preveni duplicarea jurnalelor de emerge. O scurtă privire în acest fişiere ne va arăta întregul proces de emerge. Acest fişier va fi ataşat mai târziu la raport după cum se descrie în secţiunea referitoare la raportarea bug-ului. Înainte de a continua mai departe, să vedem cum se face o căutare pentru bug-uri deja raportate.
Gentoo foloseşte
Una dintre cele mai neplăcute activităţi pentru dezvoltatori este găsirea bag-urilor duplicate. Aceasta rezultă în irosirea unei cantităţi impresionante de timp care ar putea fi utilizat altfel pentru repararea propriu-zisă a problemei. Deseori, această situaţie poate fi prevenită printr-un simplu search. Explicăm în continuare cum să căutăm dacă există deja un bug similar în baza de date. Folosim de exemplu eroarea emerge xclass folosită anterior.
/usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.2/include/g++-v3/backward/backward_warning.h:32:2: warning: #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <sstream> instead of the deprecated header <strstream.h>. To disable this warning use -Wno-deprecated. In file included from main.cc:40: menudef.h:55: error: brace-enclosed initializer used to initialize ` OXPopupMenu*' menudef.h:62: error: brace-enclosed initializer used to initialize ` OXPopupMenu*' menudef.h:70: error: brace-enclosed initializer used to initialize ` OXPopupMenu*' menudef.h:78: error: brace-enclosed initializer used to initialize ` OXPopupMenu*' main.cc: In member function `void OXMain::DoOpen()': main.cc:323: warning: unused variable `FILE*fp' main.cc: In member function `void OXMain::DoSave(char*)': main.cc:337: warning: unused variable `FILE*fp' make[1]: *** [main.o] Error 1 make[1]: Leaving directory `/var/tmp/portage/xclass-0.7.4/work/xclass-0.7.4/example-app' make: *** [shared] Error 2 !!! ERROR: x11-libs/xclass-0.7.4 failed. !!! Function src_compile, Line 29, Exitcode 2 !!! 'emake shared' failed
Începem căutarea la
Click pe "Query Existing bug reports". Motivul pentru care folosim aceasta în loc de o căutare simplu, este că o căutare simplă tinde să dea rezultate vagi şi, în general, crează probleme utilizatorilor în găsirea bug-urilor duplicate. După click suntem direcţionaţi la următoarea pagină.
Continuaţi prin a apăsa pe "Advanced Search" pentru a ajunge la pagina de Căutare Avansată.
Pagina de Căutare Avansată arată ca mai sus. Deşi pare complicată, ne vom uita la un număr mic de opţiuni pentru a filtra rezultatele.
În primul câmp intitulat Summary vom pune numele pachetului cu probleme. Dacă Bugzilla nu returnează nici un rezultat încercaţi fără a specifica numele pachetului, asta pentru cazurile în care bug-ul nu a fost raportat utilizând acest nume (foarte puţin probabil însă s-au văzut cazuri).
Product, Component, şi Version sunt lăsate la valoarea implicită pentru a nu fi excesiv de specific în cazul în care bug-ul a fost introdus pentru o altă versiune/componentă/etc.
Comment este cel mai important câmp. Folosiţi-l pentru a detalia problema specifică. Practic, nu folosiţi nimic de la începutul erorii de build, folosiţi o linie de dinaintea ei care menţionează eroarea. De asemenea, înlăturaţi orice punctuaţie pentru a împiedica Bugzilla să interpreteze rezultatele în mod greşit. Exemplu din eroarea emerge xclass:
menudef.h:78: error: brace-enclosed initializer used to initialize `OXPopupMenu'(eliminaţi caractele apostrof ' ') menudef.h 78 error brace-enclosed initializer used to initialize OXPopupMenu
Conţinutul de mai sus este destul de specific pentru a găsi bug-ul, fără a intra în alte probleme de compilare ale xclass.
URI, Whiteboard şi Keywoards pot fi lăsate nemodificate. Tot ce am introdus până acum ar trebui să fie suficient să găsim bug-ul. Să vedem ce am introdus.
Apăsăm apoi pe butonul Search şi primim rezultatele...
Numai două bug-uri! Aceasta este mult mai uşor de verificat. Click pe primul, şi bineînţeles este ceea ce căutam.
Nu numai că l-am găsit, însă a şi fost rezolvat. Verificând ultimul comentariu, acesta este soluţia pentru bug şi ştim ce trebuie să facem pentru a-l rezolva. Să vedem acum ce s-ar fi întâmplat dacă nu am fi apelat la Căutare Avansată.
Încă patru bug-uri. Pentru pachete mai mari situaţia este şi mai rea. Totuşi, folosind aceste unelte simple, putem filtra suficient de bine lista de bug-uri pentru a-l localiza.
Să presupunem că aţi căutat şi căutat şi nu aţi găsit nimic. În acest caz aveţi un bug nou. Să vedem cum arată procesul de raportare a bug-urilor noi.
În acest capitol vom descrie modul de utilizare Bugzilla pentru a raporta un
bug nou. Începeţi prin a merge la
Click pe "Report a Bug - Using the guided format"
După cum vedeţi accentul major se pune pe introducerea bug-ului în locul corespunzător. Majoritatea bug-urilor merg la Gentoo Linux.
În ciuda acestui fapt, unii utilizatori vor raporta bug-ul către portage development (presupunerea este că echipa de dezvoltatori portage este responsabilă de structura portage) sau infra (prespunerea este că infra are acces la mirror-uri şi rsync şi poate să rezolve problema în mod direct). Lucrurile nu stau aşa.
O altă neînţelegere se referă la bug-urile pentru documentaţie. De
exemplu, un utilizator găseşte un bug pe pagina de
Bug-ul nostru va fi postat în Gentoo Linux întrucât este o problemă de ebuild. Ne ducem acolo şi începem primul pas al procesului...
Primul pas este foarte important, după cum este sugerat şi de textul în roşu. Acesta este locul unde căutaţi dacă altcineva nu are aceeaşi problemă. Dacă săriţi peste acest pas şi un bug similar este găsit, va fi marcat ca DUPLICATE (Duplicat) în detrimentul timpului pierdut de echipa QA pentru această operaţie. Pentru a vă da o idee, bug-urile de mai sus sunt marcate drept duplicate. Trecem la pasul al doilea unde introducem mai multă informaţie.
Să vedem despre ce este vorba.
Deci, pentru exemplul nostru avem:
A nu include categoria pachetului în Summary nu este rău, însă se recomandă. Dacă însă numele pachetului nu este inclus, este greu de spus la ce se referă bug-ul şi va trebui să vă întrebăm mai târziu. Numărul versiunii este important pentru toţi utilizatorii care caută prin lista de bug-uri. Dacă 20 de utilizatori au trimis bug-uri şi nici unul nu a specificat o versiune, este imposibil pentru cei ce vor căuta bug-uri mai târziu să spună dacă este sau nu un bug. În acest caz ar trebui să se uite pe rând la fiecare bug însă dacă sunt de exemplu 200 de bug-uri... nu este prea uşor. După informaţia referitoare la pachet trebuie să includeţi o mică descriere a incidentului. Iată un exemplu:
Aceste reguli simple vor uşura prelucrare ulterioară a bug-urilor. În continuare o serie de detalii. Vom lua un mic exemplu.
Cu aceasta dezvoltatorul ştie de ce trimitem bug-ul. Developer-ul va încerca să îl reproducă. Reproductibilitatea ne spune cât de des putem face ca problema să se întâmple din nou. În acest caz, o putem reproduce de fiecare dată rulând foobar2. Să adăugăm această informaţie.
Am explicat deci că am găsit un bug. Următorul pas este să explicăm ce rezultate am obţinut şi ce credem că ar fi trebuit să conţină.
Orice informaţie adiţională poate fi adăugată. Aceasta poate conţine
stack traces, jurnalul comenzii strace, secţiuni (deoarece întregul
log este foarte mare şi nu foarte folositor), şi cel mai important
rezultatul lui
Apoi selectăm severitatea bug-ului. Puţină atenţie este necesară. În cele mai multe cazuri este OK să o lăsăm aşa cum este şi altcineva o va mări sau micşora de la caz la caz. Dacă totuşi decideţi să măriţi severitatea, vă rugăm să citiţi cu atenţie ca să nu faceţi o greşeală. O explicaţie a nivelelor de severitate o găsiţi mai jos.
Lăsăm nivelul neschimbat, pe Normal.
Trimitem bug-ul apăsând pe butonul Submit Bug Report. Verfificaţi
Dacă ne uităm la bug, vedem informaţia pe care am trimis-o. Vom observa ca bug-ul a ajuns la bug-wranglers@gentoo.org. Aceasta este locaţia implicită pentru bug-urile componentei Application.
Detaliile introduse de dumneavoastră sunt de asemenea disponibile.
În general cei din echipa bug-wranglers nu vor rezolva bug-ul, acesta va fi
trimis unui developer (puteţi cere bug-wranglers să vi-l trimită
dumneavoastră). Pentru aceasta se foloseşte metadata.xml incorporată în
pachet. O puteţi găsi uzual în
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd"> <pkgmetadata> <herd>chriswhite</herd> <maintainer> <email>chriswhite@gentoo.org</email> <name>Chris White</name> </maintainer> <longdescription lang="en"> Foobar2 is a package that uses a configuration file to display a word. </longdescription> </pkgmetadata>
Observaţi secţiunea manitainer. Aceasta listează maintainer-ul pachetului, care în acest caz sunt eu, Chris White. Adresa de email listată este chriswhite@gentoo.org. Vom folosi aceasta pentru a reatribui bug-ul persoanei care trebuie. Click pe Reassign bug to, şi introduceţi adresa de email.
Apăsaţi apoi butonul Commit pentru ca schimbarea să aibă loc. Bug-ul mi-a fost reatribuit mie. Puţin mai târziu, voi răspunde (de regulă prin email) la bug. Am spus că aş dori să văd un jurnal strace pentru a înţelege cum încearcă programul să ajungă la fişierele de configurare. Folosind instrucţiunile anterioare obţineţi un jurnal pe care îl ataşaţi bug-ului. Pentru aceasta apăsaţi "Create A New Attachement".
Acum, trebuie să ataşăm jurnalul. Haideţi să parcurgem toţi paşii.
În ceea ce priveşte Content Type, iată câteva detalii. Puteţi bifa
opţiunea "patch" dacă trimiteţi un patch. Altfel, puteţi cere interfeţei
Bugzilla să autodetecteze tipul fişierului (nerecomandat). Cealaltă
opţiune este "select form list", este cea mai frecvent folosită. Alegeţi
text simplu (text/plain) pentru
Trimitem
Am menţionat anterior că uneori ebuild-urile vă vor cere să ataşaţi un fişier în mesajul de eroare. Un exemplu este mai jos.
configure: error: PNG support requires ZLIB. Use --with-zlib-dir=<DIR> !!! Please attach the config.log to your bug report: !!! /var/tmp/portage/php-5.0.3-r1/work/php-5.0.3/config.log !!! ERROR: dev-php/php-5.0.3-r1 failed. !!! Function econf, Line 485, Exitcode 0 !!! econf failed !!! If you need support, post the topmost build error, NOT this status message.
Vă rugăm să ataşaţi orice fişier menţionat în acest raport.
Să presupunem că în timp ce facem aceasta, o altă persoană găseşte bug-ul căutând prin bugzilla şi este curios să vadă ce se întâmplă cu bug-ul. Ar putea să facă aceasta intoducând adresa de email în câmpul Add CC după cum se arată mai jos. Puteţi în acest fel să urmăriţi orice bug prin această metodă.
După toată această muncă, bug-ul va trece prin diferite stagii. Aceasta se face în general de Dezvoltatorii Gentoo şi uneori de către cel ce a raportat bug-ul. Urmează stadiile variate prin care poate trece un bug în timpul valabilităţii acestuia.
Imediat apoi, găsim eroarea în strace log şi rezolvăm problema, trecând bug-ul în starea RESOLVED FIXED şi menţionând că a fost o schimbare în locaţia fişierelor de configurare. Un avertisment a fost introdus în ebuild. Problema a fost rezolvată şi veţi obţine:
Puţin mai jos veţi observa:
Aceasta vă permite să redeschideţi bug-ul dacă doriţi aşa ceva (de exemplu, developer-ul crede că l-a rezolvat, însă din punctul dumneavoastră de vedere problema persistă). Acum că a fost rezolvat, bug-ul poate fi pus în una din următoarele stări.
Uneori, înainte ca un bug să poată fi rezolvat, dezvoltatorul ar putea să vă ceară să încercaţi un ebuild de test. În capitolul următor vom vedea cum se face aceasta.
Să presupunem că aţi raportat un bug pentru foobar2. Problema de compilare a fost rezolvată de către dezvoltator, însă acesta ar avea nevoie de dumneavoastră să testaţi noul ebuild pentru a se asigura că funcţionează şi pentru dvs.:
Vocabularul este puţin confuz în acest caz. Pentru început, să vedem ce
este un overlay. Un overlay este un director special precum
PORTDIR_OVERLAY="/usr/local/portage"
Apoi, vom crea un nou director pentru acest ebuild de test. Vom pune noile fişiere în sys-apps/foobar2. Veţi observa al doilea comentariu care ne întreabă unde este directorul pentru acest patch. Noul director conţine informaţia de md5sum pentru versiunea particulară a pachetului şi orice alte fişiere care nu sunt incluse în mod normal în arhiva sursă (patch-uri, scripturi de iniţializare, etc). Acesta este un subdirector în pachet intitulat files. Continuaţi cu crearea acestor directoare:
# mkdir -p /usr/local/portage/sys-apps/foobar2/files
Apoi descărcăm fişierele. ebuild este pus în
Procesul de creare a unui ebuild care poate fi folosit de comanda emerge este foarte simplu. Acesta poate fi creat cu comanda ebuild. Rulaţi-o după cum se arată mai jos.
# ebuild foobar2-1.0.ebuild digest >>> Generating digest file... <<< foobar2-1.0.tar.bz2 >>> Generating manifest file... <<< foobar2-1.0.ebuild <<< files/digest-foobar2-1.0 <<< files/foobar2-1.0-Makefile.patch >>> Computed message digests.
Să vedem dacă funcţionează corect.
# emerge -pv foobar2 These are the packages that I would merge, in order: Calculating dependencies ...done! [ebuild N ] sys-apps/foobar2-1.0 0 kB [1] Total size of downloads: 0 kB Portage overlays: [1] /usr/local/portage
Se pare că a mers! Veţi observa [1] lângă linia [ebuild]. Aceasta ne
îndreaptă la
# emerge foobar2 Calculating dependencies ...done!(liniile de compilare îndepărtate) >>> Unpacking foobar2-1.0.tar.bz2 to /var/tmp/portage/foobar2-1.0/work * Applying foobar2-1.0-Makefile.patch ... [ ok ](informaţiile despre compilare îndepărtate) >>> Merging sys-apps/foobar2-1.0 to / >>> chris +sandbox(preinst) --- /usr/ --- /usr/bin/ >>> /usr/bin/foobar2
În prima secţiune, vedem că emerge a pornit în mod corespunzător. Din a doua secţiune deducem că noul patch a fost aplicat fără probleme din status-ul "[ ok ]". Noul patch funcţionează! În acest moment, putem să-l informăm pe dezvoltator că noul patch este bun, iar acesta îl poate comite în portage.
Încheiem astfel acest howto despre Bugzilla. Sperăm că îl veţi găsi
folositor. Trimiteţi-mi orice întrebare, sugestie sau comentariu referitor la
acest document pe adresa