PDB файлы в папках bin\debug Visual Studio

У меня есть решение Visual Studio (2008), состоящее из нескольких проектов, не все в одном пространстве имен. Когда я создаю решение, все файлы DLL, используемые проектом верхнего уровня, TopProject, копируются в папку TopProject\bin\debug. Однако соответствующие файлы .pdb копируются только для некоторых других проектов. Это неприятно, например, при использовании NDepend.

Как Visual Studio решает, какие файлы .pdb скопировать в папки bin\debug более высокого уровня? Как я могу заставить Visual Studio копировать и другие?


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

Ответ 1

От MSDN:

Файл базы данных программы (PDB) содержит отладка и состояние проекта информация, которая позволяет постепенно связывание конфигурации отладки ваша программа. Файл PDB создан когда вы компилируете программу C/C++ с /ZI или /Zi или Visual Базовая/С#/JScript.NET программа с /Отладки.

Таким образом, похоже, что "проблема" здесь (из-за отсутствия лучшего слова) заключается в том, что некоторые из ваших DLL создаются в режиме отладки (и, следовательно, испускают файлы PDB), а некоторые - в режиме выпуска (следовательно, не испускают PDB). файлы). Если это так, то это должно быть легко исправить - зайдите в каждый проект и обновите его настройки сборки. Это будет сценарий по умолчанию, если вы еще не настроили параметры командной строки.

Тем не менее, это будет сложнее, если это не так. Может быть, вы все в режиме выпуска или отладки. Теперь вам нужно посмотреть параметры компиляции командной строки (указанные в свойствах проекта) для каждого проекта. Измените их на /debug соответственно, если вы хотите отладчик, или удалите его, если вы этого не сделаете.

Изменить в ответ на Изменить

Да, файлы DLL "знают", что у них есть файлы PDB, и у них есть пути к ним, но это не слишком много значит. Копирование только DLL файлов в заданный каталог, как уже упоминалось, не решит эту проблему. Вам также нужны файлы PDB.

Копирование отдельных файлов в Windows, за исключением определенных "пакетных" файлов -type (я не знаю, как это называется в Microsoft, но понятие "полные пакеты HTML") не копирует связанные файлы. Файлы DLL не собираются "в комплекте", поэтому при копировании их файл PDB остается позади.

Я бы сказал, что единственный ответ, который у вас будет, - это обновить ваш процесс доставки DLL файлов в эти центральные местоположения и включить файлы PDB... Хотя я бы хотел оказаться ошибочным в этом!

Ответ 2

Когда вы чистите раствор, убедитесь, что он действительно очищен.

Я видел, как Visual Studio оставляла файлы в каталогах bin\debug даже после очистки. Удалите каталог bin\debug во всех ваших проектах и перестройте.

Ответ 3

Как говорилось в других сообщениях, у вас может быть проблема с компилятором/повреждением.

Но, как сказал Уилл, если файлы PDB создаются, но не отображаются там, где вы хотите, создайте шаг после сборки. Вот шаг после сборки, который я определяю для каждого проекта в моем решении. Он гарантирует, что все выходные файлы скопированы в общий каталог.

Если файл вашего проекта находится в \SolutionDir\ProjDir, то в первой строке шага после сборки будут скопированы выходные файлы в \Solution\Bin\Release или\Solution\Bin\Debug. Вторая строка копирует файл PDB, если это отладочная сборка. Я не копирую файл PDB для сборки выпуска.

Таким образом, \SolutionDir\Bin теперь содержит все ваши выходные файлы в одном месте.

xcopy /r /y $(TargetPath) $(ProjectDir)..\$(OutDir)
if $(ConfigurationName) == Debug xcopy /r /y $(TargetDir)$(TargetName).pdb $(ProjectDir)..\$(OutDir)

Ответ 4

Прежде всего, никогда не предполагайте ничего. Очистите решение, перестройте его в режиме отладки и проверьте, созданы ли все файлы PDB. Если нет, то это ваша проблема.

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

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


Изменить в ответ на изменение:

Если вы просто копируете вещи вручную, скопируйте и PDF файлы вручную. Я полагаю, что файлы DLL не должны ничего знать о файлах PDB. Просто вставьте их в каталог назначения и идите выпить чашку кофе. Расслабьтесь.