Visual Studio открывает исходный код поверх стека, когда я "ломаю все" во время отладки; Я хочу держать курсор над документом, над которым я сейчас работаю, без какого-либо другого документа или окна (например, никаких загруженных символов).
Есть ли способ остаться в текущем документе после "взломать все" в Visual Studio?
Ответ 1
Существует способ остаться в текущем документе, но для этого требуется создание надстройки Visual Studio и новой команды пользовательского интерфейса на панели инструментов Debug. Кредиты для этого ответа должны также перейти на openshac, который разместил аналогичные SO question и также дал обходной путь в его OP с помощью макроса.
Реализация довольно проста (мне потребовалось несколько минут, чтобы она работала). Во-первых, в проекте надстройки измените метод Exec
в файле Connect.cs
следующим образом:
public void Exec(string commandName, vsCommandExecOption executeOption, ref object varIn, ref object varOut, ref bool handled)
{
handled = false;
if(executeOption == vsCommandExecOption.vsCommandExecOptionDoDefault)
{
if(commandName == "BreakInCurrentDocument.Connect.BreakInCurrentDocument")
{
// here where the magic happens
// ******************************
var activeWindow = _applicationObject.ActiveWindow;
_applicationObject.Debugger.Break();
if (_applicationObject.ActiveWindow != activeWindow)
{
_applicationObject.ActiveWindow.Close(vsSaveChanges.vsSaveChangesNo);
}
// ******************************
handled = true;
return;
}
}
}
После создания и регистрации надстройки просто:
- щелкните ИНСТРУМЕНТЫ в меню Visual Studio
- Настройка
- Команды
- Выберите переключатель "Панель инструментов"
- Выберите "Отладка"
- Добавить команду...
- В категории "Добавить" выберите пользовательскую надстройку.
Что это.
Ответ 2
Последняя версия расширения VSCommands (бесплатная версия), доступная от http://visualstudiogallery.msdn.microsoft.com/a83505c6-77b3-44a6-b53b-73d77cba84c8, имеет только то, что вы хотите. Он добавляет кнопку "Разрыв в текущем документе" для панели "Отладка" и "Отладка":
http://vscommands.squaredinfinity.com/Media/VSCommands/BlogPost//blog/breakincurrentdocument.png
Ответ 3
Это особенность.. когда вы делаете "сломать все", тогда предполагается, что ваш процесс зависел. Первое, что вас может заинтересовать в таком случае, - ГДЕ. Следовательно, он направляет вас прямо к текущему месту, которое выполняется. IIRC, это стандарт defacto для всех низкоуровневых отладчиков. Если вы не хотите, чтобы "никакие символы не загружались", просто отметьте "демонстрацию демонстрации", и она больше не появится снова:) (конечно, вместо этого вы увидите точную точку остановки. И да, это также что я сам много раз использовал для отладки неизвестного кода библиотеки)
С другой стороны, если вы знаете, где вы хотите, чтобы код был остановлен, поместите вместо него точку останова.
На другой руке (как если бы у нас было три), если вы хотите остановить приложение - остановите его, не прерывайте, просто остановитесь.
Я чувствую, что ваша настоящая проблема заключается в том, что вы используете одну из функций неправильно, и поэтому другая функция вас обманывает. Скажите, пожалуйста, что вы используете для "break all" и как/почему он сталкивается с вашим текущим редактированием текста. Почему бы вам не остановиться или не наткнуться здесь? Или "отсоединить"?
В любом случае, я должен признать, что в качестве функции должен быть какой-то вариант для ее отключения, только для удобства конфигурирования IDE.
ИЗМЕНИТЬ
AAhh.. ты прав. Я полностью забыл о славном редактировании и продолжении. Я не шучу/дразня, E & C - отличная функция, которую я желаю всем остальным платформам. Я забыл об этом, потому что... Я широко использую функции lambdas, generics, foreachs и т.д., Которые эффективно блокируют редактирование и продолжение.
В любом случае, дело в том, что редактирование и продолжение - это золотая функция, которую вы хотите использовать - приложение должно быть в режиме "break". Тем не менее, тем не менее, как "break" / "pause" и т.д., IDE будет считать, что PAUSE была вашей целью, а не редактированием, поэтому она покажет вам, где вы приостановили приложение.
В MSVS есть несколько вариантов, таких как "показать только мой код", которые могут вам немного помочь, но это не решит проблему: редактирование и продолжение во время отладки было разработано для "небольших локальных изменений". Например, if(x>0)throw new uncaught()
вместо if(x<0)throw new uncaught()
. Ваше приложение остановилось на утверждении или точке останова и вот-вот рухнет, обработчик исключений с первым изменением отключится, и вот ваш шанс! Вы разматываете обработчик аварии, корректируете код, затем запускаете. Все в одном и том же методе, у которого была остановка, произошла в, как способ исправления "точно в срок".
Это одна из основных проблем, почему вы не можете добавлять методы, классы, модифицировать generics и т.д. во время сеанса E & C: т.е. редактирование текущей лямбды или текущего foreach может быть в порядке, но среда IDE не сможет переместить потоки и правильно выполнить новый код. Это немного похоже на то, почему вы иногда видите предупреждение "устаревшего кода", но с этими конструкциями кода его еще сложнее анализировать и, следовательно, не реализовывать. И, вероятно, никогда не попадет в список MS TO-DO:/
Текущий бум в .Net/С# - это не "живая разработка", а "notaliveyet development", сильно поддерживаемая модулярностью и модульным тестированием, где вы пытаетесь проверить большинство функций приложения off-line.. Но что сдвиг парадигмы и для небольших проектов или для локального развития рабочего стола иногда это просто перебор.