Я недавно завершил начальный порт очень большого приложения MFC / C ++ с Visual C ++ 6 до VS 2010. Этот проект включает в себя около 25 пользовательских модулей DLL. После решения большинства проблем компиляции я неоднократно сталкивался с исключением времени выполнения в одном из модулей DLL, когда вызывался один из этих связанных методов DLL. Запуск в отладчике не помог, потому что я только что получил чепуху сразу после исключения: поврежденные строки CSt, которые ранее были доступны прямо перед разрушительным вызовом и тому подобное. Тот же эффект в VS 2008. Отладчик и стек вызовов были просто потеряны. (Это должно было быть подсказка)
После нескольких недель царапин на голове и дальнейшей отладки, я наконец провел более тщательный анализ исходного кода для нескольких библиотек DLL и обнаружил, что около 20 файлов заголовков включили / выключили выравнивание байтов как следующим образом:
#pragma pack(push,1)
...
Some byte aligned structures
...
#pragma pack(pop,1)
Хорошо, после прочтения документации MSDN снова, я понял, что они допустили ошибку и что они должны были сделать вторую прагму #pragma pack(pop)
, чтобы вернуться к предыдущему выравниванию упаковки. Они фактически оставляли упаковку с выравниванием байтов.
Это смещение байтов в DLL привело к тому, что ад вышел из-под контроля при вызове некоторых функций DLL. Вы не можете себе представить облегчение, когда это волшебным образом решило проблему.
Теперь на мои вопросы:
Почему это не повредило ссылку в более старой сборке VC ++ 6? Я могу
только предположим, что старый компилятор имел «функцию», чтобы предотвратить это
проблема в двоичном, статическом или динамическом.
Есть ли способ обнаружить это с помощью переключателя компилятора или другого средства. Это была очень неприятная ошибка, и я тоже потратил впустую
много времени на поиски!
Спасибо за любой совет, который вы сможете дать.