Transcript

7/21/2019 Depanarea Aplicatiilor in Visual_Studio

http://slidepdf.com/reader/full/depanarea-aplicatiilor-in-visualstudio 1/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 ProjectOpen 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 andImmediate Window" 

În acest articol voi prezenta cele două ferestre importante ale lui Visual Studio care suntutile 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 unscenariu uzual pe care amobservat că-l urmeazădezvoltatorii.În aplicația cu trei straturi (veziprezentarea din ziua 6, slide 11,

N.T.) dezvoltatorii pun întotdeauna punctul de întrerupere (breakpoint) înstratul de prezentare. Cândexecuția ajunge la punctul de

 întrerupere aceștia verificădatele și se întreabă caremetodă din stratul de businessa 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

7/21/2019 Depanarea Aplicatiilor in Visual_Studio

http://slidepdf.com/reader/full/depanarea-aplicatiilor-in-visualstudio 2/24

 

Cum se poate vedea în imagine, cu ajutorul stivei de apeluri puteți obține info despremetoda apelată, valorile parametrilor, numărul liniei metodei în fișierul sursă, dacă este apelintern sau extern, limbajul de program,are în care a fost scrisă metoda. 

IMMEDIATE WINDOW (FEREASTRA VALORILOR IMEDIATE) 

Se întâmplă întotdeauna ca în mijlocul depanării să doriți să executați un set de instrucțiunisau de funcții sau să doriți să verificați valoarea unei variabile. Pentru aceasta puteți folosifereastra valorilor imediate, pe care o puteți deschide cu combinația de taste Ctrl + Alt + I  sau din meniul Debug >> Windows >> Immediate Window  

7/21/2019 Depanarea Aplicatiilor in Visual_Studio

http://slidepdf.com/reader/full/depanarea-aplicatiilor-in-visualstudio 3/24

 

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 dintrecele mai folosite elemente la depanarea unei aplicații, prin întreruperea executăriiprogramului în anumite puncte. Voi descrie ce oferă VS și cum se folosește la depanare 

CE ESTE UN PUNCT DE ÎNTRERUPERE (BREAKPOINT)?

Punctele de întrerupere sunt o facilitate oferită de VS care permite întreruperea execuției ladepanarea aplicației 

7/21/2019 Depanarea Aplicatiilor in Visual_Studio

http://slidepdf.com/reader/full/depanarea-aplicatiilor-in-visualstudio 4/24

 Exemplu:

La click in partea stângă a codului în VS se va seta un punct de întrerupere, cum se vede inimaginea de deasupra acestui text. La lansarea în execuție a programului (în modul Debug),dacă acesta ajunge la breakpoint, execuția se va întrerupe în punctul respectiv. 

MENIUL BREAKPOINT (OPȚIUNI)

7/21/2019 Depanarea Aplicatiilor in Visual_Studio

http://slidepdf.com/reader/full/depanarea-aplicatiilor-in-visualstudio 5/24

 

Imaginea de deasupra arată meniul contextual pentru breakpoint. Cele ce urmează descriuopțiunile disponibile, una câte una. 

1. 

Delete Breakpoint: ȘtergerePermite eliminerea punctului de întrerupere

2.  Disable Breakpoint: Dezactivare

Permite dezactivarea punctului de întrerupere - marcajul se va afișa gri. Util dacă dorițiexecuția fără oprire în punctul respectiv, dar ulterior doriți să-l refolosiți. 3.  Location…: Locație 

Permite setarea unui punct de întrerupere la locația dată -- la o anumită linie din codulsursă.

La clic pe meniu VS va afișa un dialog care oferă info despre fișierul sursă, numărul liniei șial caracterului. Permite schimbarea info de linie și caracter.

Exemplu:

Prin schimbarea numărului de linie la 26 în fereastra de dialog, breakpoint-ul se va muta lalinia 26.

7/21/2019 Depanarea Aplicatiilor in Visual_Studio

http://slidepdf.com/reader/full/depanarea-aplicatiilor-in-visualstudio 6/24

 

4. 

Condition…: Condiție 

La clic pe opțiune se va afișa dialogul care urmează: 

și care are douăopțiuni.

o  (A). IS true Permite setarea condiției: execuția se va opri la îndeplinirea condiției (logice) de oprire. 

