什么是堆栈跟踪?

时间:2012-03-26 17:53:42

标签: c# stack-trace

  

可能重复:
  CallStack determines where you are going next?

this问题的评论开始,我以为我知道Stack Trace是什么,但我想我没有。我用谷歌搜索了它,但可以找到一个明确的答案。

@asawyer says

  

堆栈跟踪无法识别您去过的地方,它会告诉您下一步的位置。

这是一个小程序

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Method1();
        }

        private static void Method1()
        {
            Method2();
        }

        private static void Method2()
        {
            Random rnd = new Random();
            int i = rnd.Next(0, 100);

            throw new Exception();

            if (i > 50)
                Method3();
            else
                Method4();
        }

        private static void Method3(){ }

        private static void Method4(){ }
    }
}

这会产生像这样的堆栈跟踪

   at ConsoleApplication1.Program.Method2() in C:\Users\Ash Burlaczenko\Desktop\CSSD\Assignment 3\ConsoleApplication1\ConsoleApplication1\Program.cs:line 25
   at ConsoleApplication1.Program.Method1() in C:\Users\Ash Burlaczenko\Desktop\CSSD\Assignment 3\ConsoleApplication1\ConsoleApplication1\Program.cs:line 17
   at ConsoleApplication1.Program.Main(String[] args) in C:\Users\Ash Burlaczenko\Desktop\CSSD\Assignment 3\ConsoleApplication1\ConsoleApplication1\Program.cs:line 12
   at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
   at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
   at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()

虽然在异常时代码可以确定调用哪个方法,因为它知道i的值,Stack Trace没有提及未来的方法调用。

我在哪里错误地认为堆栈跟踪会告诉您代码的位置?

2 个答案:

答案 0 :(得分:3)

堆栈跟踪显示您去过的地方,并假设您从当前函数正常返回,您最终将返回到该函数。根据当前函数的内容,可能会首先执行其他事情(即,当前函数将调用但尚未执行的函数),这些函数不会显示在堆栈跟踪中(并且不能/直到你输入它们才会出现。)

答案 1 :(得分:3)

这是

的副本

The call stack does not say "where you came from", but "where you are going next"?

有关详细信息,请参阅我的答案。

另见最近这个有趣的问题探讨了“等待”延续与“真实堆栈追踪”延续之间的关系:

C# await vs continuations: not quite the same?