StackFrame Klasa

Definicja

Zawiera informacje o obiekcie StackFrame, który reprezentuje wywołanie funkcji w stosie wywołań dla bieżącego wątku.

C#
public sealed class StackFrame
C#
public class StackFrame
C#
[System.Serializable]
public class StackFrame
C#
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public class StackFrame
Dziedziczenie
StackFrame
Atrybuty

Przykłady

W poniższym przykładzie pokazano użycie StackFrame klasy w celu udostępnienia informacji o ramce stosu dla śledzenia stosu.

C#
using System;
using System.Diagnostics;

namespace StackFrameExample
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                Method1();
            }
            catch (Exception e)
            {
                StackTrace st = new StackTrace();
                StackTrace st1 = new StackTrace(new StackFrame(true));
                Console.WriteLine(" Stack trace for Main: {0}",
                   st1.ToString());
                Console.WriteLine(st.ToString());
            }
            Console.WriteLine("Press Enter to exit.");
            Console.ReadLine();
        }
        private static void Method1()
        {
            try
            {
                Method2(4);
            }
            catch (Exception e)
            {
                StackTrace st = new StackTrace();
                StackTrace st1 = new StackTrace(new StackFrame(true));
                Console.WriteLine(" Stack trace for Method1: {0}",
                   st1.ToString());
                Console.WriteLine(st.ToString());
                // Build a stack trace for the next frame.
                StackTrace st2 = new StackTrace(new StackFrame(1, true));
                Console.WriteLine(" Stack trace for next level frame: {0}",
                   st2.ToString());
                throw e;
            }
        }
        private static void Method2( int count)
        {
            try
            {
                if (count < 5)
                    throw new ArgumentException("count too large", "count");
            }
            catch (Exception e)
            {
                StackTrace st = new StackTrace();
                StackTrace st1 = new StackTrace(new StackFrame(2,true));
                Console.WriteLine(" Stack trace for Method2: {0}",
                   st1.ToString());
                Console.WriteLine(st.ToString());
                throw e;
            }
        }
    }
}

W poniższym przykładzie pokazano użycie składowych StackFrame klasy .

C#

using System;
using System.Diagnostics;

using SampleInternal;

namespace SamplePublic
{
    // This console application illustrates various uses
    // of the StackTrace and StackFrame classes.
    class ConsoleApp
    {
       [STAThread]
       static void Main()
        {
            ClassLevel1 mainClass = new ClassLevel1();

            try {
                mainClass.InternalMethod();
            }
            catch (Exception) {
               Console.WriteLine(" Main method exception handler");

               // Display file and line information, if available.
               StackTrace st = new StackTrace(new StackFrame(true));
               Console.WriteLine(" Stack trace for current level: {0}",
                   st.ToString());
               Console.WriteLine(" File: {0}",
                  st.GetFrame(0).GetFileName());
               Console.WriteLine(" Line Number: {0}",
                   st.GetFrame(0).GetFileLineNumber().ToString());

               Console.WriteLine();
               Console.WriteLine("-------------------------------------------------\n");
            }
        }
    }
}

namespace SampleInternal
{
   public class ClassLevel1
   {
      public void InternalMethod()
      {
         try
         {
            ClassLevel2 nestedClass = new ClassLevel2();
            nestedClass.Level2Method();
         }
         catch (Exception e)
         {
            Console.WriteLine(" InternalMethod exception handler");

            // Build a stack trace from one frame, skipping the
            // current frame and using the next frame.  By
            // default, file and line information are not displayed.
            StackTrace st = new StackTrace(new StackFrame(1));
            Console.WriteLine(" Stack trace for next level frame: {0}",
               st.ToString());
            Console.WriteLine(" Stack frame for next level: ");
            Console.WriteLine("   {0}", st.GetFrame(0).ToString());

            Console.WriteLine(" Line Number: {0}",
               st.GetFrame(0).GetFileLineNumber().ToString());

            Console.WriteLine();
            Console.WriteLine("   ... throwing exception to next level ...");
            Console.WriteLine("-------------------------------------------------\n");
            throw e;
         }
      }
   }

