Имеет ли значение для отладчика то, что я отлаживаю код Scala? - PullRequest
3 голосов
/ 14 января 2011

Мне интересно, какое это имеет значение для отладчика (Intellij IDEA + плагин Scala), когда я отлаживаю код Scala, а не код Java.Насколько я понимаю, отладчик тесно связан с языком, т. Е. Отладчик Java не может обрабатывать код Scala, но, очевидно, JVM является центром внимания, то есть, пока он является байт-кодом, подойдет любой отладчик.не так ли?

ВАЖНОЕ ОБНОВЛЕНИЕ: проблема заключалась в том, чтобы привести пример того, как отладчик байт-кода может ограничивать Scala.Предположим, что точка останова достигнута, и я не хочу переходить к следующей строке, но я хочу, чтобы отладчик оценивал выражение Scala в контексте приложения (например, мне нравится вызывать метод оператора из одноэлементного объекта).Отладчик застрял, потому что не может понять Scala.Я должен сам выполнить преобразование и ввести полученную Java в отладчик.Проблема заключается в том, что на уровне байт-кода можно обрабатывать только «точки останова».Что если вы хотите поставить выражение под часы?Отладчик должен понимать Scala, чтобы оценить наблюдаемое выражение, верно?На этот раз я уверен, что я прав.Месть моя, говорит Господь ;-)

1 Ответ

8 голосов
/ 14 января 2011

Короткий ответ, ваши предположения неверны.

Причина в том, что отладчику все равно, на каком языке вы отлаживаете. Он останавливается на точках останова, которые, в свою очередь, включают строку определенного исходного файла. Обратите внимание, что исходный файл - это просто текст для чтения - отладчик никогда не сканирует исходные файлы. Если вы измените место, где исходные файлы находятся, в другой каталог с текстовым файлом в правильном каталоге с правильным именем файла в качестве установленной точки останова, отладчик с радостью покажет это, когда точка останова произойдет. Каждый раз, когда вы устанавливаете точку останова, ваш идеал говорит отладчику, что он сканирует этот класс на наличие любого байтового кода в этой строке и останавливается, когда вы нажимаете на него. Это, конечно, не работает, если ваш ide пытается скомпилировать тот же текстовый файл в файл класса - однако это будет работать, если вы создадите поддельные текстовые файлы в качестве исходного файла JAR и выполните сопоставление исходного файла.

Если подумать, написать простой шаблон и скомпилировать его во время отладки поддержки не так уж и сложно. Просто используйте asm, чтобы создать все операторы печати, и скажите asm, что этот оператор печати находится в файле шаблона в этой строке. После этого вы можете добавлять более умные вещи, оставляя вещи отлаживаемыми.

...