7/21/2019 Depanarea Aplicatiilor in Visual_Studio

http://slidepdf.com/reader/full/depanarea-aplicatiilor-in-visualstudio 7/24

Exemplu:

În imaginea de deasupra, condiția este "i==1000"; oprirea se va face doar la îndeplinireacondiției date. Aceasta permite examinarea buclelor la anumite valori.

O dată setată condiția, punctul de întrerupere este afișat ca mai jos. 

Breakpoint-ul s-a schimbat -- icoana are un semn '+' pe ea. La așezarea cursorului mousepe breakpoint, VS va afișa info care conține condiția ca sugestie pentru unealtă (tooltip).

o  (B). Has changed Permite oprirea dacă valoarea sau obiectul s-a modificat.

7/21/2019 Depanarea Aplicatiilor in Visual_Studio

http://slidepdf.com/reader/full/depanarea-aplicatiilor-in-visualstudio 8/24

 Exemplu:

Aici, s-a dat "în urmărire" variabila "i"; adică, dacă valoarea variabilei "i" se modifică, atunciexecuția se va opri la atingerea acestui punct. 

Imaginea următoare arată conținutul sugestiei pentru unealtă după punerea condiției  

La folosirea acestei condiții, opțiunea Condition din meniul contextual Breakpoint estemarcată ca în imaginea de mai jos..

7/21/2019 Depanarea Aplicatiilor in Visual_Studio

http://slidepdf.com/reader/full/depanarea-aplicatiilor-in-visualstudio 9/24

 

5.  Hit Count…Contor de treceri

Afișează de câte ori a fost atins punctul de oprire pe timpul executării programului..

Acest dialog are trei opțiuni care vă permit să setați numărul de atingeri. Dacă ce ați pus pepost de condiție este îndeplinit, atunci programul se va opri la breakpoint. Opțiunile suntauto-explicativa, cum se vede în imaginea următoare.

7/21/2019 Depanarea Aplicatiilor in Visual_Studio

http://slidepdf.com/reader/full/depanarea-aplicatiilor-in-visualstudio 10/24

 

6.  Filter…: Filtrează 

Permite setarea condiției legate de "Machinename and Process" (Numele mașinii și alprocesului). Imaginea următoare explică mai în detaliu .

7.  When Hit…La atingere Permite setarea mesajului de afișat la trecerea prin punctul de întrerupere. Opțiuneaconvertește punctul de întrerupere (breakpoint) în punct de trasare (tracepoint). Astfel sepoate trasa execuția prin tipărirea de mesaje în fereastra de ieșire (outpu) a programului. 

break:always - oprire întotdeaunawhen hit count equals to - la egalitate cuwhen hit count is a multiple of  - la multipludewhen hit count is greater or equal to  - lamai mare sau egal cu

7/21/2019 Depanarea Aplicatiilor in Visual_Studio

http://slidepdf.com/reader/full/depanarea-aplicatiilor-in-visualstudio 11/24

Exemplu:

În imaginea de deasupra, dezvoltatorul a creeat un mesaj de tipărit de fiecare dată c ând seexecută bucla. 

Textul explicativ din cutia de dialog oferă info despre cum se scrie mesajul din zona de text.D.e., se vor înlocui la execuție 

  $FUNCTION - numele funcției curente   $TID - id-ul firului de lucru  $TNAME - numele firului de lucru  $CALLER - numele funcției apelante   $PID - id-ul procesului  $PNAME - numele procesului

După aprobare (click OK) breakpoint-ul va fi afișat ca un romb (vezi imaginea de mai jos)  

7/21/2019 Depanarea Aplicatiilor in Visual_Studio

http://slidepdf.com/reader/full/depanarea-aplicatiilor-in-visualstudio 12/24

La execuție, mesajele vor fi afișate la ieșire (ca mai jos).

1.  Edit Labels…Editează etichetele Permite etichetarea (numirea) breakpoints. Dialogul este precum cel următor:.

Acest lucru este util la exportarea punctelor de întrerupere din VS: ajută la reamintirearolului punctului de întrerupere, la crearea altora etc.

7/21/2019 Depanarea Aplicatiilor in Visual_Studio