   public class ClassLevel2
   {
      public void Level2Method()
      {
         try
         {
            ClassLevel3 nestedClass = new ClassLevel3();
            nestedClass.Level3Method();
         }
         catch (Exception e)
         {
            Console.WriteLine(" Level2Method exception handler");

            // Display the full call stack at this level.
            StackTrace st1 = new StackTrace(true);
            Console.WriteLine(" Stack trace for this level: {0}",
               st1.ToString());

            // Build a stack trace from one frame, skipping the current
            // frame and using the next frame.
            StackTrace st2 = new StackTrace(new StackFrame(1, true));
            Console.WriteLine(" Stack trace built with next level frame: {0}",
               st2.ToString());

            // Build a stack trace skipping the current frame, and
            // including all the other frames.
            StackTrace st3 = new StackTrace(1, true);
            Console.WriteLine(" Stack trace built from the next level up: {0}",
               st3.ToString());

            Console.WriteLine();
            Console.WriteLine("   ... throwing exception to next level ...");
            Console.WriteLine("-------------------------------------------------\n");
            throw e;
         }
      }
   }

   public class ClassLevel3
   {
      public void Level3Method()
      {
         try
         {
            ClassLevel4 nestedClass = new ClassLevel4();
            nestedClass.Level4Method();
         }
         catch (Exception e)
         {
            Console.WriteLine(" Level3Method exception handler");

            // Build a stack trace from a dummy stack frame.
            // Explicitly specify the source file name and
            // line number.
            StackTrace st = new StackTrace(new StackFrame("source.cs", 60));
            Console.WriteLine(" Stack trace with dummy stack frame: {0}",
                        st.ToString());
            for(int i =0; i< st.FrameCount; i++ )
            {
               // Display the stack frame properties.
               StackFrame sf = st.GetFrame(i);
               Console.WriteLine(" File: {0}", sf.GetFileName());
               Console.WriteLine(" Line Number: {0}",
                  sf.GetFileLineNumber());
               // Note that the column number defaults to zero
               // when not initialized.
               Console.WriteLine(" Column Number: {0}",
                  sf.GetFileColumnNumber());
               if (sf.GetILOffset() != StackFrame.OFFSET_UNKNOWN)
               {
                  Console.WriteLine(" Intermediate Language Offset: {0}",
                     sf.GetILOffset());
               }
               if (sf.GetNativeOffset() != StackFrame.OFFSET_UNKNOWN)
               {
                  Console.WriteLine(" Native Offset: {0}",
                     sf.GetNativeOffset());
               }
            }
            Console.WriteLine();
            Console.WriteLine("   ... throwing exception to next level ...");
            Console.WriteLine("-------------------------------------------------\n");
            throw e;
         }
      }
   }

   public class ClassLevel4
   {
      public void Level4Method()
      {
         try
         {
            ClassLevel5 nestedClass = new ClassLevel5();
            nestedClass.Level5Method();
         }
         catch (Exception e)
         {
            Console.WriteLine(" Level4Method exception handler");

            // Build a stack trace from a dummy stack frame.
            // Explicitly specify the source file name, line number
            // and column number.
            StackTrace st = new StackTrace(new StackFrame("source.cs", 79, 24));
            Console.WriteLine(" Stack trace with dummy stack frame: {0}",
                           st.ToString());

            // Access the StackFrames explicitly to display the file
            // name, line number and column number properties.
            // StackTrace.ToString only includes the method name.
            for(int i =0; i< st.FrameCount; i++ )
            {
               StackFrame sf = st.GetFrame(i);
               Console.WriteLine(" File: {0}", sf.GetFileName());
               Console.WriteLine(" Line Number: {0}",
                  sf.GetFileLineNumber());
               Console.WriteLine(" Column Number: {0}",
                  sf.GetFileColumnNumber());
            }
            Console.WriteLine();
            Console.WriteLine("   ... throwing exception to next level ...");
            Console.WriteLine("-------------------------------------------------\n");
            throw e;
         }
      }
   }

   public class ClassLevel5
   {
      public void Level5Method()
      {
         try
         {
            ClassLevel6 nestedClass = new ClassLevel6();
            nestedClass.Level6Method();
         }
         catch (Exception e)
         {
            Console.WriteLine(" Level5Method exception handler");

            StackTrace st = new StackTrace();

            // Display the most recent function call.
            StackFrame sf = st.GetFrame(0);
            Console.WriteLine();
            Console.WriteLine("  Exception in method: ");
            Console.WriteLine("      {0}", sf.GetMethod());

            if (st.FrameCount >1)
            {
               // Display the highest-level function call
               // in the trace.
               sf = st.GetFrame(st.FrameCount-1);
               Console.WriteLine("  Original function call at top of call stack):");
               Console.WriteLine("      {0}", sf.GetMethod());
            }

            Console.WriteLine();
            Console.WriteLine("   ... throwing exception to next level ...");
            Console.WriteLine("-------------------------------------------------\n");
            throw e;
         }
      }
   }

   public class ClassLevel6
   {
      public void Level6Method()
      {
         throw new Exception("An error occurred in the lowest internal class method.");
      }
   }
}

