Почему отладчик Microsoft Visual C # 2008 Express Edition случайно завершает работу? - PullRequest
3 голосов
/ 22 ноября 2008

Я пишу многопоточное приложение Windows в Microsoft Visual C # 2008 Express Edition. Недавно отладчик вел себя странно.

Когда я переступаю через строки кода, используя F10, иногда он интерпретирует мою команду Перешагнуть (F10), как команду Продолжить (F5), и затем программа возобновляет работу и сеанс отладки будет выполнен. 1003 *

Кто-нибудь знает, почему это происходит? При каких обстоятельствах команда «Перешагнуть» может привести к остановке отладчика?

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

Это не проблема с моей клавиатурой: то же самое происходит, когда я просто нажимаю Перешагнуть на панели инструментов отладки.

Это может быть проблема с другими потоками в моей программе. Может быть, один из них случайно делает что-то, что имеет побочный эффект прерывания отладчика. Это возможно?

Заранее спасибо!

Ответы [ 4 ]

4 голосов
/ 10 февраля 2009

Вы должны взглянуть на эту статью KB и рассмотреть соответствующее исправление.

РЕДАКТИРОВАТЬ: исправление решает такие проблемы отладки. К сожалению, изменения исходного кода для исправления не вернули его в основную ветку, и VS2010 поставлялся с точно такими же проблемами. Это исправлено снова с помощью пакета обновления 1.

4 голосов
/ 22 ноября 2008

Я видел это несколько раз. Обычно это происходит при переключении контекста в другой поток. Таким образом, вы можете проходить по потоку с идентификатором 11, нажимать клавишу F10 и использовать преимущественное переключение контекста, так что теперь вы работаете с идентификатором потока 12, и поэтому Visual Studio с радостью разрешает продолжить выполнение кода.

Есть несколько хороших советов по отладке здесь :

Подсказка. Разрыв только в том случае, если определенный поток вызывает метод. Чтобы установить точку останова для каждого потока, необходимо однозначно идентифицировать конкретный поток, которому вы дали имя, с помощью свойства Name. Вы можете установить условную точку останова для потока, создав условное выражение, например "ThreadToStopOn" == Thread.CurrentThread.Name.

Вы можете вручную изменить имя потока в окне «Просмотр», просмотрев переменную «myThread» и введя для нее значение «Имя» в окне значений. Если у вас нет текущей переменной потока для работы, вы можете использовать Thread.CurrentThread.Name, чтобы установить имя текущего потока. В классе Thread также есть частная целочисленная переменная DONT_USE_InternalThread, которая уникальна для каждого потока. Вы можете использовать окно Threads, чтобы перейти к потоку, на котором вы хотите остановиться, и в окне Watch введите Thread.CurrentThread.DONT_USE_InternalThread, чтобы увидеть его значение и создать правильное выражение условной точки останова.

РЕДАКТИРОВАТЬ: Есть также несколько хороших советов здесь . Я нашел это, прибегнув к помощи «визуальной студии, предотвращающей переключение потоков во время отладки».

1 голос
/ 07 января 2009

Я считаю, что использование файла журнала очень удобно при работе с несколькими потоками.

Отладка потоков подобна принципу Гайзенберга - соблюдайте слишком внимательно, и вы измените результат!

0 голосов
/ 24 февраля 2009

Попробуйте это http://support.microsoft.com/kb/957912. Сработало для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...