Visual Studio, отладка одного из нескольких потоков

У меня есть приложение с 4 потоками, работающими с одним и тем же кодом. Однако, когда я делаю шаг, он перескакивает между разными потоками. Как я могу заблокировать его в одном потоке, чтобы другие потоки игнорировались для отладки?

Ответ 1

Да.

В окне "Темы" (Debug → Windows → Threads) щелкните правой кнопкой мыши нужный поток и выберите "перейти к потоку".

Вы также можете выбрать "заморозить" потоки, которые вы не хотите отлаживать, чтобы они не запускались. Не забывайте "оттаять" их, если вы ожидаете, что они будут выполнять работу.

Дальнейшее чтение.

Ответ 2

Один шаг по одному потоку, по-видимому, в основном фиксируется в VS 2012 (с некоторыми оговорками, которые вы можете увидеть в моей ссылке ниже). Точки останова - это боль.

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

Еще один полезный рабочий процесс - применить фильтр потока на ваших контрольных точках, также указанный в некоторых ответах:

Создайте точку останова, щелкните правой кнопкой мыши на точке останова, нажмите "Фильтр" и введите "ThreadId = 7740" (ваш идентификатор потока из окна потоков).

Это может быть очень утомительно.

Мое предложение Microsoft - исправить один шаг (и его варианты), чтобы никогда не переключать потоки, если явная точка останова не попала в другой поток. Они также должны добавить ярлык (возможно, Ctrl-F9), чтобы создать точку останова с текущим идентификатором потока в качестве своего фильтра. Это сделало бы второй рабочий процесс более удобным.

Проголосуйте за предложение, если вы согласитесь с этим, было бы полезно или добавить свои собственные предложения:

https://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/8543248-make-the-debugger-stick-to-the-current-thread-inst

Ответ 3

Вы также можете поставить условную точку останова в свой код и поместить thread.Id == [someValue] или Thread.Name == "[Somename]" в условие точки останова...

Ответ 4

Это очень похоже на очень похожую проблему в Visual Studio 2008 SP1. Он был исправлен с исправлением после SP. Но есть и другие доказательства того, что исправление не было включено в базу кода, этот элемент обратной связи также был проблемой. Не исключено, что исправления не будут исправлены.

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

В вашей проблеме есть временное решение, вы можете войти в Debug + Windows + Threads, щелкнуть правой кнопкой мыши потоки, которые вы не хотите отлаживать, и выбрать Freeze. Не забывайте их оттаивать позже.

Эти ошибки были исправлены снова в пакете обновления 1 для Visual Studio 2010.

Ответ 5

Для простых случаев существует гораздо более быстрое обходное решение - см. комментарии в ссылке Стива.

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

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

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