Отладка Java-сервлетов

    Несмотря на то, что я пишу на Java уже 2 месяца (о да, это срок :) ), я ни разу не запускал remote debugger. При разработке на GWT этого делать и не нужно — оно как-то само всё это делает. :) Но вот настала весна, моё GWT приложения распустилось, и хочет, чтобы я его выложил на сервер. Но вдруг выяснилось, что просто так оно работать не захотело. А почему, я понять не могу. И значит мне нужен дебагер.

    Принцип работы наверное любого удалённого отладчика (remote debugger) прост — контейнер (это может быть и какой-либо сервлет-контейнер, и php-интерпритатор. Полагаю, что интерпритаторы Ruby, Perl, Python работают аналогичным образом), который выполняет приложение настраивается таким образом, что при запуске приложения он либо начинал слушать определенный порт, либо сам пытался коннектиться куда-либо.

    Для того, чтобы заставить Java-машину включить отладчик и повесить его на определённый порт, нужно указать в командной строке следующие параметры:

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

    Для того, чтобы tomcat запускался всегда с этими параметрами, вам придётся поправить старт-скрипт. В моём случае это /etc/init.d/tomcat5.5.

    После того, как вы перезапустите tomcat при помощи вашего исправленого скрипта, вы можете проверить, запустился ли дебагер, попытавшись подключиться к указаному вами порту. В моём случае это порт 8000:

    telnet localhost 8000

    Если подключиться не удалось, значит вы что-то сделали не так. Если вам всё же повезло, то вы можете смело открывать свою любимую IDE, конфигурировать её на работу с вашей Java-машиной (я уверен, что теперь вы сможете делать это более вдумчиво) и наслаждаться работой.

    P.S. При помощи дебагера мне удалось выяснить что проблема была в вылетающем исключении на стадии сериализации RPC-ответа. Следующие сутки я потратил на то, чтобы разобраться почему всё же этот эксепшен (java.security.AccessControlException) случается. Оказалось, что tomcat умеет ограничивать права выполняемых сервлетов, и в моём случае он ограничивал раже доступ к рефлекшену сериализуемых объектов. Думаю, что система безопасности tomcat — это тема для отдельного топика, которым я когда-нибудь разрожусь.

    Комментарии 5

      0
      В блог «Java» перенесите пожалуйста.
        0
        Вы думаете что это полезное уникальное знание? Даже не смотря на 375000 результатов выднных гуглом на запрос «remote debug java»?

        ЗЫ: Не холи вара для, но idea замечательно умеет дебагить и запускать дает параметры которые необходимы для запуска в режиме remote дебаг.

          0
          Да. Действительно в гугле я нашел очень много всевозможных howto на английском. Мне не понравилось в них то, что:
          — они написаны на английском. С английским я дружу, но с ним у меня гораздо более прохладные отношения, чем с русским.
          — они написаны в стиле step-by-step, без объяснений, как же это работает на самом деле, и зачем вы проводите все эти манипуляции.

          И я решил, что возможно, таким новичкам как я будет полезно в 3-х абзацах узнать, как же вообще взаимодействует IDE и Java-машина в режиме отладки. Вот почему я написал эту заметку.

          P.S. Я пользуюсь Eclipse. И мне было просто интересно узнать, что происходит, когда я нажимаю на кнопку debug. Теперь я владею этим священым знанием и рад, что поделился им с миром.
            0
            > они написаны на английском. С английским я дружу, но с ним у меня гораздо более прохладные отношения, чем с русским
            Учите английский, на нем не только много how-to, но и другой литературы, которую переводить никто и не собирается, а когда переведут — она уже будет не актуальна.
            > они написаны в стиле step-by-step, без объяснений, как же это работает на самом деле, и зачем вы проводите все эти манипуляции.
            А чем ваше хавту отличается? Теже самые magic параметры, без подробных обьяснений, что как и какие-есть варианты.

            — Вопрос как пользователю эклипса, я тут на досуге пытался его попинать, но впечатления не самые радостные. Как мне указать что jar из зависимостей проекта нужно паковать в web-inf/lib?
              0
              Уже было написал вам ответ, но потом стёр. Вы меня зачем-то пытаетесь спровоцировать на совершенно дурацкий спор. Топик в небольшом плюсе, значит он оказался кому-то полезным. Это всё, что у меня есть сказать вам по этому поводу.
              Вопрос как пользователю эклипса, я тут на досуге пытался его попинать, но впечатления не самые радостные. Как мне указать что jar из зависимостей проекта нужно паковать в web-inf/lib?
              Ответа на этот вопрос я не знаю. Возможно вам стоит посмотреть во вкладку Java Build Path в параметрах проекта. Пути задаются там.

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

        Самое читаемое