“4GB will always be enough”

Порой разработчики приложений просто поражают своей храбростью и безудержным оптимизмом. Свежий пример - на днях получаю письмо с просьбой разобраться почему 32-битное приложение, нормально работавшее в Windows Server 2003 for Itanium перестало запускаться в Windows Server 2008 for Itanium. Что особенно приятно, так это то, что вместо традиционного «приложение падает, если сделать то, то и вот то», просто прислали сессию отладчика, остановленную непосредственно перед вызовом NtAllocateVirtualMemory, который и приводил к падению.

Сам вызов выглядел довольно невинно если не считать, что запрашивался блок памяти размером чуть более 1GB. После некоторого копания в незнакомом коде выяснилось, что размер запрашиваемого блока и был причиной - в адресном пространстве процесса просто не осталось свободного блока такого размера.

На этом мое расследование закончилось и я спихнул проблему на другого разработчика, так как все равно это не моя епархия, а дел по горло и т.д. Однако на следующий день этот баг всё равно вернулся ко мне. Как оказалось причиной все-таки скрывалась в Wow64. Одна из системных .dll, загружаемых этим процессом в Windows Server 2008 загружалась прямо по середине свободного адресного пространства, разбивая его пополам. В Windows Server 2003 же эта .dll ютилась на краю адресного пространства, никому при этом не мешая. Причиной этому были две вещи:

  1. Базовый адрес .dll изменился с 0x7xxxxxxx на 0x4xxxxxxx;

  2. Механизм dynamic rebase, который в обычных условиях не позволяет .dll занять «лучшее место в центре» не сработал на этот раз из-за того, что эта .dll была собрана с выравниванием на границу 4KB, а на IA-64 dynamic rebase работает только с библиотеками выровненными на границу 8KB.

В общем, починить эту проблему не составило труда. Однако оптимизм разработчиков приложения меня удивил. Затребовать больше половины адресного пространства одним куском и свято верить в успех этого безнадежного дела - это требует немалой выдержки. А если вспомнить, что набор системных библиотек разниться от версии к версии, да, к тому же, что в любой момент в процесс может внедриться посторонняя .dll, за какой-то своей надобностью, то вообще нужны стальные нервы, чтобы при этом спокойно спать.

comments powered by Disqus