У меня есть веб-приложение ASP .Net на C# (без MVC или WebForms), скомпилированное в режиме Release для AnyCPU, файлы pdb включены и развернуты вместе с приложением.
Когда enable 32-bit applications
в AppPool имеет значение по умолчанию False
, трассировка стека исключения имеет правильные номера строк.
Когда для флага установлено значение True
, трассировка стека содержит неверные номера строк.
Просто чтобы было ясно, единственное, что я изменяю, — это значение флага enable 32-bit applications
в конфигурации AppPool моего веб-приложения.
Я пробовал это на двух машинах:
- Windows 8 с IIS 8.5.9600.16384
- Windows Server 2008 R2 с IIS 7.5.7600.16385
В моем конкретном случае можно просто перенастроить AppPool (мы уже перешли с x86 на AnyCPU, и эта устаревшая конфигурация — просто ошибка), но мне все еще интересно, почему это происходит? (возможно, в IIS есть какая-то ошибка, я нигде не смог найти упоминания об этом поведении).
Обновление: кажется, я разобрался, но это временная передышка:
- Проблемы почти наверняка связаны с оптимизацией кода (я написал код таким образом, что исключаются другие варианты: джиттер переупорядочивает функции. Это не компилятор, потому что я не делаю em> перекомпилировать приложение между тестами).
- Большая часть оптимизации выполняется за счет джиттера, а оптимизация x86 более агрессивна, чем оптимизация x64, отсюда и разница в результирующем коде. Когда Microsoft решит сделать оптимизацию x64, более агрессивные линии будут нарушены.