Загрузка dll и получение указателя на функцию.
От: _agg  
Дата: 06.06.19 04:23
Оценка:
Всем привет, достался проект в котором в качестве технического долга, стоит задача разобраться с загрузкой DLL в режиме Debug. Пока не углублялся, но по простым тестам вижу такую картину, в Debug режиме LoadLibrary возвращает ноль, GetLastError сообщает что не найдена. В режиме Release все загружается и все работает. Может кто сталкивался с подобным расскажите, подозреваю что что-то с настройками проекта dll или exe который ее использует, или в них обеих, какие-то предположения из-за чего так может быть?
Отредактировано 06.06.2019 9:58 _agg . Предыдущая версия . Еще …
Отредактировано 06.06.2019 7:07 _agg . Предыдущая версия .
Re: Загрузка dll и получение указателя на функцию.
От: a7d3  
Дата: 06.06.19 07:14
Оценка: :)
Здравствуйте, _agg, Вы писали:

_>Всем привет, достался проект в котором в качестве технического долга, стоит задача разобраться с загрузкой DLL и получением указателя на экспортируемую функцию в режиме Debug. Пока не углублялся, но по простым тестам вижу такую картину, в Debug режиме LoadLibrary отрабатывает правильно, но указатели на функции с помощью GetProcAddress получить не может возвращается 0, GetLastError сообщает что нет такой функции. В режиме Release все загружается и все работает. Может кто сталкивался с подобным расскажите, подозреваю что что-то с настройками проекта dll или exe который ее использует, или в них обеих, какие-то предположения из-за чего так может быть?


А если посмотреть таблицу экспорта (функций) — сравнив в релизной и дебажной длл-ке?

С другой стороны, нет смысла возиться с этим. Использование дебажных вариантов бинарников практикуют лишь в очень слабых командах/проектах. Потому что отлаживать гораздо полезнее релизные сборки с дебажными символами, соответствующие им pdb-файлы держат на сетевой шаре или же поднимают символ-сервер.
Re: Загрузка dll и получение указателя на функцию.
От: GhostCoders Россия  
Дата: 06.06.19 07:14
Оценка:
Здравствуйте, _agg, Вы писали:

_>Всем привет...

Эта самая DLL в режиме Debug пересобирается?
Если да — то, возможно, сами функции называются немного по другому... например с суффиксом каким-нибудь (из-за манглинга, например)...
Третий Рим должен пасть!
Re[2]: Загрузка dll и получение указателя на функцию.
От: Sergey_BG Россия  
Дата: 06.06.19 09:38
Оценка:
Здравствуйте, a7d3, Вы писали:
A>Использование дебажных вариантов бинарников практикуют ...

Скажите пожалуйста, а что значит для вас дебажные варианты бинарников? Те которые компилировались с дефайном _DEBUG? Или те кто при этом обязательно выключает оптимизацию? Добавляет отладочные символы? Что-то ещё?
Я сейчас пытаюсь понять, насколько надо менять методику дебага, если все assert-ы и верифаи отвалятся...
Сергей
Re[3]: Загрузка dll и получение указателя на функцию.
От: a7d3  
Дата: 06.06.19 09:46
Оценка:
Здравствуйте, Sergey_BG, Вы писали:

S_B>Здравствуйте, a7d3, Вы писали:

A>>Использование дебажных вариантов бинарников практикуют ...

S_B>Скажите пожалуйста, а что значит для вас дебажные варианты бинарников? Те которые компилировались с дефайном _DEBUG? Или те кто при этом обязательно выключает оптимизацию? Добавляет отладочные символы? Что-то ещё?

S_B>Я сейчас пытаюсь понять, насколько надо менять методику дебага, если все assert-ы и верифаи отвалятся...

С соответствующим дейфайном и неинициализированные переменные зануляются
Перебить assert'ы на static_assert, а какие не получилось — на дампинг в лог как можно больше всего с северити «DEBUG», но и в тоже время с характерным префиксом.
Пожалуйста.
Re: Загрузка dll и получение указателя на функцию.
От: _agg  
Дата: 06.06.19 10:03
Оценка: +1
Все разобрался, с помощью dumpbin.exe посмотрел зависимости, проверил зависимости на предмет разрядности, оказалось что mfc140d.dll которую я взял из syswow64 оказалась 32 битной, а в system32 лежала как раз так 64-битная версия. Проверял разрядность в текстовом редакторе ,в первых строках открытой dll вот такие кракозябры которые означают x86: PE L x64: PE d†
Re[3]: Загрузка dll и получение указателя на функцию.
От: SaZ  
Дата: 06.06.19 12:44
Оценка:
Здравствуйте, Sergey_BG, Вы писали:

S_B>Здравствуйте, a7d3, Вы писали:

A>>Использование дебажных вариантов бинарников практикуют ...

S_B>Скажите пожалуйста, а что значит для вас дебажные варианты бинарников? Те которые компилировались с дефайном _DEBUG? Или те кто при этом обязательно выключает оптимизацию? Добавляет отладочные символы? Что-то ещё?

S_B>Я сейчас пытаюсь понять, насколько надо менять методику дебага, если все assert-ы и верифаи отвалятся...

Дело не столько в макросах, сколько в опциях компилятора. Например, под вижлой, используются контейнеры/итераторы с кучей дебажной инфы, которые работают намного медленнее. Так же в дебаг сборке отключены оптимизации. И т.п.
Re[2]: Загрузка dll и получение указателя на функцию.
От: SaZ  
Дата: 06.06.19 12:46
Оценка:
Здравствуйте, _agg, Вы писали:

_>Все разобрался, с помощью dumpbin.exe посмотрел зависимости, проверил зависимости на предмет разрядности, оказалось что mfc140d.dll которую я взял из syswow64 оказалась 32 битной, а в system32 лежала как раз так 64-битная версия. Проверял разрядность в текстовом редакторе ,в первых строках открытой dll вот такие кракозябры которые означают x86: PE L x64: PE d†


64-битная Windows — это очень просто!
Автор: Torie
Дата: 20.08.10
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.