【问题标题】:Stack trace skipps a method?堆栈跟踪跳过一个方法?
【发布时间】:2012-06-19 10:25:43
【问题描述】:

我有一个类 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 );
    }
}

【问题讨论】:

  • 请发布您的代码。您的描述可能与您的代码中实际发生的不同。
  • 为什么你要提供代码描述而不是仅仅发布它?

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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2020-07-06
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    • 2020-08-19
    • 2011-05-25
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多