it-swarm.com.ru

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

Мой вопрос касается Visual Studio 2008, хотя я полагаю, что это должно быть то же самое в VS2005 

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

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

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

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

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

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


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

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

107
Elad

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

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

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

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

92
Marc Gravell

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

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

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

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

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

37
scott_f

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

9
KevinHou

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

Вы можете просмотреть свои контрольные точки через окно контрольных точек, доступное через «Отладка» -> Windows -> контрольные точки.

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

2
Carl in 't Veld

Шаг 1: Перейти к Сервис -> Опция -> Отладка  

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

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

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

2
Arindam Dhar

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

0
Roald

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

0
Matthieu

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

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

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

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

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

0
jlafay