2009-04-15 12 views
29

Używam interfejsów jdi do tworzenia debuggera i kiedy używam MethodEntryRequests, aby włączyć śledzenie wprowadzania metod, debugowany program zwalnia o współczynnik dziesiątek. Ustawiłem filtr dla głównego wątku i zawieszam zasady na SUSPEND_EVENT_THREAD. Filtr Classfilter jest ograniczony i jeśli wydrukuję jakiekolwiek odebrane zdarzenia, nie wyświetla się więcej niż kilku z nich, więc nie powinien ich odbierać zbyt dużo. Ja debugowanie lokalnie i posiadające followind rodzaj wiersza poleceń z debugowanemu programu Java:Dlaczego debugowany program jest tak wolny, gdy używa się debugowania wpisu metody?

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

+0

dobre pytanie. Zauważyłem, że punkty przerwania dla metod spowalniają znacznie podczas debugowania programów Java w środowisku Eclipse. Mam nadzieję, że ktoś ma odpowiedź! –

+0

Czy sytuacja poprawiła się w ostatnich wersjach java, czy jest taka sama? – WSS

Odpowiedz

30

Krótka odpowiedź brzmi, że wykonanie jest wykonywane przez interpreter, gdy ustawione są pozycje metod. Nie wydaje mi się, aby tak było ...

Tak było w przypadku całego kodu działającego w trybie debugowania, ale it was enhanced in 1.4 ... teraz HotSpot działa w trybie "pełnej prędkości" debugowania, z wyjątkiem przypadku wejścia i wyjścia metod, punkty obserwacji i pojedyncze kroki lub metody zawierające punkty przerwania.

+1

To naprawdę ma sens tylko ... HotSpot robi wiele miłych rzeczy przy kompilowaniu kodu, aby go przyspieszyć (włączając w to metody inline, które zacierają granice między zaangażowanymi metodami). Poza tym jest adaptacyjny, więc między biegami zmienia się sposób działania metody. Zdecydowanie nie jest to coś, co chcesz osiągnąć, gdy jesteś w trakcie debugowania. – Ichorus

5

Przypuszczam, że debugger musi się obudzić dla każdego wywołania metody, aby sprawdzić czy pasuje do jednego (s), które zostały wybrane do zerwania. Ponieważ musi sprawdzić każdą metodę wywołania potencjalnego dopasowania, zanim będzie mógł wykonać, jest znacznie wolniejszy, niż gdyby nie musiał wykonywać wszystkich tych kontroli.

9

2 powodów:

  1. musi dodać kontrole na każdym wejściu metody (nie ma opcji do dostrojenia tylko niektóre metody)
  2. metoda inline staje się niemożliwe (tak małe metody uruchamia 10-100x razy wolniej)

samo do profilowania i .NET apps

+1

Dlaczego metoda inline staje się niemożliwa? –

+4

Ponieważ metoda inlining oznacza, że ​​nie masz już tej metody - cała jej zawartość będzie INLINED we wszystkich miejscach, z których się dzwoni, a wywołanie metody nie wystąpi. Ale debugger potrzebuje tej metody, ponieważ jest to miejsce, w którym zajmuje to miejsce. – Mash

+0

Brzmi to prawidłowe, ale nie brzmi wystarczająco silne dla mnie. Metoda INLINED może nadal być śledzone przez debugger? Z technicznego punktu widzenia powinien on znać metodę otaczającą, do której się stosuje? –

Powiązane problemy