Подтвердить что ты не робот

VS2012 Точки останова не попадают

У меня есть класс, который выглядит так:

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 и очистил решение. Все еще ничего.

4b9b3361

Ответ 1

Оказывается, это связано с включенным охватом кода.

Отключение этого исправления устраняет проблему.

Вы можете узнать, как отключить покрытие кода, указав ниже ссылку

Отключить покрытие кода

Ответ 2

Некоторые идеи.

  • Удостоверьтесь, что это отладочная сборка, а не выпуск
  • Отключите оптимизацию в ваших свойствах проекта, если они находятся на
  • Попробуйте вставить Debugger.Break() в свой код вместо точки останова в VS
  • Убедитесь, что точки останова включены (панель инструментов Debug- > Windows- > Breakpoints), а символ точки останова должен быть сплошным.
  • Выполните свое приложение. Загрузить Debug- > Window- > Modules window. Проверьте сборку, чтобы увидеть, загружены ли символы. Он может дать соответствующее сообщение о статусе, если нет.

Вы уже корректировали дату на своем компьютере? Это действительно может испортить процесс сборки. Если это так, удалите все папки obj/bin вручную и перекомпилируйте.

Ответ 3

Возможно, вы только отлаживаете 1 проект не как Test, так и Core

Вы можете установить VS для одновременного отладки нескольких проектов, вы можете сделать это с помощью right-click your solution > Properties > Common Properties > StartUp Project

Здесь вы можете установить "Несколько проектов запуска", enter image description here

Просто установите для начала Core и Test. Это может решить вашу проблему.

Ответ 4

У меня есть очень специфический сценарий, который привел к очевидной проблеме "Точка прерывания не попадает".

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

Решение, в моем случае, было глупо, и с таким количеством LINQ, как я использую, я должен был понять это раньше. При запуске метода, который возвращает IEnumerable, где операторы return, содержащиеся внутри, фактически являются операторами yield return, тогда этот метод не будет выполнен, когда вы его вызываете.

Он будет выполняться, когда вы вызываете другой метод из этого объекта IEnumerable, например ToList() или Count(). Только тогда будет выполняться метод и достигнута точка останова.

Ответ 5

Просто убедитесь, что вы создали сборку с помощью отладчиков.

Этот параметр должен быть заполнен "полным":

Щелкните правой кнопкой мыши ваш проект, содержащий ваш файл кода, при этом точки останова не попадут. Выберите "Свойства".

После того, как свойства проекта были открыты, выберите вкладку "Построить". Следите за "Advanced..." - Buttom внизу страницы вкладки. (В пределах "Выходной" -группы ")

Нажмите эту кнопку и выберите "full" для свойства "Debug info". Это должно быть причиной того, что точки останова не пострадали. Visual studio использует символы, сохраненные в pdb файлах, чтобы найти точное положение точки останова. Если эти файлы не созданы, контрольные точки не попадают. Возможно, вы отключили создание этих файлов, чтобы убрать структуру вашего проекта. Это была ситуация, когда я узнал, что мне нужны эти файлы.

Ответ 6

Недавно у меня была такая же проблема, и я ударил головой о стену.

Ответ оказался довольно глупым: каким-то образом мой тестовый проект вышел из синхронизации с главным проектом библиотеки. Я создавал отладочные версии теста и библиотеки, но тестовый проект скопировал библиотеку из папки bin/Release. Я просто воссоздал ссылку на проект, и все было исправлено.

P.S. Это было даже criazier: отладчик вошел в библиотечную функцию, но как-то пропустил одну строку в середине.

Ответ 7

Вам нужно сделать статический статический файл.

private static string DoStuff()
{
    //do stuff
}

Ответ 8

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

  • проверьте диспетчер задач для возможных правонарушителей (процессы, которые могут размещать ваш сервис). Убейте их во время отладки, чтобы подтвердить, что вызовы не выполняются.
  • Попробуйте использовать Debugger.Break();
  • Создайте файл журнала отладки при загрузке вывода в журнал процесса ввода и имени сборки. Убедитесь, что ваш журнал является либо другим файлом каждый раз, чтобы избежать проблем с доступом к асинхронному доступу.

Ответ 9

Это звучит так, как файлы pdb не обновляются в тестовой изолированной программной среде.

1) Убедитесь, что вы находитесь в режиме отладки.

2) Можете ли вы попытаться включить элемент развертывания для файлов pdb явно?

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

3) Если сбой 1 и 2, я обнаружил, что иногда визуальная студия требует перезагрузки:)

Ответ 10

  • Очистите решение и перестройте его, а также выполните проект запуска.

  • Не могли бы вы быстро взглянуть на BUILD > Configuration Manager, чтобы убедиться, что настроены параметры конфигурации. Если это разработка, вам, возможно, придется отрегулировать параметры проекта → параметр перехода по клику → изменить информацию об отладке на "полный" в [вкладке вывода].

  • вы также можете выполнить второй шаг, даже если это не режим разработки

Ответ 11

