of 24/24
DEPANAREA PROGRAMELOR O colecție de trei articole de Pranay Rana, traduse (prescurtat) de către Marius Joldoș.Articolul, împreună cu orice cod sursa asociat se supune licenței  The Code Project Open License (CPOL). FOLOSIREA STIVEI DE APELURI ȘI A FERESTREI VALORILOR IMEDIATE Titlul original al primului articol este: "Help yourself in Debugging by using Call Stack and Immediate Window" În acest articol voi prezenta cele două ferestre importante al e lui Visual Studio care sunt utile la depanarea proiectului și obținerea imediată a valorilor variabilelor pe timpul depanării. CALL STACK WINDOW (FEREASTRA STIVEI DE APELURI ) (...) Ceea ce urmează constituie un scenariu uzual pe care am observat că-l urmează dezvoltatorii. În aplicația cu trei straturi (vezi prezentarea din ziua 6, slide 11, N.T.) dezvoltatorii pun  întotdeauna punctul de  întrerupere (breakpoint) în stratul de prezentare. Când execuția ajunge la punctul de  întrerupere aceștia verifică datele și se întreabă care metodă din stratul de business a apelat metoda din stratul de bază de date pentru a ajunge la metoda din stratul de prezentare unde se află punctul de  întrerupere. Soluția pentru a afla aceasta este Call Stack Window, care face parte din Visual Studio. Combinația de taste pentru fereastră este Ctrl + Alt + C  sau se poate ajunge din meniul Debug >> Windows >> Call Stack

Depanarea Aplicatiilor in Visual_Studio

  • View
    217

  • Download
    0

Embed Size (px)

DESCRIPTION

Teorie

