Поврежденное смещение в инструкции вызова


Последние несколько дней были потрачены на отладку очень странной проблемы. Приложение, построенное для i386, работающее под управлением Windows, разбилось, причем верхняя часть пакета вызовов полностью повреждена, а указатель инструкции находится в бессмысленном месте.

После некоторых усилий я перестроил стек вызовов и смог определить, как IP оказался в бессмысленном месте. Инструкция в boost shared pointer code пытается вызвать функцию, определенную в моей таблице адресов импорта DLL, используя неверный сдвиг. Инструкция выглядит так:
call dword ptr [nonsense offset into import address table]

В результате исполнение закончилось в плохом месте, которое, к сожалению, было исполняемым. Затем выполнение продолжалось, поглощая верхнюю часть стека до тех пор, пока в конечном итоге не рухнул.

Запустив идентичное приложение на моем ПК и войдя в проблемный код, я могу найти ту же инструкцию вызова и увидеть, что она должна быть вызвана оператором msvc100 'new'.

Дальнейшее сравнение минидампа с ПК клиента на моем ПК, я обнаружил, что мой компьютер вызывает функцию со смещением 0x0254 в адресную таблицу. На клиентском компьютере код пытается вызвать функцию со смещением 0x8254.

Еще более запутанным является то, что это смещение не исходит из регистра или другого места памяти. Смещение является постоянной величиной при разборке. Итак, разборка выглядит следующим образом:

call dword ptr [ 0x50018254 ]

Не нравится:

call dword ptr [ edx ]
Кто-нибудь знает, как это может произойти?
2 2

2 ответа:

Это одно битовое сальто:

0x0254 = 0b0000001001010100
0x8254 = 0b1000001001010100
Возможно, испорчена память, испорчен диск, гамма-луч от солнца...?

Если этот конкретный случай воспроизводим и их двоичный код на диске совпадает с вашим, Я бы исследовал дальше. Если он не является специально воспроизводимым, я бы посоветовал клиенту выполнить некоторую диагностику машины.

Это кажется мне аппаратной ошибкой, в основном ошибкой памяти. Как отметил @Hostile_Fork, это просто немного флип.

Есть ли в вашей памяти функция ECC? он это делает, убедитесь, что включен. Я бы прошел тест на выгорание памяти с memtest86, чтобы увидеть, что происходит, я уверен, что у вас есть неисправный чип памяти, не похожий на ошибку.