c# отладка - Как отлаживать один поток в Visual Studio?




отладчик настройка (8)

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

Я знаю, что это возможно, определяя условие на точку прерывания, то есть имя потока = ... или поток Id = ... но мой случай - это тяжелое загруженное приложение ASP.NET и как только я присоединяюсь к w3wp.exe многие потоки попадут в точки останова. Мне нужно что-то вроде ThreadLocal<break-point> .

Является ли это возможным? Если да, то как?


Answers

Если несколько потоков генерируются как для веб-приложения, ответ @MattFaus не будет работать. вместо этого я сделал следующее

  • Настройте точку останова, чтобы прервать поток в функции, которую я хочу.
  • Когда поток попадает в точку останова и приостанавливается, я удаляю точку останова и продолжаю отладку с помощью F8, F10 и F11, так что остальные потоки могут запускаться.

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

Однако, если это абсолютно необходимо, и вам нужен стат решения, я уверен, что вы можете добавить точку останова, которая ломается, только если запрос поступает с вашего IP-адреса. Вы сделали бы это, добавив условную HttpContext.Request.UserHostAddress останова, которая проверяет HttpContext.Request.UserHostAddress . Обратите внимание, что это значительно замедляет ваше приложение.


Вот что я сделал:

  1. Установите условную точку прерывания, которая, как я знал, попадет только в поток, который я искал.

  2. После того, как точка останова попадает, и вы находитесь в нужном вам потоке, в окне «Темы Visual Studio» (при отладке, «Отладка» -> «Windows -> Темы»), Ctrl + A (для выбора всех потоков), а затем Ctrl + щелкните по нитке, которую вы в настоящее время. У вас должны быть все потоки, кроме тех, которые вы хотите отладить.

  3. Щелкните правой кнопкой мыши и выберите «Заморозить».

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


Я только что выпустил расширение Visual Studio 2010+, которое делает именно то, что вы ищете. И это бесплатно :).

презентация

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

Это резко уменьшает необходимость вручную перейти в окно Threads, чтобы заморозить / оттереть все потоки, но тот, который необходимо соблюдать, и, следовательно, помогает повысить производительность.

Характеристики

Ограничьте дальнейшее выполнение только текущим потоком. Заморозит все остальные потоки. Ярлык: CTRL + T + T или кнопка «Снежинка». Переключитесь на следующий единственный поток (на основе ID). Изменит текущий поток и заморозит все остальные потоки. Ярлык: CTRL + T + J или кнопка Далее.

Проверьте это здесь, в Галерее , на официальной странице или в хранилище Github .


Если вы не хотите останавливать все остальные потоки (возможно, вы прикрепляете отладчик Visual Studio к запущенному приложению, которое должно отвечать на запросы), вы можете использовать макрос, который автоматически создает и удаляет точки останова.

Это предлагается в ответе на вопрос о переполнении стека «Step over» при отладке многопоточных программ в Visual Studio .

Однако ссылка только объясняет, как отлаживать строки за строкой. Я предлагаю вам изменить макрос (если вам удобно с ним), чтобы он изменял все точки останова (в данном диапазоне строк, например), чтобы останавливаться только на текущем потоке.


Я думаю, что это немного отличается в Visual Studio 2015. Они изменили несколько вещей в контрольных точках, но вот как применить принятый ответ от hzdbyte (см. Выше):

В точке останова в поле кодирования щелкните правой кнопкой мыши> Условия> Изменить с «Условное выражение» на «Фильтровать». Затем вы можете фильтровать ThreadId.

В качестве альтернативы в точке останова в окне «Точки останова» щелкните правой кнопкой мыши> «Настройки»> отметьте поле «Условия» и выполните описанное выше.


Нити Freeze / Thaw являются неправильным способом, потому что другие потоки не выполняют никакого кода.

Наиболее правильным и удобным способом является:

  1. Нажмите Ctrl + A в окне точек останова (выберите все точки останова).
  2. Щелкните правой кнопкой мыши и выберите «Фильтр ...».
  3. Введите «ThreadId = (текущий поток id)».

В Visual Studio 2015 и новее процесс аналогичен:

  1. Нажмите Ctrl + A в окне точек останова (выберите все точки останова).
  2. Щелкните правой кнопкой мыши и выберите «Настройки ...».
  3. Проверьте «Условия» и выберите «Фильтр» в выпадающем меню
  4. Введите «ThreadId = (текущий поток id)».

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


Процесс - это исполняемый экземпляр приложения. Что это значит? Например, когда вы дважды щелкните значок Microsoft Word, вы запускаете процесс, который запускает Word. Поток - это путь выполнения внутри процесса. Кроме того, процесс может содержать несколько потоков. При запуске Word операционная система создает процесс и начинает выполнять основной поток этого процесса.

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

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







c# asp.net multithreading visual-studio-2010 breakpoints