为什么 "enable 32-bit applications" 标志会中断堆栈跟踪中的行号

Why "enable 32-bit applications" flag breaks line numbers in stack trace

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

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

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

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

我已经在两台机器上试过了:

  1. Windows 8 与 IIS 8.5.9600.16384
  2. Windows 带 IIS 7.5.7600.16385 的服务器 2008 R2

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

更新:看来我已经想通了,不过这是暂缓:

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

所以答案好像是:

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

  2. x86 和 x64 抖动进行不同 优化(CLR via C# 第四版 Jeffrey Richter,第五部分线程易失性构造部分,第 764 页)

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

总结:我还没有找到解决它的方法。