StackTrace Класс

Определение

Представляет трассировку стека, которая является упорядоченным набором из одного или нескольких кадров стека.

public ref class StackTrace sealed
public ref class StackTrace
public sealed class StackTrace
public class StackTrace
[System.Serializable]
public class StackTrace
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public class StackTrace
type StackTrace = class
[<System.Serializable>]
type StackTrace = class
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type StackTrace = class
Public NotInheritable Class StackTrace
Public Class StackTrace
Наследование
StackTrace
Атрибуты

Примеры

В следующем консольном приложении показано, как создать простую StackTrace и итерацию с помощью своих кадров для получения сведений об отладке и диагностике.

using System;
using System.Diagnostics;

class StackTraceSample
{
    [STAThread]
    static void Main(string[] args)
    {
        StackTraceSample sample = new StackTraceSample();
        try
        {
            sample.MyPublicMethod();
        }
        catch (Exception)
        {
            // Create a StackTrace that captures
            // filename, line number, and column
            // information for the current thread.
            StackTrace st = new StackTrace(true);
            for(int i =0; i< st.FrameCount; i++ )
            {
                // Note that high up the call stack, there is only
                // one stack frame.
                StackFrame sf = st.GetFrame(i);
                Console.WriteLine();
                Console.WriteLine("High up the call stack, Method: {0}",
                    sf.GetMethod());

                Console.WriteLine("High up the call stack, Line Number: {0}",
                    sf.GetFileLineNumber());
            }
        }
    }

    public void MyPublicMethod ()
    {
        MyProtectedMethod();
    }

    protected void MyProtectedMethod ()
    {
        MyInternalClass mic = new MyInternalClass();
        mic.ThrowsException();
    }

    class MyInternalClass
    {
        public void ThrowsException()
        {
            try
            {
                throw new Exception("A problem was encountered.");
            }
            catch (Exception e)
            {
                // Create a StackTrace that captures filename,
                // line number and column information.
                StackTrace st = new StackTrace(true);
                string stackIndent = "";
                for(int i =0; i< st.FrameCount; i++ )
                {
                    // Note that at this level, there are four
                    // stack frames, one for each method invocation.
                    StackFrame sf = st.GetFrame(i);
                    Console.WriteLine();
                    Console.WriteLine(stackIndent + " Method: {0}",
                        sf.GetMethod() );
                    Console.WriteLine(  stackIndent + " File: {0}",
                        sf.GetFileName());
                    Console.WriteLine(  stackIndent + " Line Number: {0}",
                        sf.GetFileLineNumber());
                    stackIndent += "  ";
                }
                throw e;
            }
        }
    }
}

/*
This console application produces the following output when
compiled with the Debug configuration.

   Method: Void ThrowsException()
   File: c:\samples\stacktraceframe\myclass.cs
   Line Number: 59

     Method: Void MyProtectedMethod()
     File: c:\samples\stacktraceframe\myclass.cs
     Line Number: 45

       Method: Void MyPublicMethod()
       File: c:\samples\stacktraceframe\myclass.cs
       Line Number: 39

         Method: Void Main(System.String[])
         File: c:\samples\stacktraceframe\myclass.cs
         Line Number: 13

  High up the call stack, Method: Void Main(System.String[])
  High up the call stack, Line Number: 20


This console application produces the following output when
compiled with the Release configuration.

   Method: Void ThrowsException()
   File:
   Line Number: 0

     Method: Void Main(System.String[])
     File:
     Line Number: 0

  High up the call stack, Method: Void Main(System.String[])
  High up the call stack, Line Number: 0

*/
Imports System.Diagnostics

Class StackTraceSample
   
    <STAThread()>  _
    Public Shared Sub Main()

        Dim sample As New StackTraceSample()
        Try
   
            sample.MyPublicMethod()
        Catch
            ' Create a StackTrace that captures
            ' filename, line number, and column
            ' information for the current thread.
            Dim st As New StackTrace(True)
            Dim i As Integer

            For i = 0 To st.FrameCount - 1

                ' Note that high up the call stack, there is only
                ' one stack frame.
                Dim sf As StackFrame = st.GetFrame(i)
                Console.WriteLine()
                Console.WriteLine("High up the call stack, Method: {0}", _
                    sf.GetMethod())
            
                Console.WriteLine("High up the call stack, Line Number: {0}", _
                    sf.GetFileLineNumber())
            Next i
        End Try
    End Sub
   
   Public Sub MyPublicMethod()
      MyProtectedMethod()
   End Sub
    
   Protected Sub MyProtectedMethod()
      Dim mic As New MyInternalClass()
      mic.ThrowsException()
   End Sub
   
   
   Class MyInternalClass
      
      Public Sub ThrowsException()
         Try
            Throw New Exception("A problem was encountered.")
         Catch e As Exception

            ' Create a StackTrace that captures filename,
            ' line number and column information.
            Dim st As New StackTrace(True)

            Dim stackIndent As String = ""
            Dim i As Integer
            For i = 0 To st.FrameCount - 1
               ' Note that at this level, there are four
               ' stack frames, one for each method invocation.
               Dim sf As StackFrame = st.GetFrame(i)
               Console.WriteLine()
               Console.WriteLine(stackIndent + " Method: {0}", _
                   sf.GetMethod())
               Console.WriteLine(stackIndent + " File: {0}", _
                   sf.GetFileName())
               Console.WriteLine(stackIndent + " Line Number: {0}", _
                   sf.GetFileLineNumber())
               stackIndent += "  "
            Next i
            Throw e
         End Try
      End Sub
   End Class
