Подтвердить что ты не робот

Как отлаживать только один поток в Visual Studio

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

Чтение:

Я получаю одно решение, которое является условным точкой останова (основано на названии потока). Тем не менее, я не могу сказать, что "поток №3" всегда будет тем, который рассматривает интересный случай, поэтому мне пришлось бы менять условие для каждого исполнения. Слишком много работы.

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

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

Идеальное решение должно найти правильный поток, пометить его и затем сказать Visual Studio: " ломается, только если текущий поток отмечен".

Возможно ли это?

4b9b3361

Ответ 1

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

Ответ 2

Я бы использовал условные точки останова, которые вы упомянули, но вместо сравнения с некоторой фиксированной строкой сравнивайте с некоторой полу-глобальной переменной (возможно, статическое свойство в вашем основном классе?).

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

Ответ 3

Немного поздно, но это стало первым ответом в поиске.

Я использую следующее в VS 2015...

var thread = System.Threading.Thread.CurrentThread;
if (thread.Name == null)
            thread.Name = "Main";

Тогда в точке останова...

System.Threading.Thread.CurrentThread.Name == "Main"

Чтобы сделать его более гибким, вы можете вставлять Thread в пользовательский класс.

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