Ответ 1
Оказывается, это связано с включенным охватом кода.
Отключение этого исправления устраняет проблему.
Вы можете узнать, как отключить покрытие кода, указав ниже ссылку
У меня есть класс, который выглядит так:
public class MyService
{
private MyService(){}
public static string GetStuff()
{
var stuffDid = new MyService();
return stuffDid.DoStuff();
}
private string DoStuff()
{
//do stuff
}
//other private helpers
}
Очевидно, что я оставил много, но это общая оболочка.
Теперь у меня есть unit test:
[Test]
public void MyTest()
{
var results = MyService.GetStuff();
}
Я установил точки останова на мой unit test, и я вижу, что results
имеет данные. Тем не менее, я устанавливал точки останова буквально на всем протяжении MyService
, и ничто не пострадало, если я не надену их на фигурные скобки. Который я не могу понять, так как results
имеет данные, мои инструкции return
в MyService
должны получать удар, правильно?
Я что-то упустил? Я полностью забыл о самых элементарных правилах чего-то? Почему ничего в MyService
не попадает? И если я вручную перейду на него с помощью F11
, он просто переплывет и даже не пройдет через каждую строку, как я ожидал. Также, когда я наступаю вручную, я, как правило, нажимаю на определенный код после того, как я должен был ударить его изначально. И любые операторы switch
кажутся по умолчанию независимо от того, что первый вариант, даже если значение переключаемого значения должно ЧИСТИТЬ ввести другой case
.
Я даже попытался сделать конструктор MyService
public
и убрать все методы static
, и он все равно не работает.
Изменить:
Мои тесты и код "Core" находятся в одном решении, но разные проекты (Test
и Core
, соответственно). Другие тесты не имеют проблем с точками разрыва в Core
, только это на конкретном тесте (единственный тест, который тестирует MyService
.
Изменить 2:
Я удалил файлы PDB и очистил решение. Все еще ничего.
Оказывается, это связано с включенным охватом кода.
Отключение этого исправления устраняет проблему.
Вы можете узнать, как отключить покрытие кода, указав ниже ссылку
Некоторые идеи.
Debugger.Break()
в свой код вместо точки останова
в VSВы уже корректировали дату на своем компьютере? Это действительно может испортить процесс сборки. Если это так, удалите все папки obj/bin вручную и перекомпилируйте.
Возможно, вы только отлаживаете 1 проект не как Test
, так и Core
Вы можете установить VS для одновременного отладки нескольких проектов, вы можете сделать это с помощью right-click your solution > Properties > Common Properties > StartUp Project
Здесь вы можете установить "Несколько проектов запуска",
Просто установите для начала Core
и Test
. Это может решить вашу проблему.
У меня есть очень специфический сценарий, который привел к очевидной проблеме "Точка прерывания не попадает".
Поскольку никаких других ответов здесь не упоминалось, я добавлю, что я помогу кому-то, у кого была такая же проблема.
Решение, в моем случае, было глупо, и с таким количеством LINQ, как я использую, я должен был понять это раньше. При запуске метода, который возвращает IEnumerable, где операторы return, содержащиеся внутри, фактически являются операторами yield return
, тогда этот метод не будет выполнен, когда вы его вызываете.
Он будет выполняться, когда вы вызываете другой метод из этого объекта IEnumerable, например ToList()
или Count()
. Только тогда будет выполняться метод и достигнута точка останова.
Просто убедитесь, что вы создали сборку с помощью отладчиков.
Этот параметр должен быть заполнен "полным":
Щелкните правой кнопкой мыши ваш проект, содержащий ваш файл кода, при этом точки останова не попадут. Выберите "Свойства".
После того, как свойства проекта были открыты, выберите вкладку "Построить". Следите за "Advanced..." - Buttom внизу страницы вкладки. (В пределах "Выходной" -группы ")
Нажмите эту кнопку и выберите "full" для свойства "Debug info". Это должно быть причиной того, что точки останова не пострадали. Visual studio использует символы, сохраненные в pdb файлах, чтобы найти точное положение точки останова. Если эти файлы не созданы, контрольные точки не попадают. Возможно, вы отключили создание этих файлов, чтобы убрать структуру вашего проекта. Это была ситуация, когда я узнал, что мне нужны эти файлы.
Недавно у меня была такая же проблема, и я ударил головой о стену.
Ответ оказался довольно глупым: каким-то образом мой тестовый проект вышел из синхронизации с главным проектом библиотеки. Я создавал отладочные версии теста и библиотеки, но тестовый проект скопировал библиотеку из папки bin/Release
. Я просто воссоздал ссылку на проект, и все было исправлено.
P.S. Это было даже criazier: отладчик вошел в библиотечную функцию, но как-то пропустил одну строку в середине.
Вам нужно сделать статический статический файл.
private static string DoStuff()
{
//do stuff
}
Ваш код указывает на "сервис", который может выполняться как отдельный процесс. Если в этом случае вы можете загрузить свою сборку, точки останова будут сплошными красными кругами, а другая копия сборки, работающая в отдельном процессе, фактически обрабатывает запросы.
Это звучит так, как файлы pdb не обновляются в тестовой изолированной программной среде.
1) Убедитесь, что вы находитесь в режиме отладки.
2) Можете ли вы попытаться включить элемент развертывания для файлов pdb явно?
3) Если сбой 1 и 2, я обнаружил, что иногда визуальная студия требует перезагрузки:)
Очистите решение и перестройте его, а также выполните проект запуска.
Не могли бы вы быстро взглянуть на BUILD > Configuration Manager, чтобы убедиться, что настроены параметры конфигурации. Если это разработка, вам, возможно, придется отрегулировать параметры проекта → параметр перехода по клику → изменить информацию об отладке на "полный" в [вкладке вывода].
вы также можете выполнить второй шаг, даже если это не режим разработки
У меня это случилось в 1 проекте из 25, которые были в одном решении. Другие проекты выполняли контрольные точки, но этого не делали. Я удалил проект из решения (удалить, а не выгружать), который сломал все ссылки на него, а затем добавил его обратно в решение и сработает!
Если это не сработает, вы можете захотеть воссоздать проблемный проект с нуля и добавить этот новый проект в решение.
Лучшее объяснение, которое у меня есть для того, почему это отработало, кроме чистой удачи, заключается в том, что мы много лет перенаправляли проекты из одной версии VS в другую много раз, и, возможно, одна из этих миграций вызвала эту проблему.
Вы можете попробовать добавить метод Thread.Sleep(5000)
в GetStuff
и использовать Attach to Process
Visual Studio > Инструменты > Присоединить к процессу и посмотреть, попадают ли точки останова ниже этой строки.
Если он находится в режиме деблокирования, переключитесь в режим отладки.
По опыту я знаю, что Visual Studio не имеет четкого метода отладки служб, особенно служб Windows. Попробуйте добавить некоторый код в GetStuff для печати в текстовый файл, таким образом вы, по крайней мере, знаете, что код попадает. При создании сервисов я часто отказываюсь от этого метода для тестирования.
У меня возникла аналогичная проблема. Оказалось, что для меня это был плохой переход от VS2010 к VS2012 с файлом *.testrunconfig
. Я удалил старый и установил новый, чтобы решить проблему.
VS ведет себя точно так, как вы описали (не ударяя точки останова, попав в код, который не ожидаете попасть при переходе), когда он использует файл .pdb, который был сгенерирован с использованием исходного кода, каким-то образом отличающимся от кода, который используется при отладке. Я не могу гарантировать, что это ваш случай, но я наблюдал такое поведение много раз, когда мне нужно было войти в код, который был предоставлен в виде готовой библиотеки, которая была сгенерирована против старого/другого кода с одинаковыми именами файлов/символы.
Возможно, ваш проект Test
ссылается на более старый Core
двоичный файл, а не на проект Core
(исходный код)?
Попробуйте повторно добавить ссылку в свой тестовый проект:
Перейдите в проект Test
и удалите ссылку на проект Core
.
Теперь выберите папку "Ссылки" и щелкните ее правой кнопкой мыши и выберите пункт меню, чтобы добавить новую ссылку. Когда в диалоговом окне "Менеджер ссылок" убедитесь, что вы выбрали Solution
, а затем Projects
слева. Затем в середине диалога Reference Manager выберите (проверьте) проект Core
.
Повторите попытку отладки и посмотрите, помогает ли это.
Еще несколько вещей, которые нужно попробовать:
Проверьте, соответствуют ли загруженные символы отладочному исполняемому файлу:
Откройте командную строку VS и cd в каталог, в котором выполняется отладка исполняемого файла.
Затем выполните dumpbin /PDBPATH:VERBOSE MyServiceExecutable.exe
и сканируйте выход для "несоответствия возраста PDB" (Ref: http://msdn.microsoft.com/en-us/library/44wx0fef.aspx)
Не уверен в VS 2012, но более старые версии VS имели ошибку, в которой будет отображаться неправильный исходный файл, при условии, что у вас есть два исходных файла в вашем проекте, которые имеют одинаковый имя, даже если они находятся в разных папках. Поэтому, если ваш проект содержит другой исходный файл с тем же именем, посмотрите, помогает ли переименование одного из них. (Обновление: кажется, VS 2012 тоже затронуто.)
Глупый мне проект Test не был построен:
Это довольно неясное:
Убедитесь, что у вас нет двух виртуальных каталогов с различными пулами приложений, указывающих на то же физическое местоположение на вашем жестком диске. Во время разработки это то, что иногда может случиться для тестирования или по ошибке.
Я не на 100% разбираюсь в технических особенностях, но у меня было два AppPools и два виртуальных каталога, и ни одна точка останова не попала, потому что я предполагаю, что физический путь каким-то образом сопоставлен в IIS/Visual Studio с другим приложением, а не с одним который фактически выполнялся.
У меня такая же проблема. Возможно, мое решение поможет вам решить вашу проблему. Как раз в разделе "Присоединить к процессу" для опции "Прикрепить к" выберите значение "Автоматический: родной код". С наилучшими пожеланиями.
Сначала попробуйте перестроить свой проект, щелкнув правой кнопкой мыши проект > Rebuild. Если это не сработает, попробуйте очистить проект (щелкните правой кнопкой мыши по проекту > очистить)
Если это не помогло, проверьте это:
Right mouse click your project
select [Properties]
select the [Build] tab
make sure [Define DEBUG constant] and [Define TRACE constant] are checked
Click the [Advanced] button at the bottom of the Build tabpage
Make sure that [Debug Info:] is set to [full]
Click [OK] and rebuild the project ;-)
Надеюсь, что это сработает для вас! (шаг 6 генерирует файлы .pdb, это символы отладки)
Чтобы отлаживать шаг за шагом, вы должны сделать две вещи. Сначала вы должны установить точку останова, затем вы должны приложить отладчик к процессу, выполняющему ваш код. Если вы используете IIS Express и у вас есть 64-разрядная машина, вам необходимо прикрепить iisexpress.exe, который запускает ваш код. Если вы нажмете CTRL + ALT + P, вы попадете в окно подключения к процессу. После прикрепления точка останова должна быть удалена, если код соответствует.
В модульных тестах я не попадал в точки останова, и понял, что я выполнял тест, а не отлаживал тест. В верхней части Test Explorer находятся опции "Запустить все", "Запустить сбой", "Запустить прохождение" и т.д. Когда вы запустите тест, точки останова не будут удалены. Чтобы отладить тест, в Test Explorer щелкните правой кнопкой мыши тест или группу тестов и выберите "Отладка выбранных тестов".