C# Language
Läs och förstå Stacktraces
Sök…
Introduktion
En stapelspår är ett bra hjälpmedel vid felsökning av ett program. Du får ett trace-spår när ditt program kastar ett undantag, och ibland när programmet avviker onormalt.
Stapla spår för en enkel NullReferenceException i Windows-formulär
Låt oss skapa en liten kodbit som gör ett undantag:
private void button1_Click(object sender, EventArgs e)
{
string msg = null;
msg.ToCharArray();
}
Om vi utför detta får vi följande undantag och stapelspår:
System.NullReferenceException: "Object reference not set to an instance of an object."
at WindowsFormsApplication1.Form1.button1_Click(Object sender, EventArgs e) in F:\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs:line 29
at System.Windows.Forms.Control.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
Stackspåret fortsätter så, men denna del räcker för våra ändamål.
Högst upp på trace-spåret ser vi linjen:
på WindowsFormsApplication1.Form1.button1_Click (Objekt avsändare, EventArgs e) i F: \ WindowsFormsApplication1 \ WindowsFormsApplication1 \ Form1.cs: rad 29
Detta är den viktigaste delen. Det berättar den exakta raden där undantaget inträffade: linje 29 i Form1.cs.
Så det är här du börjar din sökning.
Den andra raden är
på System.Windows.Forms.Control.OnClick (EventArgs e)
Det här är metoden som heter button1_Click
. Så nu vet vi att button1_Click
, där felet inträffade, kallades från System.Windows.Forms.Control.OnClick
.
Vi kan fortsätta så här; den tredje raden är
på System.Windows.Forms.Button.OnClick (EventArgs e)
Detta är i sin tur koden som heter System.windows.Forms.Control.OnClick
.
Stackspåret är listan över funktioner som anropades tills din kod stötte på undantaget. Och genom att följa detta kan du ta reda på vilken exekveringsväg din kod följde tills den fick problem!
Observera att stackspåret inkluderar samtal från .Net-systemet; du behöver normalt inte följa alla Microsofts System.Windows.Forms
kod för att ta reda på vad som gick fel, bara koden som tillhör din egen applikation.
Så varför kallas detta ett "stack trace"?
För varje gång ett program anropar en metod håller det reda på var det var. Den har en datastruktur som kallas "stacken", där den dumpar sin sista plats.
Om det är klart att köra metoden ser den på bunten för att se var den var innan den kallade metoden - och fortsätter därifrån.
Så stacken låter datorn veta var den slutade, innan man ringer till en ny metod.
Men det fungerar också som en felsökningshjälp. Som en detektiv som spårar de steg som en kriminell tog när han begick sitt brott, kan en programmerare använda stacken för att spåra de steg som ett program tog innan det kraschade.