У меня это случилось в 1 проекте из 25, которые были в одном решении. Другие проекты выполняли контрольные точки, но этого не делали. Я удалил проект из решения (удалить, а не выгружать), который сломал все ссылки на него, а затем добавил его обратно в решение и сработает!

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

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

Ответ 12

Вы можете попробовать добавить метод Thread.Sleep(5000) в GetStuff и использовать Attach to Process

Visual Studio > Инструменты > Присоединить к процессу и посмотреть, попадают ли точки останова ниже этой строки.

Ответ 13

Если он находится в режиме деблокирования, переключитесь в режим отладки.

Ответ 14

По опыту я знаю, что Visual Studio не имеет четкого метода отладки служб, особенно служб Windows. Попробуйте добавить некоторый код в GetStuff для печати в текстовый файл, таким образом вы, по крайней мере, знаете, что код попадает. При создании сервисов я часто отказываюсь от этого метода для тестирования.

Ответ 15

У меня возникла аналогичная проблема. Оказалось, что для меня это был плохой переход от VS2010 к VS2012 с файлом *.testrunconfig. Я удалил старый и установил новый, чтобы решить проблему.

Ответ 16

VS ведет себя точно так, как вы описали (не ударяя точки останова, попав в код, который не ожидаете попасть при переходе), когда он использует файл .pdb, который был сгенерирован с использованием исходного кода, каким-то образом отличающимся от кода, который используется при отладке. Я не могу гарантировать, что это ваш случай, но я наблюдал такое поведение много раз, когда мне нужно было войти в код, который был предоставлен в виде готовой библиотеки, которая была сгенерирована против старого/другого кода с одинаковыми именами файлов/символы.

Ответ 17

Возможно, ваш проект Test ссылается на более старый Core двоичный файл, а не на проект Core (исходный код)?

Попробуйте повторно добавить ссылку в свой тестовый проект:

Перейдите в проект Test и удалите ссылку на проект Core.

Теперь выберите папку "Ссылки" и щелкните ее правой кнопкой мыши и выберите пункт меню, чтобы добавить новую ссылку. Когда в диалоговом окне "Менеджер ссылок" убедитесь, что вы выбрали Solution, а затем Projects слева. Затем в середине диалога Reference Manager выберите (проверьте) проект Core.

Повторите попытку отладки и посмотрите, помогает ли это.

Ответ 18

Еще несколько вещей, которые нужно попробовать:

  • Проверьте, соответствуют ли загруженные символы отладочному исполняемому файлу:
    Откройте командную строку VS и cd в каталог, в котором выполняется отладка исполняемого файла. Затем выполните dumpbin /PDBPATH:VERBOSE MyServiceExecutable.exe и сканируйте выход для "несоответствия возраста PDB" (Ref: http://msdn.microsoft.com/en-us/library/44wx0fef.aspx)

  • Не уверен в VS 2012, но более старые версии VS имели ошибку, в которой будет отображаться неправильный исходный файл, при условии, что у вас есть два исходных файла в вашем проекте, которые имеют одинаковый имя, даже если они находятся в разных папках. Поэтому, если ваш проект содержит другой исходный файл с тем же именем, посмотрите, помогает ли переименование одного из них. (Обновление: кажется, VS 2012 тоже затронуто.)

Ответ 19

Глупый мне проект Test не был построен:

enter image description here

Ответ 20

Это довольно неясное:

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

Я не на 100% разбираюсь в технических особенностях, но у меня было два AppPools и два виртуальных каталога, и ни одна точка останова не попала, потому что я предполагаю, что физический путь каким-то образом сопоставлен в IIS/Visual Studio с другим приложением, а не с одним который фактически выполнялся.

Ответ 21

У меня такая же проблема. Возможно, мое решение поможет вам решить вашу проблему. Как раз в разделе "Присоединить к процессу" для опции "Прикрепить к" выберите значение "Автоматический: родной код". С наилучшими пожеланиями.

Image

Ответ 22

Сначала попробуйте перестроить свой проект, щелкнув правой кнопкой мыши проект > 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, это символы отладки)

Ответ 23

Чтобы отлаживать шаг за шагом, вы должны сделать две вещи. Сначала вы должны установить точку останова, затем вы должны приложить отладчик к процессу, выполняющему ваш код. Если вы используете IIS Express и у вас есть 64-разрядная машина, вам необходимо прикрепить iisexpress.exe, который запускает ваш код. Если вы нажмете CTRL + ALT + P, вы попадете в окно подключения к процессу. После прикрепления точка останова должна быть удалена, если код соответствует.

Ответ 24

В модульных тестах я не попадал в точки останова, и понял, что я выполнял тест, а не отлаживал тест. В верхней части Test Explorer находятся опции "Запустить все", "Запустить сбой", "Запустить прохождение" и т.д. Когда вы запустите тест, точки останова не будут удалены. Чтобы отладить тест, в Test Explorer щелкните правой кнопкой мыши тест или группу тестов и выберите "Отладка выбранных тестов".