堆栈跟踪skipps方法?

时间:2012-06-16 18:42:56

标签: c# .net reflection exception-handling stack-trace

我的课程Foo的方法为SomeMethod()。在SomeMethod()中,我运行:Bar bar = new Bar(); bar.BBQ();。在BBQ()中,我调用私有方法Name(n),该方法会使用消息new StackTrace().GetFrame(n).GetMethod().Name抛出异常。

我的目的是将1传递给Name(n),以便它返回值“BBQ”。但是,Name(0)返回“Name”,Name(1)返回“SomeMethod”。在抛出异常导致的堆栈跟踪中,它也会读取,好像Name是由SomeMethod直接调用的(没有提到BBQ)。

有解决方法吗?有谁知道可能导致此错误的原因是什么?是否有更好的方法可以从Name获得“BBQ”的价值?

[TestClass]
public class Foo
{
    public Foo()
    {
    }
    [TestMethod]
    public void SomeMethod()
    {
        Bar bar = new Bar();
        bar.BBQ();
    }
}

public class Bar
{
    public Bar()
    {
    }
    public void BBQ()
    {
        Name( 1 );
    }
    private void Name( int n )
    {
        throw new Exception( new StackTrace().GetFrame(n).GetMethod().Name );
    }
}

1 个答案:

答案 0 :(得分:4)

我强烈怀疑问题是该方法是由JIT编译器内联的。您可以通过在调试器中运行调试版本来验证这一点,并查看是否能解决问题。

您可以相对轻松地get the immediate calling method,但我相信,在非调试环境中获得完全准确的堆栈跟踪是不可行的。毕竟,你不想禁用内联。