Почему флаг включения 32-битных приложений прерывает номера строк в трассировке стека

У меня есть веб-приложение ASP .Net на C# (без MVC или WebForms), скомпилированное в режиме Release для AnyCPU, файлы pdb включены и развернуты вместе с приложением.

Когда enable 32-bit applications в AppPool имеет значение по умолчанию False, трассировка стека исключения имеет правильные номера строк.

Когда для флага установлено значение True, трассировка стека содержит неверные номера строк.

Просто чтобы было ясно, единственное, что я изменяю, — это значение флага enable 32-bit applications в конфигурации AppPool моего веб-приложения.

Я пробовал это на двух машинах:

  1. Windows 8 с IIS 8.5.9600.16384
  2. Windows Server 2008 R2 с IIS 7.5.7600.16385

В моем конкретном случае можно просто перенастроить AppPool (мы уже перешли с x86 на AnyCPU, и эта устаревшая конфигурация — просто ошибка), но мне все еще интересно, почему это происходит? (возможно, в IIS есть какая-то ошибка, я нигде не смог найти упоминания об этом поведении).

Обновление: кажется, я разобрался, но это временная передышка:

  1. Проблемы почти наверняка связаны с оптимизацией кода (я написал код таким образом, что исключаются другие варианты: джиттер переупорядочивает функции. Это не компилятор, потому что я не делаю перекомпилировать приложение между тестами).
  2. Большая часть оптимизации выполняется за счет джиттера, а оптимизация x86 более агрессивна, чем оптимизация x64, отсюда и разница в результирующем коде. Когда Microsoft решит сделать оптимизацию x64, более агрессивные линии будут нарушены.

person Aleksei Poliakov    schedule 16.01.2015    source источник


Ответы (1)


Итак, ответ выглядит следующим образом:

  1. По сути, в C# есть два этапа оптимизации: компилятор (csc.exe, когда код C# транслируется в IL) и дрожание (когда IL транслируется в машинный код). Jitter не выполняет большинство оптимизаций (статья). Также есть отличный пост Эрика Липперта о том, какую оптимизацию вы можете ожидать.

  2. Джиттеры x86 и x64 выполняют разные оптимизации (CLR via C# Fourth Edition Джеффри Рихтера, часть V Threading, раздел Volatile Constructs). сильный>, стр. 764)

Таким образом, вы можете получить правильные номера строк в x64 (поскольку джиттер не оптимизирует код так агрессивно) и x86 (это более зрелый).

Резюме: я не нашел способ обойти это.

person Aleksei Poliakov    schedule 19.01.2015