Невозможно отладить исполняемый файл C ++ («Точка останова в настоящее время не будет достигнута») - PullRequest
0 голосов
/ 15 марта 2020

У меня есть исполняемый файл теста, связывающий библиотеку C ++ stati c в Visual Studio 2019 (16.4.2) на Windows 10. Когда я запускаю отладчик, все точки останова в тестовом cilent и коде библиотеки кажутся пустыми с всплывающая подсказка о том, что PDB не может быть найдена:

"В настоящий момент точка останова не будет нажата. Для этого документа не было загружено никаких символов."

После запуска отладчик, который вручную просматривает исполняемый файл PDB по ссылке на экране «No Symbols Loaded», также завершается с сообщением:

«В этой папке не найден соответствующий файл символов»

Это странно, поскольку файл существует, он актуален, и браузер PDB позволяет мне выбрать его. Это правильный PDB (указанный в Linker> Настройки отладки), а не намного меньший размер промежуточной папки.

Я собираю Debug | x86 и получаю ту же проблему в Debug | x64. Мой тестовый исполняемый файл использует Google Test версии 1.8.1.2.

Я попытался удалить все промежуточные файлы и выходные данные, закрыл / снова открыл IDE и перестроил решение, но это не помогло. PDB не перезаписывается тем же именем из какого-то другого проекта.

У меня есть следующие настройки проекта:

Испытательный исполняемый файл И stati c библиотека:

C / C ++> Общие сведения: формат отладочной информации = База данных программы (/Zi).

Исполняемый файл теста:

Linker> Отладка: создание информации отладки = Создание информации отладки (/ DEBUG)

Linker> Отладка: создание файла базы данных программы = $ (OutDir) $ (TargetName) .pdb

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

Я попытался создать новый исполняемый файл теста "Hello world" и могу без проблем отлаживать его.

1 Ответ

1 голос
/ 15 марта 2020

После долгих проб и ошибок я столкнулся с проблемой.

Проект с исполняемой целью (EXE или DLL) генерирует ДВА PDB:

  1. Промежуточное звено PDB: только для кода проекта, записанного в промежуточную папку

Указано в Свойства конфигурации> C / C ++: Имя файла базы данных программы

Выходная PDB: для всего исполняемого файла, включая статически связанные библиотеки, записанные в выходную папку

Указано в Свойства конфигурации> Линкер> Отладка: Создать файл базы данных программы

Проблема была вызвана переопределением имени промежуточного PDB исполняемого файла, которое изменило его значение по умолчанию на имя проекта (также называемое целью). Выходная PDB (намного больше и записанная в выходную папку) имеет то же имя файла.

Промежуточное переопределение имени PDB было унаследовано от страниц общих свойств, используемых совместно с проектом библиотеки stati c. Последний нуждается в этом переопределении, потому что он распространяется со своей PDB. Сохранение имени по умолчанию (vc142.pdb) может привести к конфликту с другими PDB с именем по умолчанию в дальнейшем.

Исправлено то, что восстанавливалось имя промежуточной PDB по умолчанию в исполняемом проекте:

  1. Открыть свойства проекта.
  2. Развернуть Свойства конфигурации> C / C ++
  3. Восстановить значение имени файла базы данных программы: выберите <наследовать от проекта или родительского по умолчанию> из раскрывающегося значения. Нажмите Apply.

. Это значение будет установлено на значение, подобное $ (IntDir) vc $ (PlatformToolsetVersion) .pdb .

Cliffs: Any В проекте DLL / EXE следует избегать указания одного и того же имени файла PDB для его промежуточного и конечного (выходного) PDB.

Компоновщик мог бы быть более полезным в этом отношении, возможно, путем выдачи предупреждения о времени соединения в событие пользовательского конфликта, такого как этот.

...