【问题标题】:.NET 3.5 - Stackframe's getmethod returns a property name prepended with unknown characters.NET 3.5 - Stackframe 的 getmethod 返回一个带有未知字符的属性名称
【发布时间】:2012-12-14 12:29:15
【问题描述】:

问题:StackFrame.GetMethod() 返回前缀为未知字符的属性名称(myProperty 返回为 __XY_myProperty)。

最近我们为现有类添加了一个属性。此类用于 ASP.NET。此类中的每个属性都会调用一个自定义安全检查函数,该函数使用堆栈跟踪来获取被调用者的方法名称,以根据该名称执行操作。

问题是,StackFrame 在运行时返回这个新添加的属性名称 (myProperty),前面带有未知字符 (__XY_myProperty)。这只发生在生产机器上。我们无法在具有类似设置的任何其他机器上重现。

这是一个代码示例:

    // comments
    public returntype myProperty
    {
        get
        {
            security.checkSecurity();
            return returntype();
        }
        set
        {
            security.checkSecurity();
            if (value == null)
            {
                Row["abc"] = anothervale;
                                }
            else
            {
                Row["xyz"] = value;
            }
        }
    }
    // comment

StackFrame.GetMethod() 调用 security.checkSecurity() 将 myProperty 方法名称返回为:__XY_myProperty

(上例中未显示StackFrame.GetMethod() 调用。)

我们尝试的是:

  1. 已清除 ASP.NET 缓存
  2. 比较 .NET 补丁
  3. 重新启动服务器

这些都没有解决问题。

服务器信息:

  • Windows 2003
  • 在 VMWare 上运行(JIT 在 VMWare 上的优化是否不同?)
  • IIS 6
  • NET 3.5
  • 发布模式下构建的 ASP.NET 项目
  • 在调试模式下编译的 DLL 以使堆栈跟踪正常运行

【问题讨论】:

    标签: asp.net .net-3.5 stack-trace jit


    【解决方案1】:

    答案是:

    安装在机器上的分析器正在更改 MSIL 代码以进行代码检测。

    代码检测是能够在将代码提供给 .NET 运行时执行时对其进行修改的过程。当 CLR 加载一个类并执行其方法时,该方法的 IL 代码在即时 (JIT) 编译过程中被编译为本机指令。作为 CLR 的一部分提供的 Profiling API 允许您拦截此过程。在一个方法被 JIT 编译之前,你可以修改它的 IL 代码。

    解决方案:卸载分析器,一切正常。事实证明 StackTrace 不可靠。

    【讨论】:

      猜你喜欢
      • 2010-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-05
      • 1970-01-01
      • 2017-06-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多