У мене є додаток з 4-ма потоками, що працюють над тим же кодом. Однак, коли я ступаю, він стрибає між різними нитками. Як я можу зафіксувати його на одному потоці, щоб інші потоки були проігноровані для налагодження?
У мене є додаток з 4-ма потоками, що працюють над тим же кодом. Однак, коли я ступаю, він стрибає між різними нитками. Як я можу зафіксувати його на одному потоці, щоб інші потоки були проігноровані для налагодження?
Відповіді:
Так.
У вікні "Нитки" (Налагодження -> Windows -> Нитки) клацніть правою кнопкою миші потрібну нитку та виберіть "переключитися на нитку".
Ви також можете вибрати "заморозити" на потоках, які ви не хочете налагоджувати, щоб не запускати їх. Не забудьте "відтанути" їх, якщо ви очікуєте, що вони виконають роботу.
Одне проходження через одну нитку, здається, в основному зафіксовано у VS 2012 (з деякими застереженнями ви можете ознайомитись у моєму посиланні нижче). Точки перериву - це біль.
Заморожування та розморожування ниток - це звичайне рішення, як було сказано в попередніх відповідях, але це виснажливо, і це може спричинити зависання, коли ваша нитка чекає на іншій замороженій нитці. Вони можуть бути важкими для відновлення, не втрачаючи місця у своїй цікавій нитці.
Ще один корисний робочий процес - застосувати фільтр потоку до ваших точок прориву, який також зазначено в деяких відповідях:
Створіть точку розриву, клацніть правою кнопкою миші на точці розриву, клацніть Фільтр та введіть ThreadId = 7740 (ваш ідентифікатор потоку у вікні ниток).
Це може бути дуже нудно.
Моя пропозиція корпорації Майкрософт полягає в тому, щоб виправити один крок (і його варіанти), щоб ніколи не перемикати потоки, якщо явна точка розриву не потрапила в інший потік. Вони також повинні додати ярлик (можливо, Ctrl-F9), щоб створити точку розриву з поточним ідентифікатором потоку як його фільтром. Це зробить другий робочий процес набагато зручнішим.
Проголосуйте за пропозицію, якщо ви погоджуєтесь, що це буде корисно, або додайте власні пропозиції:
Ви також можете поставити у свій код умовну точку розриву та поставити thread.Id == [someValue]
або Thread.Name == "[Somename]"
в умову точки перерви ...
Набагато швидше рішення існує для простих випадків - дивіться коментарі за посиланням Стіва.
налагоджувач буде лише колись виконати крок на потоці, з якого був створений крок. Тож якщо ви потрапили на точку розриву, відключіть її, а потім почніть крокувати, не варто зупинятися на іншій нитці. Якщо у вашій програмі є інші точки перерви, і інша нитка потрапляє на одну, ви будете налагоджувати в змішаному стані потоку, як описано
Тож у моєму випадку, коли різні потоки почали натискати на мою точку розриву, я просто натиснув Продовжити кілька разів, поки я не визначив дзвінок, який я шукав - потім видалив точку розриву і перейшов через решту коду, залишаючись на тій самій нитці без втручання від решта з них.
Це, очевидно, стає проблемою, якщо у вас є кілька точок прориву, які ви хочете зберегти, і т. Д. - але знову ж таки для простих випадків це зробити набагато простіше.
Це сильно нагадує дуже подібну проблему в Visual Studio 2008 SP1. Це було виправлено за допомогою виправлення після SP. Але є інші докази того, що виправлення не було включено до бази коду, цей елемент відгуку також був проблемою. Це не так незвично, щоб виправлення не отримували інтеграції.
Не існує елемента відгуку, який би точно описував вашу проблему, принаймні, що я можу знайти. Я рекомендую вам подати один. Враховуючи звичайні проблеми з такими помилками відтворення, я настійно рекомендую включити проект відтворення, який демонструє цю проблему з інструкціями щодо відтворення проблеми.
Існує спосіб вирішення вашої проблеми. Ви можете зайти в Debug + Windows + Threads, клацніть правою кнопкою миші теми, які не хочете налагоджувати, і виберіть Freeze. Не забудьте пізніше відтанути їх.
Ці помилки знову були виправлені у пакеті оновлень 1 для Visual Studio 2010.
Я використовую Visual Studio Professional 2017, і я використовую вікно "Нитки" для вибіркового заморожування та відтавання ниток. Зазвичай у мене є кілька потоків одного коду, і я хочу лише заморозити їх, а не інші. Насправді мені подобається вікно MS Threads, тому що я можу вибрати підмножину потоків для заморожування. Я групую потоки за назвою, а потім можу заморозити всі ті, хто працює з тим самим кодом, що і я налагоджую, а інші теми дозволяють виконувати. Я спробував використовувати розширення Ервіна Майєра, і він спрацював дуже добре, але він заморожує всі потоки, крім тієї, якою я запускаюсь, і я іноді потрапляю в ситуацію, коли налагодження не потрапляє на точку перелому, я думаю, що це повинно, тому що всі інші потоки зупиняються і додаток видається зупиненим. Натискання кнопки паузи та розморожування потоків у вікні ниток виправляє цю проблему.
5. Крок через одну єдину нитку, не стрибаючи
Як часто ви налагоджуєте багатопотоковий код, коли потрапляєте на першу точку розриву, робите крок, а потім раптом вас зупиняє жовта стрілка на іншій нитці? Несподівана поведінка походить від точки розриву, яка все ще встановлюється і, отже, потрапляє. За замовчуванням налагоджувач зупиняється на точці розриву кожного разу, коли він потрапив. Це означає, що коли ви робите крок, всі потоки можуть бути запущені, і одна з запущених ниток досягає цієї точки розриву до того, як крок завершиться на вашій поточній нитці. Наступного разу, коли ви потрапите в цю ситуацію, спробуйте це:
- Вимкніть або видаліть точку розриву, на яку потрапив новий потік, на який відключений налагоджувач.
- Натисніть Продовжити (F5)
- Поспостерігайте, як завершується ваш перший початковий крок на першому потоці, і тепер це активний контекст налагодження.
- Оскільки ваші точки переривання видалено або вимкнено, ви можете продовжувати наступати на цю єдину нитку без перерви.