Как отладить ссылочную DLL (имея pdb)

132

У меня есть два решения в моей рабочей области, скажем, A и B.

Решение A - более старый проект, который я закончил писать некоторое время назад. В решении B мне нужно использовать некоторые классы из решения A. Для этого я добавляю ссылку на dll одного из проектов в решении A.

Проблема в том, когда я пытаюсь отладить. Я хочу иметь возможность войти в код А. Visual Studio не может загрузить код для этих классов («Нет исходного кода, доступного для текущего местоположения.»), И я могу только просматривать разборку, которая бесполезна.

Единственный известный мне способ отладки классов из решения A - это запустить решение B, отсоединить все процессы (в пункте меню «Отладка») и подключить процесс из решения A.

Тем не менее, это очень неудобно, и я могу только отладить A ИЛИ B сразу.

Есть ли способ разрешить войти в код ссылочных dll (для которых у меня есть исходный код)?


Решение: Моя ошибка заключалась в том, что я думал, что проект может быть только частью одного решения. Фактически, проект может быть частью любого количества решений.
Когда вам нужно сослаться на старый проект, вы должны просто добавить проект в решение. Это можно сделать, щелкнув правой кнопкой мыши новое решение в обозревателе решений> Добавить> Существующий проект.
Затем вы сможете добавить ссылку на проект. Как писали другие, вам, вероятно, следует полностью избегать использования dll-ссылок на ваш собственный код (или другой код, который вам может потребоваться изменить и отладить).

Очень хорошая ссылка на то, как должны быть разработаны решения, может быть найдена в MSDN .

Elad
источник
Эта ссылка MSDN является обязательной для чтения .net для разработчиков (независимо от того, какой элемент управления они используют). Я удивлен, что раньше этого не видел. Спасибо!
Пэт
Новички, если вы уже знаете о ссылках на проект, и это не вариант (например, вам нужно отладить пакет NuGet), затем проигнорируйте принятый ответ и перейдите прямо к этому: stackoverflow.com/a/26029208/398630
BrainSlugs83

Ответы:

113

Если у вас есть ссылка на проект , он должен работать немедленно.

Если это ссылка на файл (dll), необходимо, чтобы символы отладки (файл "pdb") находились в той же папке, что и dll. Убедитесь, что ваши проекты генерируют символы отладки (свойства проекта => Build => Advanced => Output / Debug Info = full); и если вы скопировали dll, поместите в него pdb.

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

Самый простой вариант - использовать ссылки на проекты!

Марк Гравелл
источник
3
К сожалению, я думаю, что невозможно добавить ссылку на проект в проект из другого решения (поправьте меня, если я ошибаюсь!).
Elad
7
@ Рад, что я только что сделал это. Сначала добавьте «существующий проект» к решению. Затем добавьте ссылку на проект, нажав «Добавить ссылку на проект». Вы можете установить точки останова в существующих файлах проекта. Это хорошо, потому что файлы не копируются.
user420667
3
У меня есть проект DLL в качестве ссылки на проект, но точки останова внутри игнорируются.
Славян
1
Сегодня я действительно смог отладить сборку (release-), которая была добавлена ​​как ссылка на файл. Хорошо для меня, но как это случилось? MSVC2010, C #, (ASP) .NET 4.0, указанная сборка существует как debug + release (но только файл релиза добавлен в проект). Очень хотел бы уточнить это.
Tobias81 12.12.14
1
Для меня это работало один день, но затем следующий день не работал (имея файлы DLL и PDB). Нажав кнопку «Очистить кэш символов» в меню «Инструменты»> «Параметры»> «Отладка»> «Символы», это удалось исправить.
Павел
45

Я была такая же проблема. Он то, что я нашел:

1) убедитесь, что все проекты используют одну и ту же платформу (это очень важно!)

2) в меню «Инструменты / Параметры»> «Отладка»> «Общие» убедитесь, что «Включить только мой код (только управляемый)» НЕ отмечено

3) в меню Инструменты / Параметры> Отладка> Символы очистите все кэшированные символы, снимите флажок и удалите все расположения папок в списке «Расположение файлов символов (.pdb)», кроме стандартного «Серверы символов Microsoft», но все же снимите его. Также удалите все статические пути в текстовом поле «Кэшировать символы в этом каталоге». Нажмите кнопку «Очистить кэш символов». Наконец, убедитесь, что установлен переключатель «Только указанные модули».

4) в меню Build / Configuration Manager для всех проектов убедитесь, что конфигурация находится в режиме отладки.

scott_f
источник
3
Моя проблема заключалась в том, что в двух моих проектах использовались разные .Net Framework: 4.0 и 4.5. Tx!
user627283
1) и 4) имеют решающее значение. Не забудьте собрать в режиме отладки и использовать ту же платформу.
scott_f
12

