Не запускается dll файл отладка
Это решение содержит много проектов(около 100). Когда я их компилирую, они все работают нормально. Я могу запустить их без каких-либо проблем, и (вполне) все работает (есть некоторые ошибки). Один из проектов-ALL_BUILD, но он дает ту же ошибку, если я пытаюсь отладить установку(другой проект). Я компилирую RELWithDebInfo как конфигурацию, и если я выполняю программу вручную, она работает. Он выводится в C:full путь здесьVS2010binRelWithDebInfo
но если я попытаюсь запустить компилятор, он скажет
" Не удается запустить программу C:full путь здесьVS2010RelWithDebInfoALL_BUILD Не удается найти указанный файл"
Я попытался скопировать скомпилированную программу в путь, требуемый VS, но он вызвал ту же ошибку.
Что нужно сделать, чтобы решить эту проблему? Прямо сейчас я настроил cmake для создания также проекта mingw, и я компилирую его и отлаживаю с gdb, но это действительно медленный и непрактичный рабочий процесс, и я хотел бы использовать отладчик VS.
Я должен сказать, что если я компилирую с Debug as configuration, программа даже не запускается.
Я использую VS2010 Express на Win7 64bit
(Это большая программа с открытым исходным кодом, поэтому я точно не знаю, что она делает)
угадывая из информации, которую я имею, вы на самом деле не компилируете программу, но пытаетесь ее запустить. То есть BUILD_ALL устанавливается как ваш проект запуска. (Он должен быть жирным шрифтом, в отличие от других проектов в вашем решении) если вы попытаетесь запустить/debug, вы получите описанную вами ошибку, потому что просто нечего запускать.
проект, скорее всего, сгенерирован через CMAKE и включен в ваше решение Visual Studio. Установить любой из проектов, которые генерируют .exe как проект запуска (щелкнув правой кнопкой мыши на проекте и выбрав "установить как проект запуска"), и вы, скорее всего, сможете запустить их из Visual Studio.
У меня была такая же проблема :) Проверьте папку "исходный код" в "обозревателе решений", если она не содержит файла "исходный код", то :
щелкните правой кнопкой мыши на "исходный код" > добавить > существующий элемент > Выберите файл, который вы хотите создать и запустить.
Я думаю, что вы должны проверить это:
Если целевой EXE правильно настроен в настройках проекта ("Команда", на вкладке отладка). Поскольку все отдельные проекты запускаются при запуске отладки, вполне возможно, что отсутствует только цель отладки для решения "все", проверьте, какой проект в настоящее время активен (вы также можете выбрать цель отладчика, изменив активный проект).
зависимостей (библиотек DLL) также находятся в целевом каталоге отладчика или могут быть загружены (вы можете использовать "зависит.exe " инструмент для проверки зависимостей исполняемого файла или DLL).
Иногда требуется выполнить отладку приложения (EXE-файл), которое не является частью решения Visual Studio. Это может быть проект с открытой папкой, вы или кто-то другой мог создать приложение вне Visual Studio или вы получили приложение в другом месте.
Для проекта с открытой папкой в Visual Studio (без файла проекта или решения) см. статью Выполнение и отладка кода или (для C++) Настройка параметров отладки с помощью launch.vs.json.
Для приложения, которое не существует в Visual Studio, отладка обычно выполняется путем запуска за пределами Visual Studio, а затем присоединения с помощью функции Присоединение к процессу в отладчике Visual Studio. Дополнительные сведения см. в статье Присоединение к выполняемым процессам.
Присоединение к приложению требует выполнения некоторых операций вручную, и это занимает несколько секунд. Из-за этой задержки присоединение не помогает отладить проблемы при запуске или приложение, которое не ждет ввода данных пользователем и быстро завершается.
Функции отладки для приложения, не созданного в Visual Studio, ограниченны, независимо от того, присоединяетесь ли вы к нему или добавляете в решение Visual Studio.
Если у вас есть исходный код, лучше всего импортировать его в проект Visual Studio. Затем запустите отладочную сборку приложения.
Если у вас нет исходного кода и у приложения нет отладочной информации в совместимом формате, вам доступно немного функций отладки.
Отладка из проекта DLL
Задайте точки останова в проекте DLL.
Щелкните проект DLL правой кнопкой мыши и выберите Назначить запускаемым проектом.
Убедитесь, что в поле Конфигурация решений установлено значение Отладка. Нажмите клавишу F5, щелкните зеленую стрелку Запуск или выберите Отладка > Начать отладку.
Если отладка не достигает точек останова, убедитесь, что выходные данные библиотеки DLL (по умолчанию — папка \Debug) — это расположение, которое вызывает вызывающее приложение.
Если вы хотите прервать выполнение кода в управляемом вызывающем приложении из собственной библиотеки DLL или наоборот, включите отладку в смешанном режиме.
В некоторых сценариях может потребоваться сообщить отладчику, где найти исходный код. Дополнительные сведения см. в разделе Использование страниц "Символы не загружены" или "Нет исходного кода".
Отладка DLL
Хотя в виде DLL реализуются самые различные объекты, существует 2 общих принципа отладки, применимых ко всем разновидностям DLL.
- Поскольку DLL не может выполняться сама по себе, для её отладки необходимо запустить под отладчиком любое использующее её приложение. Полный путь к exe-файлу этого приложения необходимо указать в настройках отладки.
- Необходимо также проследить, чтобы при запуске приложения отладчик загружал отладочные символы нашей DLL. Иначе все точки останова, поставленные в коде DLL, будут отключены. По умолчанию символы загружаются только для тех DLL, которые подключаются при запуске приложения. Для всех остальных (к ним, в частности, относятся все внутрипроцессные COM-серверы) загрузка символов не производится. Если отлаживаемая DLL принадлежит к этой категории, для неё необходимо явно потребовать загрузку отладочных символов. Для этого следует добавить её в список Additional DLLs в настройках отладки.
Дальнейшая отладка DLL ничем принципиально не отличается от отладки приложений.
Иногда приложение, использующее DLL, само должно запускаться ещё одним приложением (именно такая ситуация имеет место с ISAPI-расширениями, которые загружает сервис IIS). В этом случае можно придерживаться следующей тактики.
- Подключиться к приложению, используя методики из предыдущего раздела (в данном случае вызов DebugBreak придётся вставлять в код DLL). Если приложение продолжает выполнение, остановить его ( Debug->Break ).
- Убедиться, что отладчик загрузил символы для DLL (в окне Debug должна появиться строчка вида "Loaded symbols for "). Если этого не произошло, следует добавить отлаживаемую DLL в список Additional DLLs .
- Открыть файлы с исходными текстами DLL (не открывая её проекта!) и расставить необходимые точки останова.
- Возобновить выполнение приложения.
Отладка расширений оболочки Windows
Для расширений оболочки Windows в качестве отлаживаемого приложения указывается explorer.exe .
Закрытие оболочки Windows
Поскольку в системе не могут работать две оболочки одновременно (об исключениях из этого правила мы поговорим немного позже), необходимо завершить оболочку Windows, прежде чем запускать новую из-под отладчика. Чтобы завершить оболочку, нужно:
- Выбрать команду Start->Shut Down .
- Щёлкнуть по кнопке No в раскрывшемся диалоге, удерживая клавиши Ctrl+Alt+Shift .
В Windows 2000 вместо кнопки No следует щёлкнуть по кнопке Cancel .
Повторный запуск оболочки
Чтобы снова запустить оболочку по окончании сеанса отладки, достаточно запустить explorer.exe из любой оболочки или из командной строки. Если ни оболочки, ни командной строки под рукой нет, можно использовать следующие приёмы.
Под Windows NT/2000:
- Нажать Ctrl+Alt+Del.
- Вызвать Task Manager.
- Выбрать команду File->New Task (Run) и запустить оболочку.
- Сделать двойной щелчок по рабочему столу. Откроется диалоговое окно Task .
- Выбрать команду File->Run и запустить оболочку.
Отладка расширений в Windows NT/2000
В Windows NT/2000 можно запускать каждый новый экземпляр Проводника (Windows Explorer) в отдельном процессе (по умолчанию рабочий стол, панель задач и все Проводники запускаются в отдельных потоках одного процесса Explorer.exe). Благодаря этому можно обойтись без постоянных перезапусков оболочки. Чтобы включить этот режим работы оболочки, необходимо открыть в редакторе реестра ключ HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer , добавить в него параметр DesktopProcess (типа REG_DWORD ) и назначить ему значение "1". Изменения вступят в силу после выхода и повторного входа в систему.
Выгрузка DLL
В обычном режиме работы оболочка выгружает DLL не сразу, а по истечении некоторого промежутка времени. Это может помешать линкеру перезаписывать файл DLL. Чтобы оболочка выгружала DLL немедленно, нужно создать в реестре ключ HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Explorer\AlwaysUnloadDLL и записать "1" в его параметр по умолчанию.
Отладка Add-in'ов к Visual C++
При отладке add-in'ов отладчику Visual C++ приходится отлаживать самого себя. Лучше всего запустить экземпляр среды Visual C++ без add-in'а, а затем использовать этот экземпляр для отладки. Иначе возможны весьма тонкие и неочевидные ошибки, на исправление которых уйдёт уйма времени. Другая возможность для отладки add-in'ов – удалённая отладка (о ней мы поговорим в следующем разделе).
Отладка ISAPI-расширений
Данные в этом разделе относятся к IIS5
ISAPI-расширение – это DLL, которая загружается веб-сервером IIS для обработки запросов. В зависимости от настроек защиты веб-приложения (application protection) они могут загружаться как главным файлом IIS inetinfo.exe (режим Low (IIS Process)), так и отдельным процессом dllhost.exe (режимы Medium (Pooled) и High (Isolated)). Чуть позже мы увидим, как отлаживать ISAPI-расширение в том и в другом случае. Но сначала несколько слов о подготовке расширения к отладке.
Подготовка к отладке
Прежде чем начинать отладку, рекомендуется проделать следующие шаги.
- Построить отладочную версию расширения.
- Создать для него виртуальную директорию с разрешением на выполнение (execute). Для создания виртуальной директории используется утилита Internet Services Manager (Запустить её можно из меню Start->Administrative Tools ). Можно дать ей любое имя (например, test). В качестве физического пути к директории следует указать путь к отладочному каталогу DLL расширения (например, C:\Projects\MyISAPI\Debug ).
- Отключить кэширование расширений веб-сервером. По умолчанию DLL расширения загружается сервером, как только приходит первый запрос к ней, а затем остаётся в памяти, чтобы последующие запросы обрабатывались быстрее. Это разумный подход, но в отладочных целях лучше отключить кэширование, чтобы DLL выгружалась сразу после обработки запроса. Для этого запустите Internet Services Manager, вызовите из контекстного меню веб-сайта диалог свойств, перейдите на закладку Home Directory , нажмите на кнопку Configuration. и снимите флажок Cache ISAPI applications .
В MSDN упоминается альтернативный способ отключить кэширование: открыть в редакторе реестра ключ HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W3SVC\Parameters и добавить в него параметр (REG_DWORD)CacheExtensions=0. Но мне не удалось заставить этот метод работать.
Если веб-сервер ещё не запущен, запустите его. После этого можно переходить непосредственно к отладке.
В процессе отладки ISAPI-расширений довольно часто приходится запускать и останавливать веб-сервер. Для этого можно использовать команды net start w3svc и net stop w3svc соответственно. При желании можно добавить эти команды в меню Tools , чтобы они всегда были под рукой.
Отладка расширения в режиме in-process
В этом режиме DLL загружается процессом inetinfo.exe . Чтобы к нему присоединиться, можно использовать любую из описанных в предыдущем разделе методик (команду Attach To Process , команду Debug в Task Manager или функцию DebugBreak , которую в данном случае следует вставить в GetExtensionVersion расширения). После этого можно действовать по сценарию, описанному в подразделе "Общие принципы отладки", чтобы загрузить отладочные символы (если это необходимо) и расставить точки останова.
Запуск IIS в режиме обыкновенного приложения
Если объем отладки велик, и часто приходится запускать и останавливать сервис, проще запускать IIS из отладчика, как обыкновенное приложение.
Чтобы заставить IIS работать в таком режиме, нужно изменить учетную запись, под которой запускаются сервисы IIS Admin, World Wide Web Publishing и FTP Publishing, на запись, под которой будет производится отладка. Физически при запуске всех этих сервисов запускается один и тот же исполняемый файл – inetinfo.exe . DLL-библиотеки загружаются в сервис World Wide Web Publishing, но он зависит от IIS Admin-сервиса, поэтому сервис IIS Admin должен быть запущен первым. Учетная запись, под которой теперь будут запускаться сервисы, должна иметь довольно высокие привилегии. Проще всего использовать для этого учетную запись администратора, добавив ей привилегию "Act as part of the operating system" (программистам известную как SE_TCB_NAME ). Будьте осторожны, так как эта привилегия предоставляет широчайшие возможности. Теперь нужно настроить отладчик Visual C++, задав в качестве отлаживаемого проекта путь к файлу inetinfo.exe (по умолчанию он размещается в каталоге %SystemRoot%\System32\inetsrv\ ), а в качестве параметров строку "-e w3svc". Теперь при запуске проекта на отладку IIS будет загружаться автоматически. В начале очередного сеанса отладки не помешает убедиться, что сервис World Wide Web Publishing не был загружен именно как сервис (например, при перезагрузке системы).
Отладка расширения в режиме out-of-process
В этом режиме DLL загружается процессом dllhost.exe . Процесс отладки для него ничем принципиально не отличается от предыдущего случая. Помните только, что метод подключения к процессу с помощью DebugBreak не будет работать, так как исключение EXCEPTION_BREAKPOINT будет перехвачено внутри dllhost.exe .
В системе может быть несколько процессов с именем dllhost.exe . Необходимо выяснить, какой из них загружает DLL-расширения. Сделать это можно различными способами. Один из возможных вариантов – вставить в саму DLL код, сообщающий идентификатор процесса, в который она загружена. Например:
Чтобы импортировать приложение в решение Visual Studio
В диалоговом окне Открыть проект выберите Все файлы проекта, если они еще не выбраны, в раскрывающемся списке рядом с полем Имя файла.
Перейдите к EXE-файлу, выберите его и щелкните Открыть.
Файл появится как новый проект в текущем решении.
Выберите новый файл и запустите отладку приложения, выбрав команду выполнения, например Начать отладку в меню Отладка.
Библиотека DLL (библиотека динамической компоновки) — это библиотека, содержащая код и данные, которые могут использоваться несколькими приложениями. Visual Studio можно использовать для создания, сборки, настройки и отладки библиотек DLL.
Установка DebuggableAttribute C++
Чтобы отладчик мог присоединиться к библиотеке DLL C++, код C++ должен добавлять DebuggableAttribute .
Установка DebuggableAttribute
В обозревателе решений выберите проект DLL C++ и щелкните значок Свойства либо щелкните проект правой кнопкой мыши и выберите пункт Свойства.
В области Свойства в разделе Компоновщик > Отладка выберите Да (/ASSEMBLYDEBUG) для свойства Отлаживаемая сборка.
Дополнительные сведения см. в статье /ASSEMBLYDEBUG.
Создание библиотеки DLL
Создавать библиотеки DLL можно с помощью следующих шаблонов проектов Visual Studio.
Дополнительные сведения см. в разделе Методы отладки MFC.
Отладка библиотеки WCF аналогична отладке библиотеки классов. Дополнительные сведения см. в статье Элементы управления Windows Forms.
Обычно библиотека DLL вызывается из другого проекта. При отладке вызывающего проекта в зависимости от конфигурации библиотеки DLL можно выполнить шаг с заходом и отладить код библиотеки DLL.
Конфигурация отладки библиотеки DLL
При создании приложения на основе шаблона проекта Visual Studio Visual Studio автоматически создает требуемые параметры для конфигурации сборки отладки и выпуска. При необходимости эти параметры можно изменить. Дополнительные сведения см. в следующих статьях:
Создание EXE-проекта для существующего приложения
В Visual Studio последовательно выберите Файл > Открыть > Проект.
В диалоговом окне Открыть проект выберите Все файлы проекта, если они еще не выбраны, в раскрывающемся списке рядом с полем Имя файла.
Перейдите к EXE-файлу, выберите его и щелкните Открыть.
Файл появится в новом временном решении Visual Studio.
Запустите отладку приложения, выбрав команду выполнения, например Начать отладку в меню Отладка.
Использование окна "Интерпретация"
Окно Интерпретация можно использовать для вычисления функций или методов DLL во время разработки. Окно Интерпретация выполняет роль вызывающего приложения.
Окно Интерпретация можно использовать во время разработки с большинством типов проектов. Оно не поддерживается для SQL, веб-проектов или скриптов.
Например, чтобы протестировать метод с именем Test в классе Class1 , выполните следующие действия.
Откройте проект DLL, откройте окно Интерпретация, последовательно выбрав пункты Отладка > Окна > Интерпретация или нажав сочетание клавиш CTRL+ALT+I.
Предположим, что Test принимает один параметр int , вычислим Test с помощью окна Интерпретация :
Результат будет выведен в окне Интерпретация.
Можно продолжить отладку Test , установив в нем точку останова, а затем снова вычислив эту функцию.
Будет достигнута точка останова и можно будет пошагово пройти Test . После выполнения Test , отладчик вернется в режим разработки.
Отладка в смешанном режиме
Вы можете написать вызывающее приложение для библиотеки DLL в управляемом или машинном коде. Если собственное приложение вызывает управляемую библиотеку DLL и вы хотите выполнить отладку этих двух объектов, можно включить управляемые и машинные отладчики в свойствах проекта. Точный способ выполнения этой операции зависит от того, откуда будет начата отладка: из проекта DLL или из проекта вызывающего приложения. Дополнительные сведения см. в разделе Практическое руководство. Отладка в смешанном режиме.
Можно выполнить отладку собственной библиотеки DLL из управляемого вызывающего проекта. Дополнительные сведения см. в статье об отладке управляемого и машинного кода.
Одним из способов отладки проекта библиотеки DLL является указание вызывающего приложения в свойствах проекта библиотеки DLL. Затем можно запускать отладку из самого проекта DLL. Чтобы этот метод работал, приложение должно вызвать одну и ту же библиотеку DLL в том расположении, которое вы настроили. Если приложение находит и загружает другую версию библиотеки DLL, эта версия не будет содержать точки останова. Другие методы отладки библиотек DLL см. в разделе Отладка проектов DLL.
Если управляемое приложение вызывает собственную библиотеку DLL или ваше собственное приложение вызывает управляемую библиотеку DLL, можно выполнить отладку библиотеки DLL и вызывающего приложения. Дополнительные сведения см. в разделе Практическое руководство. Отладка в смешанном режиме.
Собственные и управляемые DLL-проекты имеют разные параметры для указания вызывающих приложений.
Указание вызывающего приложения в собственном проекте DLL
Выберите проект C++ DLL в обозревателе решений. Щелкните значок Свойства, нажмите сочетание клавиш ALT+ВВОД или щелкните проект правой кнопкой мыши и выберите элемент Свойства.
Выберите Свойства конфигурации > Отладка.
В списке Запускаемый отладчик выберите Локальный отладчик Windows или Удаленный отладчик Windows.
В поле Команда или Удаленная команда добавьте полный путь и имя файла вызывающего приложения, например EXE-файл.
Добавьте необходимые аргументы программы в поле Аргументы команды.
Откройте вкладку "Отладка" и выберите пункт Открыть пользовательский интерфейс профилей запуска отладки.
В диалоговом окне "Профили запуска" щелкните значок Создать новый профиль и выберите Исполняемый файл.
В новом профиле в разделе Исполняемый файл перейдите к расположению исполняемого файла ( .exe) и выберите его.
В диалоговом окне "Профили запуска" найдите и запишите имя профиля по умолчанию, а затем выберите его и удалите.
Присвойте новому профилю имя профиля по умолчанию.
Чтобы получить такой же результат, можно также вручную изменить файл launchSettings.json. Необходимо, чтобы первый профиль в файле launchSettings.json соответствовал имени библиотеки классов и он был первым указан в файле.
Задание расположений файлов DLL C/C++
Для отладки внешней библиотеки DLL вызывающий проект должен находить библиотеку DLL, ее PDB-файл и любые другие файлы, необходимые библиотеке DLL. Вы можете создать пользовательскую задачу сборки, чтобы скопировать эти файлы в выходную папку \Debug, или скопировать файлы вручную.
Для проектов C/C++ можно задать расположения файлов заголовков и LIBD-файла на страницах свойств проекта, а не копировать их в выходную папку.
Задание расположений файла заголовка C/C и LIB-файла
В обозревателе решений выберите проект DLL C/C++ и щелкните значок Свойства либо щелкните проект правой кнопкой мыши и выберите пункт Свойства.
В верхней части области Свойства в разделе Конфигурация выберите Все конфигурации.
В разделе C/C++ > Общие > Дополнительные включаемые каталоги укажите папку с файлами заголовков.
В разделе Компоновщик > Общие > Дополнительные каталоги библиотек укажите папку с LIB-файлами.
В разделе Компоновщик > Ввод > Дополнительные зависимости укажите полный путь и имя файла для LIB-файлов.
Дополнительные сведения о параметрах проекта C++ см. в статье Справочник C++ по страницам свойств проекта Windows.
Указание вызывающего приложения в управляемом проекте DLL
Убедитесь, что в поле Настройка в верхней части окна задано значение Отладка.
В разделе Запустить действие
Добавьте необходимые аргументы командной строки в поле Аргументы командной строки или Аргументы приложения.
Используйте Файл > Сохранить выбранные элементы или CTRL+S, чтобы сохранить изменения.
Отладка библиотека DLL
Библиотеку DLL нельзя запускать напрямую. Ее должно вызывать приложение, обычно это EXE-файл. Дополнительные сведения см. в статье Проекты Visual Studio — C++.
Чтобы отладить библиотеку DLL, можно начать отладку из вызывающего приложения или выполнить отладку из проекта DLL, указав вызывающее приложение. Можно также использовать окно "Интерпретация" отладчика для вычисления функций или методов DLL во время разработки без использования вызывающего приложения.
Дополнительные сведения см. в статье Первое знакомство с отладчиком.
Создание EXE-проекта для существующего приложения
В Visual Studio последовательно выберите Файл > Открыть > Проект.
В диалоговом окне Открыть проект выберите Все файлы проекта, если они еще не выбраны, в раскрывающемся списке рядом с полем Имя файла.
Перейдите к EXE-файлу, выберите его и щелкните Открыть.
Файл появится в новом временном решении Visual Studio.
Запустите отладку приложения, выбрав команду выполнения, например Начать отладку в меню Отладка.
Запуск отладки из вызывающего приложения
Вызывать библиотеку DLL могут следующие виды приложений.
- Приложение из проекта Visual Studio в том же или другом решении из библиотеки DLL.
- Существующее приложение, которое уже развернуто и работает на тестовом или рабочем компьютере.
- Программа расположена в Интернете и доступна по URL–адресу.
- Веб-приложение с веб-страницей, которая внедряет библиотеку DLL.
Выполнить отладку библиотеки DLL из вызывающего приложения можно следующими способами.
Откройте проект для вызывающего приложения и начните отладку, выбрав Отладка > Начать отладку или нажав клавишу F5.
Выполните присоединение к приложению, которое уже развернуто и работает на тестовом или рабочем компьютере. Используйте этот вариант для библиотек DLL на веб-сайтах или в веб-приложениях. Дополнительные сведения см. в разделе Практическое руководство. Присоединение к выполняемому процессу.
Перед запуском отладки этого вызывающего приложения нужно установить точку останова в DLL. См. статью Использование точек останова. При попадании в точку останова DLL можно пошагово проходить по коду, наблюдая действия в каждой строке. Дополнительные сведения см. в статье Навигация по коду с помощью отладчика.
Во время отладки в окне Модули можно проверить библиотеки DLL и EXE-файлы, загружаемые приложением. Чтобы открыть окно Модули, во время отладки выберите Отладка > Окна > Модули. Дополнительные сведения см. в разделе Практическое руководство. использовать окно модулей.
Сборка отладочной версии
Перед началом отладки обязательно создайте отладочную версию библиотеки DLL. Для отладки библиотеки DLL вызывающее приложение должно находить PDB-файл и любые другие файлы, необходимые библиотеке DLL.
Вы можете создать пользовательскую задачу сборки, чтобы скопировать эти файлы DLL в выходную папку \Debug, или скопировать файлы вручную.
Обязательно вызовите библиотеку DLL в правильном расположении. Это может показаться очевидным, но, если вызывающее приложение находит и загружает другую копию библиотеки DLL, отладчик никогда не достигнет заданных точек останова.
Читайте также: