为什么 "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
标志 的值。
我已经在两台机器上试过了:
- Windows 8 与 IIS 8.5.9600.16384
- Windows 带 IIS 7.5.7600.16385 的服务器 2008 R2
在我的特殊情况下,只需重新配置 AppPool 就可以了(我们已经从 x86 迁移到 AnyCPU,这种过时的配置只是一个错误),但我仍然对为什么会发生这种情况感兴趣? (可能是 IIS 中存在一些错误,我无法在任何地方找到提到的这种行为)。
更新:看来我已经想通了,不过这是暂缓:
- 问题几乎可以肯定是由于代码优化(我以这种方式编写代码,排除了其他选项:抖动重新排序函数。这是不是编译器,因为我不在测试之间重新编译应用程序。
- 大部分优化是通过抖动完成的,x86 优化比 x64 优化更积极,因此产生的代码有所不同。当 Microsoft 决定对 x64 进行优化时,将打破更激进的行。
所以答案好像是:
C# 中基本上有两个优化步骤:编译器(csc.exe,当 C# 代码被翻译成 IL 时)和抖动(当 IL 被翻译成机器码时)。抖动不会进行大部分优化(article). Also there is a great post Eric Lippert 关于您可能期望的优化。
x86 和 x64 抖动进行不同 优化(CLR via C# 第四版 Jeffrey Richter,第五部分线程,易失性构造部分,第 764 页)
因此您可以在 x64(因为抖动不会积极优化代码)和 x86(更成熟)中获得正确的行号。
总结:我还没有找到解决它的方法。
我有 ASP 在发布模式下为 AnyCPU 编译的 C# .Net Web 应用程序(无 MVC 或 WebForms),pdb 文件已启用并随应用程序一起部署。
当 AppPool 上的 enable 32-bit applications
具有默认值 False
时,异常的堆栈跟踪具有 正确的 行号。
当标志设置为 True
时,堆栈跟踪具有 不正确的 行号。
为了清楚起见我唯一更改的是我的 Web 应用程序的 AppPool 配置中 enable 32-bit applications
标志 的值。
我已经在两台机器上试过了:
- Windows 8 与 IIS 8.5.9600.16384
- Windows 带 IIS 7.5.7600.16385 的服务器 2008 R2
在我的特殊情况下,只需重新配置 AppPool 就可以了(我们已经从 x86 迁移到 AnyCPU,这种过时的配置只是一个错误),但我仍然对为什么会发生这种情况感兴趣? (可能是 IIS 中存在一些错误,我无法在任何地方找到提到的这种行为)。
更新:看来我已经想通了,不过这是暂缓:
- 问题几乎可以肯定是由于代码优化(我以这种方式编写代码,排除了其他选项:抖动重新排序函数。这是不是编译器,因为我不在测试之间重新编译应用程序。
- 大部分优化是通过抖动完成的,x86 优化比 x64 优化更积极,因此产生的代码有所不同。当 Microsoft 决定对 x64 进行优化时,将打破更激进的行。
所以答案好像是:
C# 中基本上有两个优化步骤:编译器(csc.exe,当 C# 代码被翻译成 IL 时)和抖动(当 IL 被翻译成机器码时)。抖动不会进行大部分优化(article). Also there is a great post Eric Lippert 关于您可能期望的优化。
x86 和 x64 抖动进行不同 优化(CLR via C# 第四版 Jeffrey Richter,第五部分线程,易失性构造部分,第 764 页)
因此您可以在 x64(因为抖动不会积极优化代码)和 x86(更成熟)中获得正确的行号。
总结:我还没有找到解决它的方法。