Text of Depanarea Aplicatiilor in Visual_Studio

  • DEPANAREA PROGRAMELOR

    O colecie de trei articole de Pranay Rana, traduse (prescurtat) de ctre Marius

    Joldo.Articolul, mpreun cu orice cod sursa asociat se supune licenei The Code Project

    Open License (CPOL).

    FOLOSIREA STIVEI DE APELURI I A FERESTREI VALORILOR IMEDIATE

    Titlul original al primului articol este: "Help yourself in Debugging by using Call Stack and

    Immediate Window"

    n acest articol voi prezenta cele dou ferestre importante ale lui Visual Studio care sunt

    utile la depanarea proiectului i obinerea imediat a valorilor variabilelor pe timpul

    depanrii.

    CALL STACK WINDOW (FEREASTRA STIVEI DE APELURI) (...)

    Ceea ce urmeaz constituie un

    scenariu uzual pe care am

    observat c-l urmeaz

    dezvoltatorii.

    n aplicaia cu trei straturi (vezi

    prezentarea din ziua 6, slide 11,

    N.T.) dezvoltatorii pun

    ntotdeauna punctul de

    ntrerupere (breakpoint) n

    stratul de prezentare. Cnd

    execuia ajunge la punctul de

    ntrerupere acetia verific

    datele i se ntreab care

    metod din stratul de business

    a apelat metoda din stratul de

    baz de date pentru a ajunge la metoda din stratul de prezentare unde se afl punctul de

    ntrerupere. Soluia pentru a afla aceasta este Call Stack Window, care face parte din Visual

    Studio. Combinaia de taste pentru fereastr este

    Ctrl + Alt + C sau se poate ajunge din meniul Debug >> Windows >> Call Stack

  • Cum se poate vedea n imagine, cu ajutorul stivei de apeluri putei obine info despre

    metoda apelat, valorile parametrilor, numrul liniei metodei n fiierul surs, dac este apel

    intern sau extern, limbajul de program,are n care a fost scris metoda.

    IMMEDIATE WINDOW (FEREASTRA VALORILOR IMEDIATE)

    Se ntmpl ntotdeauna ca n mijlocul depanrii s dorii s executai un set de instruciuni

    sau de funcii sau s dorii s verificai valoarea unei variabile. Pentru aceasta putei folosi

    fereastra valorilor imediate, pe care o putei deschide cu combinaia de taste Ctrl + Alt + I

    sau din meniul Debug >> Windows >> Immediate Window

  • Fereastra valorilor imediate beneficiaz de suport Intellisense.

    DEPANAREA CU PUNCTE DE NTRERUPERE/PUNCTE DE TRASARE

    Titlul original al primului articol este: "Help Yourself in Debugging (Part-2) using Breakpoint/

    Tracepoint"

    n continuare voi discuta despre punctele de ntrerupere (BreakPoint) care sunt unele dintre

    cele mai folosite elemente la depanarea unei aplicaii, prin ntreruperea executrii programului n anumite puncte. Voi descrie ce ofer VS i cum se folosete la depanare

    CE ESTE UN PUNCT DE NTRERUPERE (BREAKPOINT)?

    Punctele de ntrerupere sunt o facilitate oferit de VS care permite ntreruperea execuiei la depanarea aplicaiei

  • Exemplu:

    La click in partea stng a codului n VS se va seta un punct de ntrerupere, cum se vede in imaginea de deasupra acestui text. La lansarea n execuie a programului (n modul Debug), dac acesta ajunge la breakpoint, execuia se va ntrerupe n punctul respectiv.

    MENIUL BREAKPOINT (OPIUNI)

  • Imaginea de deasupra arat meniul contextual pentru breakpoint. Cele ce urmeaz descriu opiunile disponibile, una cte una.

    1. Delete Breakpoint: tergere Permite eliminerea punctului de ntrerupere

    2. Disable Breakpoint: Dezactivare

    Permite dezactivarea punctului de ntrerupere - marcajul se va afia gri. Util dac dorii execuia fr oprire n punctul respectiv, dar ulterior dorii s-l refolosii.

    3. Location: Locaie Permite setarea unui punct de ntrerupere la locaia dat -- la o anumit linie din codul surs.

    La clic pe meniu VS va afia un dialog care ofer info despre fiierul surs, numrul liniei i al caracterului. Permite schimbarea info de linie i caracter.

    Exemplu:

    Prin schimbarea numrului de linie la 26 n fereastra de dialog, breakpoint-ul se va muta la linia 26.

  • 4. Condition: Condiie La clic pe opiune se va afia dialogul care urmeaz:

    i care are dou opiuni.

    o (A). IS true

    Permite setarea condiiei: execuia se va opri la ndeplinirea condiiei (logice) de oprire.

  • Exemplu:

    n imaginea de deasupra, condiia este "i==1000"; oprirea se va face doar la ndeplinirea condiiei date. Aceasta permite examinarea buclelor la anumite valori.

    O dat setat condiia, punctul de ntrerupere este afiat ca mai jos.

    Breakpoint-ul s-a schimbat -- icoana are un semn '+' pe ea. La aezarea cursorului mouse pe breakpoint, VS va afia info care conine condiia ca sugestie pentru unealt (tooltip).

    o (B). Has changed

    Permite oprirea dac valoarea sau obiectul s-a modificat.

  • Exemplu:

    Aici, s-a dat "n urmrire" variabila "i"; adic, dac valoarea variabilei "i" se modific, atunci execuia se va opri la atingerea acestui punct.

    Imaginea urmtoare arat coninutul sugestiei pentru unealt dup punerea condiiei

    La folosirea acestei condiii, opiunea Condition din meniul contextual Breakpoint este marcat ca n imaginea de mai jos..

  • 5. Hit CountContor de treceri Afieaz de cte ori a fost atins punctul de oprire pe timpul executrii programului..

    Acest dialog are trei opiuni care v permit s setai numrul de atingeri. Dac ce ai pus pe post de condiie este ndeplinit, atunci programul se va opri la breakpoint. Opiunile sunt auto-explicativa, cum se vede n imaginea urmtoare.

  • 6. Filter: Filtreaz Permite setarea condiiei legate de "Machinename and Process" (Numele mainii i al procesului). Imaginea urmtoare explic mai n detaliu .

    7. When HitLa atingere Permite setarea mesajului de afiat la trecerea prin punctul de ntrerupere. Opiunea convertete punctul de ntrerupere (breakpoint) n punct de trasare (tracepoint). Astfel se poate trasa execuia prin tiprirea de mesaje n fereastra de ieire (outpu) a programului.

    break:

    always - oprire ntotdeauna

    when hit count equals to - la egalitate cu

    when hit count is a multiple of - la multiplu

    de

    when hit count is greater or equal to - la

    mai mare sau egal cu

  • Exemplu:

    n imaginea de deasupra, dezvoltatorul a creeat un mesaj de tiprit de fiecare dat cnd se execut bucla.

    Textul explicativ din cutia de dialog ofer info despre cum se scrie mesajul din zona de text. D.e., se vor nlocui la execuie

    $FUNCTION - numele funciei curente $TID - id-ul firului de lucru

    $TNAME - numele firului de lucru

    $CALLER - numele funciei apelante $PID - id-ul procesului

    $PNAME - numele procesului

    Dup aprobare (click OK) breakpoint-ul va fi afiat ca un romb (vezi imaginea de mai jos)

  • La execuie, mesajele vor fi afiate la ieire (ca mai jos).

    1. Edit LabelsEditeaz etichetele Permite etichetarea (numirea) breakpoints. Dialogul este precum cel urmtor:.

    Acest lucru este util la exportarea punctelor de ntrerupere din VS: ajut la reamintirea rolului punctului de ntrerupere, la crearea altora etc.

  • 2. Export Permite exportarea breakpoints setate de ctre dezvoltator.

    Informaia este salvat n formatul "XML". Fiierul exportat arat similar cu cel din imaginea

    urmtoare

    Opiunea este util dac se dorete pstrarea punctelor de ntrerupere n vederea rencrcrii acestora la o execuie viitoare

  • BREAKPOINT WINDOW Breakpoint/tracepoint setate de ctre dezvoltator sunt afiate n aceast fereastr, care mai afieaz i alte info. Fereastra se poate afia din meniul Debug >> Windows sau cu Ctrl+D,B.

    Imaginea urmtoare prezint o fereastra de breakpoint.

    Aceast fereastr are i o bar de unelte care permite (ce se putea i din meniu, cum am vzut mai nainte)

    1. Set: Setarea unui nou breakpoint

    2. Remove: Eliminarea unui breakpoint

    3. Delete: tergerea tuturor breakpoint 4. Activarea / dezactivarea breakpoint

  • 5. Exportul breakpoints

    6. Importul breakpoints

    Acesat opiune nu este n meniul breakpoint. Se folosete la importul breakpoint/tracepoint.

    La clic pe butonul de import, VS deschide o fereastra de dialog pentru alegerea fiierului de XML cu breakpoints/tracepoints de importat.

    Dup ncrcarea fiierului breakpoint/tracepoint devin setate ca la momentul exportului.

  • 7. Go to Source Code (Du-te n fereastra cu codul surs) 8. Go to Diassembly (Du-te n fereastra cu dezasamblarea executabilului)

    9. Columns (Coloane)

    Acest meniu de unelte permite setarea numrului de coloane din grila de mai jos -- grila din fereastra de breakpoints de sub bara de unelte

    10. Search (Cutare) Permite cutarea breakpoint n gril, dup criterii stabilite.

  • BREAKPOINT GRID (GRILA DE PUNCTE DE NTRERUPERE)

    Acesat fereastr gril afieaz toate breakpoints setate n codul surs. Furnizeaz info despre fiecare breakpoint potrivit coloanelor setate de ctre dezvoltator n gril.

    TRASA DE STIV I ATRIBUTUL INFORMAII DESPRE APELANT

    Titlul original al celui de-al treilea articol este: "Help Yourself in Debugging (Part-3)

    Stacktrace And Caller Information Attribute " (...)

    nainte de a ncepe cu StackTrace i Caller information, imaginea urmtoare prezint

    structura codului.

    Proiectul este divizat ntrei straturi: Interfaa cu utilizatorul (UI), stratul de business

    (Business) i stratul de date (DataLayer).

  • CODUL DIN STRATUL DIN FA (FRONT LAYER CODE) Collapse | Copy Code

    class Program

    {

    //Program p = new Program();

    public int i = 10;

    public static void Main(string[] args)

    {

    try

    {

    var str = (new BusinessEmployee()).GetEmployeeList();

    Console.WriteLine(str);

    Console.ReadLine();

    }

    catch (Exception ex)

    {

    global::System.Windows.Forms.MessageBox.Show(ex.Message);

    }

    }

    }

    As you see in above code Font layer calling "GetEmployeeList" method to get list of all

    employee.

    BUSINESSLAYER CODE

    Collapse | Copy Code

    public class BusinessEmployee

    {

    private readonly DataEmployee dataEmployee;

    public BusinessEmployee()

    {

    dataEmployee = new DataEmployee();

    }

    public void GetEmployeeList()

    {

    dataEmployee.GetEmployeeList();

    }

    }

    n acest strat clasa Business apeleaz DataLayer pentru a obine lsita de angajai din baza

    de date.

  • DATALAYER CODE Collapse | Copy Code

    public class DataEmployee

    {

    //Data layer class for employee

    public void GetEmployeeList()

    {

    //code goes here for retiving from DATABASE

    }

    }

    Acest strat returneaz lista de angazai, dar pentru utilizarea n exemplu, returneaz o

    excepie.

    STACKTRACE

    Clas din C# parte a spatiului de nume System.Diagnostics care ofer info ca i cea din

    Call Stack window la execuie.

    pentru o mai bun nelegere s considerm urmtoare modificare a codului din DataLayer

    Collapse | Copy Code

    //Data layer class for employee

    public string GetEmployeeList()

    {

    //// get call stack

    StackTrace stackTrace = new StackTrace(true);

    StringBuilder sb = new StringBuilder();

    foreach (StackFrame frame in stackTrace.GetFrames())

    {

    sb.AppendLine(" Method Name: " + frame.GetMethod().Name + " File Name:" +

    frame.GetMethod().Module.Name + " Line No: " +

    frame.GetFileLineNumber());

    }

    return sb.ToString();

    }

    Dup cum se observ n cod, acesta creeaz un obiect StackTrace cu argumentul "true"

    transmis constructorului, pentyru a captura numele fiierului, numrul liniei i numnrul

    coloanei n tras.

    Dup creare se folosete metoda GetFrames pentru a obine informatii despre fiecare cadru

    de stiv (fiecare apel de metod este reprezentat de un cadru de stiv), iart n final detaliile

    fiecrui cadru sunt adugate folosind StringBuilder, iar apoi sunt afiate.

    Ceea ce urmeaz arat ieirea rezultat la execuie:

  • Astfel, se tiprete fiecare apel fcut dintr-un strat n altul (observai c apelul vine din

    stratul din fa spre cel de baz de date).

    AVANTAJE

    StackTrace ofer info detaliat despre originea apelului de la nceput la sfrit.

    DISADVANTAGE

    Metodele inline nu sunt listate la compilarea codului n modul Release, dei apar n modul

    Debug.

    Pentru a nelege de ce, s considerm urmtoarele modificri n codul din fa.

    Dac l compilm n modul Debug folosind configuraia de mai jos

  • Acesta va genera ieirea prezentat mai jos, unde se poate observa a patra linie -- o linie

    suplimentar a apelului metodei "GetEmployeeList1".

    Astfel, n modul Debug sunt afiate toate liniile,. La compilarea n mod Release folosind

    configuraia urmtoare

    Va genera trei linii la ieire -- linia apelului metodei "GetEmployeeList1" lipsete.

  • Astfel, StackTrace nu listeaz metodele care sunt convertite la inline de ctre compilator.

    Dac dorii s fie listat, o putei marca cu

    [MethodImpl(MethodImplOptions.NoInlining)]

    Dac programatorul a marcat metoda

    ca [MethodImpl(MethodImplOptions.AggressiveInlining)], metoda respectiv nu va fi listat

    nici ea la depanare. Deci trasare poate fi evitat prin marcarea metodei ca inline (aci

    compilatorul elimin apelurile de funcii i include corpul funciei n locul apelului, N.T)

    ADVANTAJ FAA DE ATRIBUTUL CALLER INFORMATION

    Ofer detalii care nu pot fi date de atributul Caller Information.

    Numrul liniei, numele fiierului i al metodei nu pot fi modificate de programator n cazul

    StackFrame. n cazul atributului Caller Information programatorii pot falsifica dnd valori

    greite parametrului caller information.

    ATRIBUTUL CALLER INFORMATION

    Aceast nou caracteristic introdus n C# 5.0. i atributele sunt parte a spaiului de nume

    System.Runtime.CompilerServices. Aceste atribute se cere s fie adugate ca parametri

    opionali la metoda pentru care se dorete obinerea de info despre apelant.

  • EXEMPLU

    Collapse | Copy Code

    Accessiblity ReturnType MethodName (Type parameterName,....,

    [CallerMemberName] string memberName = "",

    [CallerFilePath] string sourceFilePath = "",

    [CallerLineNumber] int sourceLineNumber = 0

    Nume Tip Descriere

    CallerMemberName string Ofer numele metodei apelante

    CallerFilePath string Ofer numele fiierului n care se afl metoda apelant

    CallerLineNumber int Ofer numrul liniei din fiierul n care se afl metoda apelant

    Observaie:

    Apelantul metodei poate de asemenea trimite aceast valoare ca parametru al metodei.

    Exemplu n care metoda apelant este decorat de ctre apelant cu atributul caller

    information

    Pentru a nelege aceasta, s modificm metoda DataLayer dup cum urmeaz

    Collapse | Copy Code

    //Data layer class for employee

    public string GetEmployeeList([CallerMemberName] string memberName = "",

    [CallerFilePath] string fileName = "",

    [CallerLineNumber] int lineNumber = 0)

    {

    return " Method Name: " + memberName + " File Name:" + fileName + " Line No: " +

    lineNumber;

    }

    Execuia codului de mai sus produce ieirea de mai jos

  • ADVANTAJ

    Informaia din caller attribute nu poate fi falsificat pn cnd programatorul nu transmite

    info prin parametrul metodei.

    Nu exist costuri la execuie pentru aceasta, adic nu afecteaz performanele codului,

    deoarece atributele sunt evaluate la compilare.

    Sunt fosrte utile pentru a afla cnd un apel provine dintr-o locatie necunoscut, cum este

    cazul lui "PropertyChange".

    DEZAVANTAJ

    Informatia apelantului poate fi falsificat (spoofed) de ctre programator, dac acesta

    transmite info greit n parametrul caller information.

    Exist o singur StackFrame, adic se va da info despre cine a apelat metoda (apelantul

    imediat al metodei), dar nu info detaliat, cum d StackTrace.

    E parte a C# 5.0 aa c nu funcioneaz n versiunile mai vechi.

    AVANTAJ FAA DE STACKTRACE

    Deoarece se evalueaz la compilare, nu sunt costuri la execuie ca n cazul lui StackTrace (

    unde trebuie s crem un obiect StackTrace pentru a obine info).

    Info furnizat de atribut nu poate fi falsificat prin atribute de metod.