http://slidepdf.com/reader/full/depanarea-aplicatiilor-in-visualstudio 13/24

2.  Export… 

Permite exportarea breakpoints setate de către dezvoltator. 

Informația este salvată în formatul "XML". Fișierul exportat arată similar cu cel din imaginea

următoare 

Opțiunea este utilă dacă se dorește păstrarea punctelor de întrerupere în vedereareîncărcării acestora la o execuție viitoare 

7/21/2019 Depanarea Aplicatiilor in Visual_Studio

http://slidepdf.com/reader/full/depanarea-aplicatiilor-in-visualstudio 14/24

BREAKPOINT WINDOW Breakpoint/tracepoint setate de către dezvoltator sunt afișate în această fereastră, care maiafișează și alte info. Fereastra se poate afișa din meniul Debug >> Windows sau cuCtrl+D,B.

Imaginea următoare prezintă o fereastra de breakpoint. 

Această fereastră are și o bară de unelte care permite (ce se putea și din meniu, cum amvăzut mai înainte) 

1.  Set: Setarea unui nou breakpoint2.  Remove: Eliminarea unui breakpoint3.  Delete: Ștergerea tuturor breakpoint4.  Activarea / dezactivarea breakpoint

7/21/2019 Depanarea Aplicatiilor in Visual_Studio

http://slidepdf.com/reader/full/depanarea-aplicatiilor-in-visualstudio 15/24

5.  Exportul breakpoints6.  Importul breakpoints

Acesată opțiune nu este în meniul breakpoint. Se folosește la importulbreakpoint/tracepoint.

La clic pe butonul de import, VS deschide o fereastra de dialog pentru alegerea fișierului deXML cu breakpoints/tracepoints de importat.

După încărcarea fișierului breakpoint/tracepoint devin setate ca la momentul exportului.

7/21/2019 Depanarea Aplicatiilor in Visual_Studio

http://slidepdf.com/reader/full/depanarea-aplicatiilor-in-visualstudio 16/24

 

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 numărului de coloane din grila de mai jos -- grila dinfereastra de breakpoints de sub bara de unelte

10. Search (Căutare) Permite căutarea breakpoint în grilă, după criterii stabilite. 

7/21/2019 Depanarea Aplicatiilor in Visual_Studio

http://slidepdf.com/reader/full/depanarea-aplicatiilor-in-visualstudio 17/24

BREAKPOINT GRID (GRILA DE PUNCTE DE ÎNTRERUPERE) 

Acesată fereastră grilă afișează toate breakpoints setate în codul sursă. Furnizează infodespre fiecare breakpoint potrivit coloanelor setate de către dezvoltator în grilă. 

TRASA DE STIVĂ ȘI ATRIBUTUL INFORMAȚII 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 următoare prezintăstructura codului.

Proiectul este divizat întrei straturi: Interfața cu utilizatorul (UI), stratul de business(Business) și stratul de date (DataLayer).

7/21/2019 Depanarea Aplicatiilor in Visual_Studio

http://slidepdf.com/reader/full/depanarea-aplicatiilor-in-visualstudio 18/24

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 allemployee.

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 obține lsita de angajați din baza

de date.

7/21/2019 Depanarea Aplicatiilor in Visual_Studio

http://slidepdf.com/reader/full/depanarea-aplicatiilor-in-visualstudio 19/24

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 angazați, dar pentru utilizarea în exemplu, returnează oexcepție. 

STACKTRACE 

Clasă din C# parte a spatiului de nume System.Diagnostics care oferă info ca și cea dinCall Stack window la execuție.

pentru o mai bună înțelegere să considerăm următoare 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 fișierului, numărul liniei și numnărul

coloanei în trasă.După creare se folosește metoda GetFrames pentru a obține informatii despre fiecare cadrude stivă (fiecare apel de metodă este reprezentat de un cadru de stivă), iart în final detaliilefiecărui cadru sunt adăugate folosind StringBuilder, iar apoi sunt afișate.

Ceea ce urmează arată ieșirea rezultată la execuție: 

7/21/2019 Depanarea Aplicatiilor in Visual_Studio

http://slidepdf.com/reader/full/depanarea-aplicatiilor-in-visualstudio 20/24

 