Uwagi

Element StackFrame jest tworzony i wypychany na stos wywołań dla każdego wywołania funkcji wykonywanego podczas wykonywania wątku. Ramka stosu zawsze zawiera MethodBase informacje i opcjonalnie zawiera informacje o nazwie pliku, numerze wiersza i numerze kolumny.

StackFrame informacje będą najbardziej informacyjne przy użyciu konfiguracji kompilacji debugowania. Domyślnie kompilacje debugowania zawierają symbole debugowania, a kompilacje wydania nie. Symbole debugowania zawierają większość informacji o pliku, nazwie metody, numerze wiersza i kolumnie używanych w konstruowaniu StackFrame obiektów.

Konstruktory

StackFrame()

Inicjuje nowe wystąpienie klasy StackFrame.

StackFrame(Boolean)

Inicjuje StackFrame nowe wystąpienie klasy, opcjonalnie przechwytując informacje źródłowe.

StackFrame(Int32)

Inicjuje StackFrame nowe wystąpienie klasy, które odpowiada ramce powyżej bieżącej ramki stosu.

StackFrame(Int32, Boolean)

Inicjuje StackFrame nowe wystąpienie klasy, które odpowiada ramce powyżej bieżącej ramki stosu, opcjonalnie przechwytując informacje źródłowe.

StackFrame(String, Int32)

Inicjuje StackFrame nowe wystąpienie klasy zawierające tylko daną nazwę pliku i numer wiersza.

StackFrame(String, Int32, Int32)

Inicjuje StackFrame nowe wystąpienie klasy zawierające tylko daną nazwę pliku, numer wiersza i numer kolumny.

Pola

OFFSET_UNKNOWN

Definiuje wartość zwracaną z metody lubGetILOffset(), gdy przesunięcie natywnego GetNativeOffset() lub pośredniego języka Microsoft (MSIL) jest nieznane. To pole jest stałe.

Metody

Equals(Object)

Określa, czy dany obiekt jest taki sam, jak bieżący obiekt.

(Odziedziczone po Object)
GetFileColumnNumber()

Pobiera numer kolumny w pliku zawierający wykonywany kod. Te informacje są zwykle wyodrębniane z symboli debugowania dla pliku wykonywalnego.

GetFileLineNumber()

Pobiera numer wiersza w pliku zawierający wykonywany kod. Te informacje są zwykle wyodrębniane z symboli debugowania dla pliku wykonywalnego.

GetFileName()

Pobiera nazwę pliku zawierającą wykonywany kod. Te informacje są zwykle wyodrębniane z symboli debugowania dla pliku wykonywalnego.

GetHashCode()

Służy jako domyślna funkcja skrótu.

(Odziedziczone po Object)
GetILOffset()

Pobiera przesunięcie od początku kodu języka microsoft intermediate language (MSIL) dla wykonywanej metody. To przesunięcie może być przybliżeniem w zależności od tego, czy kompilator just in time (JIT) generuje kod debugowania. Generowanie tych informacji debugowania jest kontrolowane przez element DebuggableAttribute.

GetMethod()

Pobiera metodę, w której jest uruchamiana ramka.

GetNativeOffset()

Pobiera przesunięcie od początku natywnego kodu skompilowanego just in time (JIT) dla wykonywanej metody. Generowanie tych informacji debugowania jest kontrolowane przez klasę DebuggableAttribute .

GetType()

Type Pobiera wartość bieżącego wystąpienia.

(Odziedziczone po Object)
MemberwiseClone()

Tworzy płytkią kopię bieżącego Objectelementu .

(Odziedziczone po Object)
ToString()

Tworzy czytelną reprezentację śledzenia stosu.

Metody rozszerzania

GetNativeImageBase(StackFrame)

Zwraca wskaźnik do podstawowego adresu obrazu natywnego, który jest wykonywany przez tę ramkę stosu.

GetNativeIP(StackFrame)

Pobiera wskaźnik interfejsu na początek kodu natywnego dla wykonywanej metody.

HasILOffset(StackFrame)

Wskazuje, czy jest dostępne przesunięcie od początku kodu IL dla wykonywanej metody.

HasMethod(StackFrame)

Wskazuje, czy jest dostępna informacja o metodzie, w której jest uruchamiana określona ramka.

HasNativeImage(StackFrame)

Wskazuje, czy obraz macierzysty jest dostępny dla określonej ramki stosu.

HasSource(StackFrame)

Wskazuje, czy plik zawierający kod wykonywany przez określoną ramkę stosu jest dostępny.

Dotyczy

Produkt Wersje
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1
UWP 10.0

Zobacz też