Почему отлаживаемая программа так сильно тормозит при использовании отладки с помощью ввода метода?

StackOverflow https://stackoverflow.com/questions/751105

  •  09-09-2019
  •  | 
  •  

Вопрос

Я использую интерфейсы jdi для создания отладчика, и когда я использую MethodEntryRequests, чтобы включить отслеживание ввода метода, отлаживаемая программа замедляется в десятки раз.Я установил фильтр для основного потока и политику приостановки на SUSPEND_EVENT_THREAD.Фильтр классов ограничен, и если я печатаю какие-либо полученные события, он отображает не более пары десятков из них, поэтому он не должен получать их слишком много.Я выполняю отладку локально и использую следующую командную строку с отлаживаемой Java-программой:

-Xdebug -Xrunjdwp:transport=dt_socket,suspend=y,server=y,address=1337

Это было полезно?

Решение

Короткий ответ: выполнение выполняется через интерпретатор, когда установлены записи метода.Я не думаю, что здесь что-то есть...

Раньше это имело место для всего кода, работающего в режиме отладки, но он был улучшен в 1.4...теперь HotSpot работает для «полноскоростной» отладки, за исключением случаев входа и выхода метода, точек наблюдения и одношаговой отладки или методов, содержащих точки останова.

Другие советы

2 причины:

  1. Он должен добавить чеки на каждую запись метода (нет возможности настройки только некоторых методов)
  2. Метод внедрения становится невозможным (поэтому небольшие методы работают на 10-100 раз медленнее)

то же самое касается профилировщиков и приложений .net.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top