Astfel, se tipărește fiecare apel făcut dintr-un strat în altul (observați că apelul vine dinstratul din față spre cel de bază de date). 

AVANTAJE StackTrace oferă info detaliată despre originea apelului de la început la sfârșit.

DISADVANTAGE Metodele inline nu sunt listate la compilarea codului în modul Release, deși apar în modulDebug.

Pentru a înțelege de ce, să considerăm următoarele modificări în codul din față. 

Dacă îl compilăm în modul Debug folosind configurația de mai jos 

7/21/2019 Depanarea Aplicatiilor in Visual_Studio

http://slidepdf.com/reader/full/depanarea-aplicatiilor-in-visualstudio 21/24

 

Acesta va genera ieșirea prezentată mai jos, unde se poate observa a patra linie -- o liniesuplimentară a apelului metodei "GetEmployeeList1".

Astfel, în modul Debug sunt afișate toate liniile,. La compilarea în mod Release folosind

configurația următoare 

Va genera trei linii la ieșire -- linia apelului metodei "GetEmployeeList1" lipsește.

7/21/2019 Depanarea Aplicatiilor in Visual_Studio

http://slidepdf.com/reader/full/depanarea-aplicatiilor-in-visualstudio 22/24

 

Astfel, StackTrace nu listează metodele care sunt convertite la inline de către compilator.Dacă doriți să fie listată, o puteți marca cu[MethodImpl(MethodImplOptions.NoInlining)]

Dacă programatorul a marcat metodaca [MethodImpl(MethodImplOptions.AggressiveInlining)], metoda respectivă nu va fi listatănici ea la depanare. Deci trasare poate fi evitată prin marcarea metodei ca inline (acicompilatorul elimină apelurile de funcții și include corpul funcției în locul apelului, N.T)  

ADVANTAJ FAȚA DE ATRIBUTUL CALLER INFORMATION Oferă detalii care nu pot fi date de atributul Caller Information.

Numărul liniei, numele fișierului și al metodei nu pot fi modificate de programator în cazulStackFrame. În cazul atributului Caller Information programatorii pot falsifica dând valorigreșite parametrului caller information.

ATRIBUTUL CALLER INFORMATION 

Această nouă caracteristică introdusă în C# 5.0. și atributele sunt parte a spațiului de numeSystem.Runtime.CompilerServices. Aceste atribute se cere să fie adăugate ca parametriopționali la metoda pentru care se dorește obținerea de info despre apelant.  

7/21/2019 Depanarea Aplicatiilor in Visual_Studio

http://slidepdf.com/reader/full/depanarea-aplicatiilor-in-visualstudio 23/24

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 fișierului în care se află metoda apelantă 

CallerLineNumber  int Oferă numărul liniei din fișierul în care se află metoda apelantă 

Observație:

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

Exemplu în care metoda apelantă este decorată de către apelant cu atributul callerinformation

 

Pentru a înțelege aceasta, să modificăm 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;

}

Execuția codului de mai sus produce ieșirea de mai jos 

7/21/2019 Depanarea Aplicatiilor in Visual_Studio

http://slidepdf.com/reader/full/depanarea-aplicatiilor-in-visualstudio 24/24

 

ADVANTAJ 

Informația din caller attribute nu poate fi falsificată până când programatorul nu transmiteinfo prin parametrul metodei.

Nu există costuri la execuție pentru aceasta, adică nu afectează performanțele codului,

deoarece atributele sunt evaluate la compilare.

Sunt fosrte utile pentru a afla când un apel provine dintr-o locatie necunoscută, cum estecazul lui "PropertyChange".

DEZAVANTAJ 

Informatia apelantului poate fi falsificată (spoofed) de către programator, dacă acestatransmite info greșită în parametrul caller information.

Există o singură StackFrame, adică se va da info despre cine a apelat metoda (apelantulimediat al metodei), dar nu info detaliată, cum dă StackTrace.

E parte a C# 5.0 așa că nu funcționează în versiunile mai vechi. 

AVANTAJ FAȚA DE STACKTRACE 

Deoarece se evaluează la compilare, nu sunt costuri la execuție ca în cazul lui StackTrace (unde trebuie să creăm un obiect StackTrace pentru a obține info).

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