Всем привет, достался проект в котором в качестве технического долга, стоит задача разобраться с загрузкой DLL в режиме Debug. Пока не углублялся, но по простым тестам вижу такую картину, в Debug режиме LoadLibrary возвращает ноль, GetLastError сообщает что не найдена. В режиме Release все загружается и все работает. Может кто сталкивался с подобным расскажите, подозреваю что что-то с настройками проекта dll или exe который ее использует, или в них обеих, какие-то предположения из-за чего так может быть?
Здравствуйте, _agg, Вы писали:
_>Всем привет, достался проект в котором в качестве технического долга, стоит задача разобраться с загрузкой DLL и получением указателя на экспортируемую функцию в режиме Debug. Пока не углублялся, но по простым тестам вижу такую картину, в Debug режиме LoadLibrary отрабатывает правильно, но указатели на функции с помощью GetProcAddress получить не может возвращается 0, GetLastError сообщает что нет такой функции. В режиме Release все загружается и все работает. Может кто сталкивался с подобным расскажите, подозреваю что что-то с настройками проекта dll или exe который ее использует, или в них обеих, какие-то предположения из-за чего так может быть?
А если посмотреть таблицу экспорта (функций) — сравнив в релизной и дебажной длл-ке?
С другой стороны, нет смысла возиться с этим. Использование дебажных вариантов бинарников практикуют лишь в очень слабых командах/проектах. Потому что отлаживать гораздо полезнее релизные сборки с дебажными символами, соответствующие им pdb-файлы держат на сетевой шаре или же поднимают символ-сервер.
Re: Загрузка dll и получение указателя на функцию.
Здравствуйте, _agg, Вы писали:
_>Всем привет...
Эта самая DLL в режиме Debug пересобирается?
Если да — то, возможно, сами функции называются немного по другому... например с суффиксом каким-нибудь (из-за манглинга, например)...
Третий Рим должен пасть!
Re[2]: Загрузка dll и получение указателя на функцию.
Здравствуйте, a7d3, Вы писали: A>Использование дебажных вариантов бинарников практикуют ...
Скажите пожалуйста, а что значит для вас дебажные варианты бинарников? Те которые компилировались с дефайном _DEBUG? Или те кто при этом обязательно выключает оптимизацию? Добавляет отладочные символы? Что-то ещё?
Я сейчас пытаюсь понять, насколько надо менять методику дебага, если все assert-ы и верифаи отвалятся...
Сергей
Re[3]: Загрузка dll и получение указателя на функцию.
Здравствуйте, Sergey_BG, Вы писали:
S_B>Здравствуйте, a7d3, Вы писали: A>>Использование дебажных вариантов бинарников практикуют ...
S_B>Скажите пожалуйста, а что значит для вас дебажные варианты бинарников? Те которые компилировались с дефайном _DEBUG? Или те кто при этом обязательно выключает оптимизацию? Добавляет отладочные символы? Что-то ещё? S_B>Я сейчас пытаюсь понять, насколько надо менять методику дебага, если все assert-ы и верифаи отвалятся...
С соответствующим дейфайном и неинициализированные переменные зануляются
Перебить assert'ы на static_assert, а какие не получилось — на дампинг в лог как можно больше всего с северити «DEBUG», но и в тоже время с характерным префиксом.
Пожалуйста.
Re: Загрузка dll и получение указателя на функцию.
Все разобрался, с помощью dumpbin.exe посмотрел зависимости, проверил зависимости на предмет разрядности, оказалось что mfc140d.dll которую я взял из syswow64 оказалась 32 битной, а в system32 лежала как раз так 64-битная версия. Проверял разрядность в текстовом редакторе ,в первых строках открытой dll вот такие кракозябры которые означают x86: PE L x64: PE d†
Re[3]: Загрузка dll и получение указателя на функцию.
Здравствуйте, Sergey_BG, Вы писали:
S_B>Здравствуйте, a7d3, Вы писали: A>>Использование дебажных вариантов бинарников практикуют ...
S_B>Скажите пожалуйста, а что значит для вас дебажные варианты бинарников? Те которые компилировались с дефайном _DEBUG? Или те кто при этом обязательно выключает оптимизацию? Добавляет отладочные символы? Что-то ещё? S_B>Я сейчас пытаюсь понять, насколько надо менять методику дебага, если все assert-ы и верифаи отвалятся...
Дело не столько в макросах, сколько в опциях компилятора. Например, под вижлой, используются контейнеры/итераторы с кучей дебажной инфы, которые работают намного медленнее. Так же в дебаг сборке отключены оптимизации. И т.п.
Re[2]: Загрузка dll и получение указателя на функцию.
Здравствуйте, _agg, Вы писали:
_>Все разобрался, с помощью dumpbin.exe посмотрел зависимости, проверил зависимости на предмет разрядности, оказалось что mfc140d.dll которую я взял из syswow64 оказалась 32 битной, а в system32 лежала как раз так 64-битная версия. Проверял разрядность в текстовом редакторе ,в первых строках открытой dll вот такие кракозябры которые означают x86: PE L x64: PE d†