0

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

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

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

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

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

  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 优化时,更激进的路线将被打破。
4

1 回答 1

1

所以答案似乎是:

  1. C#中基本上有两个优化步骤:编译器(csc.exe,当C#代码被翻译成IL时)和抖动(当IL被翻译成机器代码时)。Jitter 没有进行大部分优化(文章)。此外,Eric Lippert 还发表了一篇很棒的文章,介绍了您可能期望的优化。

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

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

摘要:我还没有找到解决它的方法。

于 2015-01-19T08:21:05.487 回答