Отладка DLL с выпуском EXE

Возможно ли выполнить отладку в режиме DLL с выпуском в режиме EXE?

Я пытаюсь этот сценарий, но EXE не загружает отладочную DLL и выдает ошибку «Это приложение не удалось запустить …».

Я знаю, что это плохой сценарий, но из-за определенных требований я должен выполнить эту работу.

3

Решение

Да, это может работать.

Ваша проблема с «приложением не удалось запустить», скорее всего, вы скопировали отладочную версию библиотеки DLL (созданной на вашем компьютере с помощью Visual Studio) на компьютер, на котором не был установлен DEBUG CRT. Обычно копирование через MSVCRTD (версия) .dll в тот же каталог, где находятся ваши программные файлы, решает эту проблему. У меня есть предыдущий ответ, который охватывает некоторые из этого Вот.

Лучше всего, чтобы все ваши двоичные файлы всегда были связаны с одной и той же динамической библиотекой MSVCRT, чтобы они все имели одинаковое время выполнения.

Другой простой способ — скомпилировать вашу DLL-библиотеку DEBUG, чтобы использовать тот же вариант DLL-библиотеки MSVCRT (или статически связываться с CRT). Где-то на страницах свойств проекта VS (генерация кода, я думаю) есть выпадающий список для выбора CRT. Нет ничего плохого в том, чтобы связать розничный MSVCRT с отладочной DLL или статически связывать.

Вещи, на которые стоит обратить внимание, — это когда у вас есть другой вид среды выполнения отладки C, связанный с различными двоичными файлами. Если у вас есть DLL-версия MSVCRT, связанная с EXE, но отладочная MSCVRTD DLL для DLL, это может вызвать проблемы в некоторых случаях. Это связано с тем, что дескрипторы и блоки памяти отслеживаются двумя разными экземплярами CRT.

Примеры:

  1. Если вы выделяете память в EXE, но свободны в DLL. И наоборот.

  2. Файловые дескрипторы открываются с помощью fopen () в EXE, но используются или закрываются в EXE (и наоборот).

  3. Для любого из заголовочных файлов для интерфейса DLL наличие любых встроенных функций или методов, реализованных в заголовочном файле, является простым способом вызвать # 1 или # 2.

  4. Совместное использование объектов STL (std :: string, std :: list, std :: vector) является определенным нет-нет для смешанного использования CRT.

2

Другие решения

Это может работать, если ваш dll-интерфейс не имеет зависимостей от классов, которые могут отличаться при отладке и выпуске.
например std :: string и std :: vector в MSVC не совместимы при отладке и выпуске. (Заборы …)

Так например

std::string GetName();

не будет работать.

В дополнительные new и delete не следует сдвигать, потому что для отладки / выпуска используются разные среды выполнения. Но в любом случае вы должны всегда delete в том же контексте (dll / exe), что и new,

3

По вопросам рекламы [email protected]