Отладка проекта DLL Visual Studio 2010

Я пытаюсь отладить собственный проект DLL C / C ++ из Visual Studio 2010. Я пытаюсь следовать этим инструкциям: http://msdn.microsoft.com/en-us/library/c91k1xcf(v=VS.100).aspx

Я хочу использовать встроенный отладчик и иметь возможность выполнять пошаговый код, изучать структуры и т. Д., Как если бы я делал с обычным проектом .exe. Инструкции на приведенной выше странице описывают категорию Отладка в разделе Свойства конфигурации, которую я не вижу.

http://img707.imageshack.us/img707/4402/lalasz.png

Простое нажатие F5 для отладки приводит к следующей ошибке:

Невозможно запустить программу C: \ Users ....... Test.dll

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

Изменить: поскольку я не дал понять с самого начала, я хочу, чтобы Visual Studio загрузила библиотеку моей DLL в процесс-заглушку и позволила мне отлаживать оттуда исходный уровень, как это делает OllyDbg.

Моя DLL - это не тот тип, который содержит набор функций, которые нужно экспортировать и вызывать. Вместо этого он выполняет переключение / регистр в DllMain, а на DLL_PROCESS_ATTACH порождает новый поток. Поэтому все, что мне нужно сделать в Visual Studio, - это загрузить мою DLL в исполняемый файл-заглушку и позволить мне устанавливать точки останова и т. Д.


person Mike    schedule 07.09.2010    source источник


Ответы (4)


Вы щелкнули правой кнопкой мыши имя решения в окне обозревателя решений и получили свойства решения. Обратите внимание, что в окне написано «Страницы свойств теста решения».

Вместо этого щелкните правой кнопкой мыши имя проекта («Тест» выделено жирным шрифтом), чтобы задать параметры проекта.

person Hans Passant    schedule 07.09.2010
comment
Спасибо, Ганс. Вкладка «Отладка» была там, когда я щелкнул правой кнопкой мыши в нужном месте, но я понял, что все равно неправильно читаю страницу. На самом деле я не хочу указывать исполняемый файл. В идеале VC ++ загружал бы мою DLL в исполняемый файл-заглушку и позволял мне делать это таким образом. Очень похоже на то, как OllyDbg позволяет вам это делать. Вы знаете, возможно ли это? - person Mike; 07.09.2010
comment
Нет, VS нужен .exe, любой .exe, который загружает DLL и вызывает точку входа, которую вы хотите протестировать. Помимо чего-то вроде тестового контейнера ActiveX, не существует универсального .exe, который мог бы определить, какие аргументы нужны вашей экспортируемой функции. Модульный тест - всегда хороший выбор. - person Hans Passant; 07.09.2010
comment
Моя DLL - это не тот тип, который содержит функции для экспорта и вызова. Точка входа будет переключаться / case на dwReason, а на DLL_PROCESS_ATTACH будет порождаться поток с CreateThread (), который будет выполнять некоторую работу. Та же самая DLL может отлаживаться с помощью «универсального .exe» в OllyDbg, который просто использует заглушку exe, которая вызывает LoadLibrary в DLL. Я могу легко создать свой собственный исполняемый файл скелета, который тоже делает то же самое, но я не смогу отлаживать его через IDE. - person Mike; 08.09.2010
comment
Да, используйте тот же EXE. Да, вы можете отладить его, установить точку останова на функции потока. Отладчик автоматически активирует точку останова, как только загружается DLL. - person Hans Passant; 08.09.2010
comment
Ганс, этот метод отлично работает. Для справки, это настройки, которые я использовал в конечном итоге: img839.imageshack.us/img839/770 /lalan.png При отладке я получаю сообщение об ошибке «Нет отладочной информации», в котором указано: «Отладочная информация для loaddll.exe не найдена или не совпадает». Двоичный файл не был построен с отладочной информацией. Думаю, я ничего не могу с этим поделать, и это не вредит мне. - person Mike; 08.09.2010

Вероятно, у вас в качестве стартового проекта есть тот, который производит dll.

У вас есть два варианта: либо изменить запускаемый проект на другой проект, который создает исполняемый файл, использующий эту DLL, либо настроить в свойствах проекта параметры отладки для проекта dll, чтобы запустить внешнее приложение, использующее эту dll (Свойства проекта / Отладка / Команда ).

person Cătălin Pitiș    schedule 07.09.2010

Собственные библиотеки DLL нельзя запускать автономно - они должны выполняться в контексте какой-либо программы. См. Эту часть страницы с инструкциями, на которую вы ссылались.

«Если вы начинаете отладку из проекта, который создает DLL, вы должны указать исполняемый файл, который хотите использовать при отладке DLL».

person Steve Townsend    schedule 07.09.2010

Вы также столкнетесь с этой проблемой из управляемого проекта. Visual Studio сообщает вам, что она не может запустить DLL, точно так же, как вы не можете дважды щелкнуть DLL из проводника и запустить программу.

Чтобы отлаживать DLL, напишите небольшое консольное приложение, которое вызывает функции из вашей DLL и выполняет ваш код. Если в вашей DLL есть функция foo(), вызовите foo() из main в консольном приложении. Установите консольное приложение как «запускаемый» проект, щелкнув правой кнопкой мыши имя проекта в обозревателе решений и выбрав соответствующий параметр.

Затем, когда вы нажмете F5, вы запустите консольное приложение, которое вызовет DLL.

person maxwellb    schedule 07.09.2010
comment
Моя DLL будет работать немного иначе, чем обычная. Он создаст поток в DllMain и оттуда будет выполнять другую работу. Я понимаю, что это плохая практика. Я хочу иметь возможность отлаживать его, как если бы я мог это сделать с помощью дизассемблера, такого как OllyDbg. С той лишь разницей, что я могу сделать это на уровне исходного кода. - person Mike; 07.09.2010