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

127

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

Оскар Челлин
источник
какую версию Visual Studio вы используете? Express, Pro, Ultimate ..?
Марк
тогда ссылка jeffamaphone поможет и, возможно, это также для получения дополнительной информации о переключении на другой поток во время отладки msdn.microsoft.com/en-us/library/bb157786.aspx
Марк
См. Соответствующее обсуждение: visualstudio.uservoice.com/forums/121579-visual-studio/…
user626528

Ответы:

108

Да.

В окне «Потоки» («Отладка» -> «Windows» -> «Потоки») щелкните правой кнопкой мыши нужный поток и выберите «переключиться на поток».

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

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

i_am_jorf
источник
24
Я запутался. Ответ "Это невозможно?" Вопрос спрашивает, как оставаться привязанным к определенному потоку, чтобы отладчик не прыгал между ними. Переключение на поток - это нормально, но как только другой поток что-то делает, отладчик переходит к нему. Если я не могу заморозить другой поток, потому что ему нужно что-то делать, то как мне оставаться заблокированным только для потока, который меня интересует?
Bubbleking
Доход: | вы должны всегда нажимать на переключатель, каждый раз, когда что-то происходит
deadManN
16

Одиночный переход через один поток, по-видимому, в основном исправлен в 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

Стив
источник
1
«Одиночный переход через один поток, по-видимому, в основном исправлен в VS 2012» - не совсем, в VS2017 он все еще не работает.
user626528
10

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

Чарльз Бретана
источник
Спасибо, Чарльз, это было полезно (не знал, что ты сможешь это сделать). Однако для меня наиболее эффективный способ отладки - это тот, который написал jeffamaphone, поскольку я не знаю его имени, пока он не достигнет точки останова и не увидит некоторые значения
Оскар Кьеллин
3

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

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

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

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

Борис
источник
2

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

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

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

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

Ганс Пассан
источник
1

Я использую Visual Studio Professional 2017, и я использую окно потоков, чтобы выборочно замораживать и размораживать потоки. Обычно у меня есть несколько потоков одного и того же кода, и я хочу только заморозить их, а не другие. Мне действительно нравится окно MS Threads, потому что я могу выбрать подмножество потоков для замораживания. Я группирую потоки по имени, а затем могу заморозить все те, на которых выполняется тот же код, что и я отлаживаю, позволяя запускать оставшиеся потоки. Я пробовал использовать расширение Erwin Mayer, и оно работало очень хорошо, но оно замораживает все потоки, кроме того, который я запускаю, и иногда я попадаю в ситуацию, когда отладка не достигает точки останова, я думаю, что это должно быть, потому что все другие потоки остановлены, и приложение кажется остановленным. Нажатие кнопки паузы и размораживание потоков в окне потоков устраняет эту проблему.

BlueMax
источник
0

5. Пройдите по одной нити, не прыгая.

Как часто вы отлаживаете многопоточный код, когда вы нажимаете свою первую точку останова, делаете шаг, а затем внезапно останавливаетесь с желтой стрелкой на другом потоке? Неожиданное поведение происходит из-за того, что точка останова все еще установлена ​​и, следовательно, срабатывает. По умолчанию отладчик останавливается при достижении точки останова. Это означает, что когда вы делаете шаг, всем потокам разрешается запускаться, и один из ваших запущенных потоков достигает этой точки останова до того, как шаг завершится в вашем текущем потоке. В следующий раз, когда вы попадете в такую ​​ситуацию, попробуйте следующее:

  1. Отключите или удалите точку останова, в которую попал новый поток, на который переключился отладчик.
  2. Нажмите Продолжить (F5)
  3. Посмотрите, как завершается ваш первый начальный шаг в этом первом потоке, и теперь это активный контекст отладки.
  4. Поскольку ваши точки останова удалены или отключены, вы можете продолжить работу в этом единственном потоке без перерыва.

7 малоизвестных приемов отладки в Visual Studio

rebornx
источник