2

ISSUE: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. 重新启动了服务器

这些都没有解决问题。

服务器信息:

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

1 回答 1

0

答案是:

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

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

解决方案:卸载分析器,一切正常。它证明了 StackTrace 是不可靠的。

于 2013-02-26T19:39:26.960 回答