Как действительно “Редактирует и продолжает” работу в Visual Studio?

Вместо es.shutdownNow(); использовать es.shutdown();

shutDownNow() останавливает обработку всех задач, включая те, которые даже не выполняются.

Вот почему не все элементы выполняются средой Executor.

22
задан LeopardSkinPillBoxHat 22 October 2008 в 04:36
поделиться

3 ответа

Мое понимание - то, что то, когда приложение компилируется с поддержкой Редактирования и Продолжается, включило, компилятор покидает дополнительную комнату вокруг функций в двухуровневом изображении для обеспечения добавления дополнительного кода. Тогда отладчик может скомпилировать новую версию функции, заменить существующую версию (использующий дополнительное пространство по мере необходимости), согласовать стек, установить указатель команд и продолжать идти. Тем путем Вы не должны ремонтировать указатели перехода, пока у Вас есть достаточно дополнения.

Примечание, которое Продолжает Редактирование и обычно не работает над кодом в libs/dlls, только с основным исполняемым кодом.

15
ответ дан 29 November 2019 в 05:36
поделиться

Мое предположение состоит в том, что оно перекомпилирует приложение (и для небольших изменений это не будет означать, что его придется перекомпилировать). Затем, поскольку Microsoft создает и компилятор, и отладчик, они могут дать гарантии о том, как устроена память и тому подобное. Таким образом, они могут использовать API отладки для перезаписи сегментов кода новыми, если изменения достаточно малы.

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

Microsoft также имеет механизм «горячих патчей». Функции имеют 2-байтовую безоперационную инструкцию, обычно что-то вроде «mov edx, edx» перед любым реальным кодом. Это позволяет им перенаправить выполнение функции чисто. Это также может быть вариантом.

Главное, что нужно помнить, это то, что приложение не «работает», все его потоки находятся в остановленном состоянии. Таким образом, что касается процесса, любые модификации, которые делает отладчик, полностью атомарны.

Конечно, это все домыслы;)

8
ответ дан 29 November 2019 в 05:36
поделиться

Мое предположение является всеми объектами, выровненные к 4 096-байтовой границе памяти. Таким образом, при внесении небольших изменений в некоторый код тогда, объекты все еще будут в тех границах и поэтому работать как прежде.

у меня были экземпляры, где изменение нескольких строк вызовет полное, перекомпилировали и связываются и другие, где довольно существенный рефакторинг функции будет e& c очень хорошо.

0
ответ дан 29 November 2019 в 05:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: