Ler em inglês

Partilhar via


StackFrame Classe

Definição

Fornece informações sobre um StackFrame, que representa uma chamada de função na pilha de chamadas do thread atual.

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
Herança
StackFrame
Atributos

Exemplos

O exemplo a seguir demonstra o uso da classe para fornecer as informações de StackFrame quadro de pilha para um rastreamento de pilha.

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;
            }
        }
    }
}

O exemplo a seguir demonstra o uso dos membros da StackFrame classe .

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.");
      }
   }
}

Comentários

Um StackFrame é criado e enviado por push na pilha de chamadas para cada chamada de função feita durante a execução de um thread. O quadro de pilha sempre inclui MethodBase informações e, opcionalmente, inclui o nome do arquivo, o número da linha e as informações do número da coluna.

StackFrame as informações serão mais informativas com as configurações de build de depuração. Por padrão, os builds de depuração incluem símbolos de depuração, enquanto os builds de versão não. Os símbolos de depuração contêm a maioria das informações de arquivo, nome do método, número de linha e coluna usadas na construção de StackFrame objetos.

Construtores

StackFrame()

Inicializa uma nova instância da classe StackFrame.

StackFrame(Boolean)

Inicializa uma nova instância da classe StackFrame, com a opção de capturar informações de origem.

StackFrame(Int32)

Inicializa uma nova instância da classe StackFrame que corresponde a um quadro acima do registro de ativação atual.

StackFrame(Int32, Boolean)

Inicializa uma nova instância da classe StackFrame que corresponde a um quadro acima do registro de ativação atual, capturando opcionalmente informações de origem.

StackFrame(String, Int32)

Inicializa uma nova instância da classe StackFrame que contém somente o nome do arquivo determinado e o número de linha.

StackFrame(String, Int32, Int32)

Inicializa uma nova instância da classe StackFrame que contém somente o nome do arquivo determinado, o número de linha e o número da coluna.

Campos

OFFSET_UNKNOWN

Define o valor que é retornado do método GetNativeOffset() ou GetILOffset() quando o deslocamento nativo ou MSIL (Microsoft Intermediate Language) é desconhecido. Este campo é constante.

Métodos

Equals(Object)

Determina se o objeto especificado é igual ao objeto atual.

(Herdado de Object)
GetFileColumnNumber()

Obtém o número da coluna no arquivo que contém o código que está em execução. Normalmente, essas informações são extraídas de símbolos de depuração para o executável.

GetFileLineNumber()

Obtém o número de linha no arquivo que contém o código que está em execução. Normalmente, essas informações são extraídas de símbolos de depuração para o executável.

GetFileName()

Obtém o nome do arquivo que contém o código que está em execução. Normalmente, essas informações são extraídas de símbolos de depuração para o executável.

GetHashCode()

Serve como a função de hash padrão.

(Herdado de Object)
GetILOffset()

Obtém o deslocamento do início do código MSIL (Microsoft Intermediate Language) para o método que está sendo executado. Esse deslocamento pode ser uma aproximação dependendo se o compilador JIT (Just-In-Time) está gerando o código de depuração. A geração dessas informações de depuração é controlada pelo DebuggableAttribute.

GetMethod()

Obtém o método no qual o quadro está em execução.

GetNativeOffset()

Obtém o deslocamento do início do código compilado JIT (Just-In-Time) nativo para o método que está sendo executado. A geração dessas informações de depuração é controlada pela classe DebuggableAttribute.

GetType()

Obtém o Type da instância atual.

(Herdado de Object)
MemberwiseClone()

Cria uma cópia superficial do Object atual.

(Herdado de Object)
ToString()

Cria uma representação legível do rastreamento de pilha.

Métodos de Extensão

GetNativeImageBase(StackFrame)

Retorna um ponteiro para o endereço básico da imagem nativa na qual esse registro de ativação está sendo executado.

GetNativeIP(StackFrame)

Obtém um ponteiro de interface para o início do código nativo para o método que está sendo executado.

HasILOffset(StackFrame)

Indica se um deslocamento do início do código do nível de integridade para o método que está sendo executado está disponível.

HasMethod(StackFrame)

Indica se as informações sobre o método no qual o quadro especificado está em execução estão disponíveis.

HasNativeImage(StackFrame)

Indica se a imagem nativa está disponível para o registro de ativação especificado.

HasSource(StackFrame)

Indica se o arquivo que contém o código que o registro de ativação especificado está executando está disponível.

Aplica-se a

Produto Versões
.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

Confira também