Обнаружение смещенной ссылки в Visual Studio - PullRequest
1 голос
/ 24 февраля 2012

Я недавно завершил начальный порт очень большого приложения 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. Вы не можете себе представить облегчение, когда это волшебным образом решило проблему.

Теперь на мои вопросы:

  1. Почему это не повредило ссылку в более старой сборке VC ++ 6? Я могу только предположим, что старый компилятор имел «функцию», чтобы предотвратить это проблема в двоичном, статическом или динамическом.

  2. Есть ли способ обнаружить это с помощью переключателя компилятора или другого средства. Это была очень неприятная ошибка, и я тоже потратил впустую много времени на поиски!

Спасибо за любой совет, который вы сможете дать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...