În prezent, atunci când companiile acordă o atenție deosebită calității produselor lor, programele instabile devin necompetitive pe piața modernă. Încărcarea, regresia și testarea unităților multiple îmbunătățesc aplicațiile, dar se produc încă eșecuri. Diferite cărți oferă diferite abordări inteligente pentru scrierea de cod sigur, dar aș îndrăzni să sugereze că închiderile aplicației, care se încadrează și va cădea. Ei bine, dacă cad în laboratorul de testare, dar pot cădea și pe clienți. Și, uneori, accidentele de program pentru nici un motiv aparent din cauza unei combinații fatale de circumstanțe care testerul nu poate și nu va fi capabil să repete ... Apropo, atenuând testere de muncă, de asemenea, merită să ne gândim - ei sunt oameni, și ei sunt greu de a alege calea cea mai scurtă pentru redare eșec.
Cu toate acestea, imediat o să fac o rezervare - nu pot să descriu fișierele sursă ale tuturor componentelor menționate în articol, deoarece sistemul descris mai jos este proprietatea companiei mele.
Deci, dacă sunteți încă plini de entuziasm - să începem!
Cum a început totul
Cu ceva timp în urmă, am decis să folosim bibliotecile terțelor părți ale unei companii într-unul dintre produsele noastre. Conectat, verificat - totul a funcționat ca un ceas. Dar, într-o zi ploioasă, au început câteva scrisori, apoi apeluri unice, apoi a început un bârf de mesaje de eroare, că cererea noastră este instabilă. Am început să o testăm în țara noastră, dar nu am reprodus nimic.
Apoi au început călătoriile către clienți și solicită să se noteze ordinea acțiunilor care au condus la eșec. După un timp, a fost găsit vinovatul. Da, da, sa dovedit a fi acea bibliotecă (dar în locul ei ar putea fi orice alta, inclusiv a noastră). Sa dovedit că este parțial incompatibil cu produsele software terță parte. Trei săptămâni petrecute în procedură, am trăit într-un mod de lucru ...
Aceasta a fost pentru mine o lecție. Din nefericire, programul care se încadrează a fost a mea, din cauza a ceea ce am abordat imediat problema creării de instrumente de detectare a erorilor. Nu am găsit soluții gata făcute, așa că am început să-mi dezvolt singur.
terminologie
Drop dump (dump) este un fișier special care este colectat utilizând biblioteca dbghelp.dll, care conține informații despre stiva aplicației în momentul căderii. De asemenea, conține informații despre module încărcate, mânere, fire, locații de memorie etc. În cele mai multe cazuri, ajută la dezasamblarea teancului aplicației.
Versiunea de lansare a fișierului (prescurtată) - un fișier executabil binar, colectat din codul sursă al proiectului. Este destul de diferit de versiunea de depanare (de exemplu, prezența optimizării și lipsa inițializării datelor cu valori speciale de depanare). Există o concepție greșită că fișierele de lansare nu pot fi depanate. De fapt, puteți să le debugați, doar în mod implicit, MS Visual Studio nu include suport pentru caractere în versiuni de lansare. Documentația Microsoft spune că activarea caracteristicilor de sprijin ușoară crește dimensiunea fișierelor binare. Cu toate acestea, în experiența mea personală, mărimea fișierului crește (și semnificativ). În medie, fișierul este mărit cu 100 kilobytes. În cazul proiectelor de mari dimensiuni, acest lucru nu este vizibil, însă proiectele mici, după această creștere semnificativă.
Pentru a activa generarea de simboluri în versiuni de lansare, selectați opțiunea "Generați baza de date a programului" pentru opțiunea "Format informații de depanare" (opțiune compilator / Zi) în setările compilatorului. Dacă uitați să faceți acest lucru, fișierul simbol nu va fi construit complet și nu va fi posibil să îl depanați.
Fișier PDB (fișier caracter sau doar caractere). Când proiectul este compilat, linker-ul construiește executabilul. Companiile de software au dezvoltat de mult diferite metode de stocare a informațiilor despre linii de fișiere sursă în modulele de simboluri. În prezent, cele mai utilizate pe scară largă (vorbim despre Microsoft) este versiunea PDB 2 (MS Visual Studio 6.0) și PDB 7.0 (MS Visual Studio 7.0+). Aceste formate oferă posibilitatea de a obține informații extinse despre modulele executabile, inclusiv capacitatea de a analiza stiva, de a obține variabile locale și așa mai departe.
Windbg. Unul dintre programele de depanare ale aplicațiilor Microsoft. Părerea mea este că sistemul mic pe computer foarte ușor pentru a depana în Visual Studio, dar de îndată ce cererea devine distribuit și complex, sau necesită depanarea la distanță în condiții dificile, cel mai convenabil mod - l windbg. Repet că aceasta este opinia mea personală. În plus, WinDBG include diverse utilitare pentru a facilita depanarea.
Structura generală a sistemului
În primul rând, trebuie să determinați funcțiile sistemului de procesare a deșeurilor. Sistemul ar trebui să poată:
- Luați gropile de gunoi de la clienți și le procesați.
- Luați gropi de gunoi de la departamentele de testare și de control al calității cu abilitatea programatorului de a reacționa imediat la o eroare.
- Efectuați procesarea deșeurilor pentru a găsi programatorul responsabil pentru componenta care a provocat eroarea și redirecționați depozitul la acesta.
- Înregistrați erorile legate de sistemul de urmărire a erorilor.
- Au capacitatea de a sistematiza prelucrarea depozitelor de către departamentul de testare.
Astfel, sistemul ar trebui să cuprindă următoarele module:
- Magazinul de caractere. Acesta stochează în sine atât simboluri proprii ale componentelor software, cât și simboluri ale bibliotecilor și aplicațiilor externe, inclusiv cele incluse în sistemul de operare.
- Stații de parsing pentru server. Utilizează depozitul de simboluri. Serverul asculta conexiunile de rețea de intrare și verifică periodic e-mailurile pentru depozitele noi. Câmpurile sunt analizate utilizând WinDBG și diferitele sale extensii.
- Bibliotecă pentru colectarea haldelor. Colectează o anvelopă de eroare a aplicației și o transmite către serverul Dump. În modul local (intranet), le trimite direct către server și, în funcție de rezultatele răspunsului serverului, implementează diverse comportamente. Într-un mod remote (extranet), colectează o groapă de cădere și o transmite prin e-mail.
Acum luăm în considerare toate componentele în detaliu.
Magazinul de caractere
Acum avem fișiere binare și fișiere de caractere. Ce să faci cu ei?
Pentru a înțelege ce trebuie să faceți cu ele, trebuie să luați în considerare un script tipic pentru dezvoltarea aplicațiilor:
- Programatorul creează componenta.
- Componenta este testată.
- Componenta este transferată clienților.
- Programatorul continuă să dezvolte componenta.
Dacă după etapa 4 clientul are erori, fișierul de simbol existent (construit după transferarea componentei către clienți) nu ajută deja, deoarece nu mai corespunde componentei clientului. Prin urmare, atunci când componentele sunt transferate clienților, fișierul binar și fișierul cu simboluri trebuie salvate. Dar unde? Puteți să le salvați într-un folder separat de pe disc, dar în acest caz va trebui să aflați de fiecare dată ce versiune a aplicației are clientul, apoi copiați fișierele într-un anumit dosar de pe disc, de unde sunt utilizate. Această abordare este convenabilă atunci când există puține fișiere. Dar imaginați-vă că dezvoltați mai multe componente. Acum imaginați zeci de componente. Și acum imaginați zeci de componente pentru câteva luni de muncă. Și mesajele de eroare nu sunt doar de la clienți (care cunosc versiuni ale acestora), dar și din departamentul de testare, de la asistența tehnică, de la departamentul de control al calității ... Prin urmare, trebuie să căutați o soluție automatizată.
Microsoft sugerează crearea unui director special pe disc, denumit "magazin de simboluri". În acest director, este creat un arbore de dosar cu numele care se potrivește cu numele componentelor. În fiecare dintre aceste foldere există subfoldere cu nume speciale obținute prin intermediul fișierelor binare hashing. Aceasta oferă o căutare rapidă a componentei necesare, pe baza unor informații limitate despre aceasta (de exemplu, dintr-un dump drop). Pentru a crea un astfel de dosar, este folosit un utilitar special, symstore. Acesta scanează folderele cu componente și adaugă noi componente la depozit, de la care orice client poate alege. În plus, este posibil să extindeți motorul de căutare standard al fișierelor, scriind propria implementare a protocolului de căutare.
Exemplul de mai jos a fost obținut atunci când aplicația de testare a fost analizată pe o mașină curată, unde nu existau simboluri inițiale. Mai jos este structura de dosare obținută pe discul local după analizarea dump-ului cu descărcarea de caractere de pe Internet. După cum puteți vedea din exemplu, WinDBG a încărcat automat bibliotecile necesare pentru parsare (lista de directoare și numele lor pot diferi între computere în funcție de versiunile sistemelor de operare).
Produsele software Microsoft (Visual Studio 6.0, 7.0+, WinDBG) cunosc formatul unui astfel de director și vă permit să lucrați cu acesta convenabil. Dar întrebarea este: vă creați simbolul magazinului, pune componentele, dar căderea era adânc în bibliotecile de sistem de operare, de exemplu, în Kernel32.dll. Nu aveți simbolurile de pe sistemul de operare Windows, astfel încât să nu se poate face din căderea stivei (deoarece nu simboluri pentru fiecare funcție, care stivă cadru este prezentă în groapa de gunoi, împiedicând analiza ulterioară a listei de apeluri), astfel încât întreaga groapa nu va înțelege. Cu toate acestea, există un server special la Internet, care este un depozit al tuturor simbolului Microsoft (sau aproape toate), în ultimii ani. Protocolul standard de căutare a caracterelor funcționează cu acest server. De exemplu, este convenabil pentru a configura Visual Studio, astfel încât ea a fost în căutarea de simboluri, în primul rând aveți pe computer, apoi pe serverul de master în cadrul companiei, apoi, în cazul în care personajele sunt încă nu a fost găsit, ea le-ar fi pompat cu serverul Microsoft. În același timp, sistemul de descărcare este suficient de inteligent pentru a copia caracterele descărcate de pe Internet atât la serverul central, cât și la mașina dvs. personale.
Documentația spune că un astfel de sistem funcționează corect numai în modul de utilizator unic, dar nu am avut o singură problemă cu modul multi-utilizator.
Cu volumele mari de stocare a simbolurilor, căutarea acestora este semnificativ încetinită, astfel că Microsoft a introdus o nouă structură a magazinului de simboluri, optimizată pentru cantități mari de date. MS Visual Studio 7.0+ și WinDBG au capacitatea de a lucra cu noua structură de stocare, cu toate acestea MS Visual Studio 6.0 nu cunoaște acest format, deci trebuie să decideți ce format să utilizați. Dacă totuși doriți să utilizați MS Visual Studio 6.0, trebuie să puneți fișierul flat.txt în rădăcina memoriei de simboluri, apoi arborele de caractere va fi creat într-un format compatibil cu formatul MS Visual Studio 6.0.
Cu toate acestea, o soluție care necesită intervenție manuală este plină de erori. De fiecare dată când rulați acest utilitar și chiar și cu o mulțime de opțiuni de linie de comandă și chiar urmăriți fiecare programator individual, este o sarcină laborioasă. Automatizarea acestui proces este necesară. Pe Internet există un utilitar "CruiseControl". Acest utilitar este proiectat pentru a scana diferite surse de date, inclusiv foldere pe discuri, directoare CVS, Subversion etc. iar în caz de modificare, luați orice acțiune. Cu toate acestea, face acest lucru în alte scopuri (testarea automatizării sau "integrarea continuă" de către Fowler), dar este important ca acesta să poată fi utilizat în scopuri proprii. Și pentru noi, poate scana arhiva componentelor binare pe măsură ce se schimbă.
- Colectăm proiectul, îl postăm în CVS (așa cum se întâmplă în compania mea).
- CruiseControl se trezește, detectează o schimbare în depozit, cheamă un fișier de tip bat care lansează un simstore care efectuează o traversare recursivă a depozitului.
Sursă de analiză partajare
Deci, într-un fel avem o groapă de cădere. Se ridică întrebarea: "Ce ar trebui să fac acum?".
În primul rând, îl vom analiza cu mâinile noastre pentru a înțelege ce poate fi învățat din ea. Pentru a face acest lucru, rulați WinDBG, unde vom face următorii pași:
Am scris o mică aplicație MFC care, la apăsarea unui buton, apelează funcția CLSIDFromString cu un pointer greșit, ceea ce face ca aplicația să se prăbușească. Codul funcției este prezentat mai jos: