Я пишу многопоточное приложение Windows в Microsoft Visual C# 2008 Express Edition. В последнее время странно себя ведет отладчик.
Пока я перешагиваю строки кода с помощью клавиши F10, иногда она интерпретирует мою команду «Шаг над (F10)» точно так же, как команду «Продолжить» (F5), а затем программа возобновляет работу и завершается сеанс отладки.
Кто-нибудь знает, почему это происходит? При каких обстоятельствах команда Step Over может привести к остановке отладчика?
Это не проблема отлаживаемого кода: это происходит не только в определенных строках кода. Это происходит в случайной строке, которая меняется каждый раз, когда я запускаю отладчик.
Это не проблема с моей клавиатурой: то же самое происходит, когда я просто нажимаю «Шаг вперед» на панели инструментов отладки.
Это может быть проблема с другими потоками в моей программе. Возможно, один из них случайным образом делает что-то, что имеет побочный эффект прерывания отладчика. Это возможно?
Заранее спасибо!





Я видел это несколько раз. Обычно это происходит при переключении контекста на другой поток. Таким образом, вы, возможно, проходите через поток с идентификатором 11, вы нажимаете F10, и есть упреждающий переключатель контекста, так что теперь вы работаете с потоком с идентификатором 12, и Visual Studio весело разрешает выполнение кода.
Есть несколько хороших советов по отладке здесь:
Tip: Break only when a specific thread calls a method: To set a per-thread breakpoint, you need to uniquely identify a particular thread that you have given a name with its Name property. You can set a conditional breakpoint for a thread by creating a conditional expression such as "ThreadToStopOn" == Thread.CurrentThread.Name .
You can manually change the name of a thread in the Watch window by watching variable "myThread" and entering a Name value for it in the value window. If you don't have a current thread variable to work with, you can use Thread.CurrentThread.Name to set the current thread's name. There is also a private integer variable in the Thread class, DONT_USE_InternalThread, this is unique to each thread. You can use the Threads window to get to the thread you want to stop on, and in the Watch window, enter Thread.CurrentThread.DONT_USE_InternalThread to see the value of it so you can create the right conditional breakpoint expression.
Обновлено: Есть также несколько хороших советов здесь. Я нашел это в Google по запросу «визуальная студия предотвращает переключение потоков во время отладки».
Я считаю, что использование файла журнала очень удобно при работе с несколькими потоками.
Отладка потоков похожа на принцип Хюйзенберга - слишком внимательно наблюдайте, и результат изменится!
Вам следует взглянуть на этот Статья в базе знаний и подумать о соответствующем исправлении.
Обновлено: исправление решает подобные проблемы с отладкой. К сожалению, изменения исходного кода исправления не вернулись в основную ветку, и VS2010 поставляется с теми же проблемами. Это снова было исправлено с помощью пакета обновления 1.
Спасибо! У меня не было возможности подтвердить, что это исправление работает, но похоже, что должно, потому что они упоминают ту же проблему, что и у меня.
Попробуйте этот http://support.microsoft.com/kb/957912. Работал у меня.
В экспресс-выпуске нет окна потоков. Тем не менее, условная точка останова в имени потока звучит интересно.