End Class


' This console application produces the following output when
' compiled with the Debug configuration.
'   
'    Method: Void ThrowsException()
'    File: c:\pp\samples\stacktraceframe\myclass.vb
'    Line Number: 55
' 
'      Method: Void MyProtectedMethod()
'      File: c:\pp\samples\stacktraceframe\myclass.vb
'      Line Number: 42
' 
'        Method: Void MyPublicMethod()
'        File: c:\pp\samples\stacktraceframe\myclass.vb
'        Line Number: 37
' 
'          Method: Void Main(System.String[])
'          File: c:\pp\samples\stacktraceframe\myclass.vb
'          Line Number: 13
' 
'   High up the call stack, Method: Void Main(System.String[])
'   High up the call stack, Line Number: 18
' 
' 
' This console application produces the following output when
' compiled with the Release configuration.
' 
'    Method: Void ThrowsException()
'    File:
'    Line Number: 0
' 
'      Method: Void Main(System.String[])
'      File:
'      Line Number: 0
' 
'   High up the call stack, Method: Void Main()
'   High up the call stack, Line Number: 0
'

Комментарии

StackTrace сведения будут наиболее информативными с конфигурациями сборки отладки. По умолчанию сборки отладки включают символы отладки, а сборки выпуска не выполняются. Символы отладки содержат большую часть файла, имени метода, номера строки и столбцов, используемых в конструкции StackFrame и StackTrace объектах.

StackTrace Может не сообщать столько вызовов методов, сколько ожидалось, из-за преобразований кода, которые происходят во время оптимизации.

Конструкторы

Имя Описание
StackTrace()

Инициализирует новый экземпляр StackTrace класса из кадра вызывающего объекта.

StackTrace(Boolean)

Инициализирует новый экземпляр StackTrace класса из кадра вызывающего объекта, при необходимости захватывая исходные сведения.

StackTrace(Exception, Boolean)

Инициализирует новый экземпляр StackTrace класса, используя предоставленный объект исключения и при необходимости захватывая исходные сведения.

StackTrace(Exception, Int32, Boolean)

Инициализирует новый экземпляр класса с помощью предоставленного StackTrace объекта исключения, пропуская указанное количество кадров и при необходимости захватывая исходные сведения.

StackTrace(Exception, Int32)

Инициализирует новый экземпляр класса с помощью предоставленного StackTrace объекта исключения и пропускает указанное количество кадров.

StackTrace(Exception)

Инициализирует новый экземпляр класса с помощью предоставленного StackTrace объекта исключения.

StackTrace(IEnumerable<StackFrame>)

Создает трассировку стека из набора StackFrame объектов.

StackTrace(Int32, Boolean)

Инициализирует новый экземпляр StackTrace класса из кадра вызывающего объекта, пропуская указанное количество кадров и при необходимости захватывая исходные сведения.

StackTrace(Int32)

Инициализирует новый экземпляр StackTrace класса из кадра вызывающего объекта, пропуская указанное количество кадров.

StackTrace(StackFrame)

Инициализирует новый экземпляр StackTrace класса, содержащего один кадр.

StackTrace(Thread, Boolean)
Устаревшие..

Инициализирует новый экземпляр класса для определенного StackTrace потока, при необходимости захватывая исходные сведения.

Не используйте эту перегрузку конструктора.

Поля

Имя Описание
METHODS_TO_SKIP

Определяет значение по умолчанию для количества методов, опущенных из трассировки стека. Это поле является константой.

Свойства

Имя Описание
FrameCount

Возвращает количество кадров в трассировке стека.

Методы

Имя Описание
Equals(Object)

Определяет, равен ли указанный объект текущему объекту.

(Унаследовано от Object)
GetFrame(Int32)

Возвращает указанный кадр стека.

GetFrames()

Возвращает копию всех кадров стека в текущей трассировке стека.

GetHashCode()

Служит хэш-функцией по умолчанию.

(Унаследовано от Object)
GetType()

Возвращает Type текущего экземпляра.

(Унаследовано от Object)
MemberwiseClone()

Создает неглубокую копию текущей Object.

(Унаследовано от Object)
ToString()

Создает доступное для чтения представление трассировки стека.

Применяется к

См. также раздел