У меня есть приложение с 4 потоками, работающими с одним и тем же кодом. Однако, когда я шагаю, он перескакивает между разными потоками. Как я могу привязать его к одному потоку, чтобы другие потоки игнорировались для отладки?
c#
multithreading
visual-studio-2010
Оскар Челлин
источник
источник
Ответы:
Да.
В окне «Потоки» («Отладка» -> «Windows» -> «Потоки») щелкните правой кнопкой мыши нужный поток и выберите «переключиться на поток».
Вы также можете выбрать «заморозить» потоки, которые не хотите отлаживать, чтобы они не запускались. Однако не забудьте «разморозить» их, если вы ожидаете, что они будут работать.
Дальнейшее чтение .
источник
Одиночный переход через один поток, по-видимому, в основном исправлен в 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
источник
Вы также можете поставить условную точку останова в свой код и поместить
thread.Id == [someValue]
илиThread.Name == "[Somename]"
в условие точки останова ...источник
Для простых случаев существует гораздо более быстрый способ обхода - см. Комментарии в ссылке Стива.
Итак, в моем случае, когда различные потоки начали попадать в мою точку останова, я просто несколько раз нажал «Продолжить», пока не определил вызов, который искал, - затем удалил точку останова и прошел через остальную часть кода, оставаясь в том же потоке без вмешательства со стороны остальные из них.
Очевидно, это становится проблемой, если у вас есть несколько точек останова, которые вы хотите сохранить, и т. Д. - но, опять же, для простых случаев это сделать намного проще.
источник
Это очень похоже на очень похожую проблему в Visual Studio 2008 SP1. Это было исправлено с помощью исправления post-SP. Но есть и другие свидетельства того, что исправление не было включено в базу кода, этот элемент обратной связи также был проблемой. Нет ничего необычного в том, что исправления не интегрируются обратно.
Нет пункта обратной связи, который точно описывает вашу проблему, по крайней мере, я могу найти. Я рекомендую вам подать один. Учитывая обычные проблемы с воспроизведением ошибок, подобных этой, я настоятельно рекомендую вам включить проект воспроизведения, который демонстрирует эту проблему, с инструкциями о том, как воспроизвести проблему.
Существует своего рода обходной путь для вашей проблемы: вы можете перейти в Debug + Windows + Threads, щелкнуть правой кнопкой мыши потоки, которые вы не хотите отлаживать, и выбрать Freeze. Не забудьте разморозить их позже.
Эти ошибки были снова исправлены в Visual Studio 2010 Service Pack 1.
источник
Я использую Visual Studio Professional 2017, и я использую окно потоков, чтобы выборочно замораживать и размораживать потоки. Обычно у меня есть несколько потоков одного и того же кода, и я хочу только заморозить их, а не другие. Мне действительно нравится окно MS Threads, потому что я могу выбрать подмножество потоков для замораживания. Я группирую потоки по имени, а затем могу заморозить все те, на которых выполняется тот же код, что и я отлаживаю, позволяя запускать оставшиеся потоки. Я пробовал использовать расширение Erwin Mayer, и оно работало очень хорошо, но оно замораживает все потоки, кроме того, который я запускаю, и иногда я попадаю в ситуацию, когда отладка не достигает точки останова, я думаю, что это должно быть, потому что все другие потоки остановлены, и приложение кажется остановленным. Нажатие кнопки паузы и размораживание потоков в окне потоков устраняет эту проблему.
источник
7 малоизвестных приемов отладки в Visual Studio
источник