Еще один момент, который нужно иметь в виду, убедитесь, что указанные библиотеки не установлены в GAC. После тестирования я установил свои библиотеки в GAC для тестирования на уровне системы. Позже, когда мне снова пришлось отлаживать свой код, я не мог перейти к ссылочным сборкам, пока не удалил их из GAC.

KevinHou
источник
2
СПАСИБО! Это была моя проблема. Я не могу поверить, что я не понял этого: - / Я думал, что установка ссылки на проект каким-то образом переопределит то, что было установлено в GAC.
SnookerC
Абсолютно! Это очень хороший момент. Даже если у вас та же версия .NET Framework, если у вас есть код в GAC, при попытке отладки он не достигнет точки останова, если файл .PDB в GAC отличается от файла в папке вашего проекта. Решением для этого является Un-GAC DLL, сборка, а затем повторная сборка GAC.
DigiOz Multimedia
7

Шаг 1: Зайдите в Инструменты -> Опция -> Отладка

Шаг 2: снимите флажок Включить только мой код

Шаг 3: Снимите флажок Требовать, чтобы исходный файл точно совпадал с исходной версией

Шаг 4: Снимите флажок Шаг над свойствами и операторами

Ариндам Дхар
источник
3

У меня были *.pdbфайлы в той же папке и я использовал параметры от Ариндама , но это все равно не работало. Оказывается, мне нужно было включить « Включить отладку собственного кода», которую можно найти в разделе « Свойства проекта»> «Отладка» .

Роальд
источник
1
эта информация должна быть включена в принятый ответ. это то, что я специально искал. Спасибо, что поделился! +1
Хериберто Луго
2

Если вы хотите установить точку останова в исходном коде DLL, на которую указывает ссылка, сначала убедитесь, что у вас есть доступный для нее файл pdb. Затем вы можете просто открыть соответствующий файл исходного кода и установить там точку останова. Исходный файл не обязательно должен быть частью вашего решения. Как объяснено в разделе Как установить точку останова в ссылочном коде в Visual Studio?

Вы можете просмотреть свои точки останова в окне точек останова, доступном через Debug -> Windows -> Breakpoints.

Этот подход имеет то преимущество, что вам не нужно добавлять существующий проект в ваше решение только для целей отладки, поскольку его исключение сэкономило мне много времени на сборку. Очевидно, что создание решения с использованием только одного проекта намного быстрее, чем создание решения с большим количеством проектов.

Карл ин 'т Вельд
источник
1
Это работает, только если внешний файл, в который вы поместили точку останова, совпадает с точным путем в PDB. (Например, работает, только если вы создали DLL на своей машине.)
Джош М.
2

Убедитесь, что ваша DLL не зарегистрирована в GAC. Visual Studio будет использовать версию из GAC и, вероятно, не будет содержать отладочной информации.

Гильермо Пранди
источник
1

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

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

Чтобы отлаживать и устанавливать точки останова, я устанавливаю точку останова в источнике приложения-потребителя, где я вызываю метод или конструктор из сборки, а затем выполняю INTO (F11) вызов метода / конструктора.

Отладчик загрузит исходный файл сборки в VS, и в этой точке можно установить новые точки останова внутри сборки.

Это непросто, но работает, если вы не хотите включать ссылку на новый проект и вместо этого просто хотите ссылаться на общую сборку.

Джефф ЛаФэй
источник
0

Это должно работать. Раньше я отлаживал файл .exe и dll одновременно! Я предлагаю: 1) включить путь к dll в ваш проект B, 2) затем скомпилировать в отладке вашего проекта A 3) контролировать, чтобы путь указывал на файлы dll и de pdb .... 4) После этого вы начните отладку проекта B, и если все в порядке, вы сможете отлаживать оба проекта!

Матье
источник
0

Самый простой способ, который я нашел с помощью VisualStudio 2019 для отладки внешней библиотеки, на которую вы ссылаетесь в NuGet, - это выполнить следующие шаги:

  1. Инструменты> Параметры> Отладка> Общие> Снимите флажок "Включить только мой код"

  2. Перейдите в Обозреватель сборок> Открыть из кэша пакетов NuGet Элемент списка

  3. Введите имя пакета NuGet, который вы хотите отладить, в поле поиска и нажмите «ОК». введите описание изображения здесь

  4. В проводнике сборки щелкните правой кнопкой мыши импортированную сборку и выберите «Создать Pdb». введите описание изображения здесь

  5. Выберите настраиваемый путь, в котором вы хотите сохранить файл .PDB, и структуру, для которой вы хотите, чтобы он был сгенерирован.

    введите описание изображения здесь

  6. Скопируйте файл .PDB из созданной папки в папку отладки, и теперь вы можете установить точки останова в коде библиотеки этой сборки.

magicode118
источник
Звучит хорошо, за исключением того, что я не могу найти проводника сборок; разве это не часть Resharper?
Роберт Масса,