【问题标题】:Why "enable 32-bit applications" flag breaks line numbers in stack trace为什么“启用 32 位应用程序”标志会破坏堆栈跟踪中的行号
【发布时间】:2015-01-16 14:44:07
【问题描述】:

我在发布模式下为 AnyCPU 编译了 C# 中的 ASP .Net Web 应用程序(没有 MVC 或 WebForms),pdb 文件已启用并随应用程序一起部署。

当 AppPool 上的 enable 32-bit applications 具有默认值 False 时,异常的堆栈跟踪具有正确行号。

当标志设置为True 时,堆栈跟踪的行号不正确。

为了清楚起见我唯一更改的是我的 Web 应用程序的 AppPool 配置中 enable 32-bit applications 标志的值。

我在两台机器上试过这个:

  1. 带有 IIS 8.5.9600.16384 的 Windows 8
  2. 带有 IIS 7.5.7600.16385 的 Windows Server 2008 R2

在我的特殊情况下,只需重新配置 AppPool 即可(我们已经从 x86 迁移到 AnyCPU,这个过时的配置只是一个错误),但我仍然感兴趣为什么会发生这种情况? (可能是 IIS 中存在一些错误,我无法在任何地方找到提到的这种行为)。

更新:看来我已经想通了,但这是暂时的缓刑:

  1. 问题几乎可以肯定是由于代码优化(我编写代码的方式排除了其他选项:抖动重新排序函数。这不是编译器,因为我这样做不要在测试之间重新编译应用程序)。
  2. 大部分优化都是通过抖动来完成的,x86 优化比 x64 优化更激进,因此生成的代码有所不同。当 Microsoft 决定进行 x64 优化时,更激进的路线将被打破。

【问题讨论】:

    标签: windows-8 iis-7.5 windows-server-2008-r2 stack-trace iis-8.5


    【解决方案1】:

    所以答案似乎是:

    1. 在 C# 中基本上有两个优化步骤:编译器(csc.exe,当 C# 代码翻译成 IL 时)和 jitter(当 IL 翻译成机器代码时)。抖动并没有进行大部分优化 (article)。另外还有 Eric Lippert 的 a great post,关于您可能期望的优化。

    2. x86 和 x64 抖动执行不同优化(CLR via C# Fourth Edition,Jeffrey Richter,第 V 部分 线程,第 strong>Volatile Constructs,第 764 页)

    因此,您可以在 x64(因为 jitter 不会积极优化代码)和 x86(更成熟)中获得正确的行号。

    总结:我还没有找到解决办法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-03
      • 1970-01-01
      • 2011-11-11
      • 1970-01-01
      • 2014-10-10
      • 2018-07-11
      • 1970-01-01
      相关资源
      最近更新 更多