Последние несколько дней были потрачены на отладку очень странной проблемы.Произошел сбой приложения, созданного для i386, работающего в Windows, с полностью поврежденной верхней частью стека вызовов и указателем инструкций в бессмысленном месте.
После некоторых усилий я перестроил стэк вызовов и смог определить, как закончился IP-адрес.в бессмысленном месте.Инструкция в буст-коде общего указателя пытается вызвать функцию, определенную в моей таблице адресов импорта DLL, используя неправильное смещение.Инструкция выглядит следующим образом:
call dword ptr [nonsense offset into import address table]
В результате выполнение оказалось в плохом месте, которое, к сожалению, было исполняемым.Затем выполнение продолжалось, поглощая верхушку стека до тех пор, пока в конечном итоге не рухнул.
Запустив идентичное приложение на моем ПК и войдя в проблемный код, я могу найти ту же инструкцию вызова и увидеть, что она должнавызов нового оператора msvc100.
Продолжая сравнивать мини-дамп с ПК клиента с моим ПК, я обнаружил, что мой ПК вызывает функцию со смещением 0x0254 в таблицу адресов.На клиентском ПК код пытается вызвать функцию со смещением 0x8254.
Еще более запутанным является то, что это смещение не исходит из регистра или другой области памяти.Смещение является постоянной величиной при разборке.Итак, разборка выглядит так:
call dword ptr [ 0x50018254 ]
не похоже:
call dword ptr [ edx ]
Кто-нибудь знает, как это может произойти?