JavaRush /Java блог /Random UA /IntelliJ IDEA і Debug: не дайвінг, але снорклінг
Viacheslav
3 рівень

IntelliJ IDEA і Debug: не дайвінг, але снорклінг

Стаття з групи Random UA
Написати код – стать справи. Потрібно його змусити працювати правильно. У цьому нам дуже сильно допомагають IDE та засоби налагодження.
IntelliJ IDEA і Debug : Не дайвінг, але снорклінг - 1
На прикладі IntelliJ IDEA пропоную познайомитися з тим, як ми можемо дізнатися, що відбувається з нашим кодом, коли він працює. Debug тема велика, тому даний огляд на глибоке занурення, немов дайвер, не пропонує. Але сподіваюся снорклінг точно )

Вступ

Частина написання коду – його налагодження, дебаг (англ. debug). А якщо в завдання входить підтримка коду – налагодження буде ще більшим. Ну і крім того, за допомогою налагодження можна дослідити роботу бібліотек і фреймворків, що використовуються, так глибоко, як тільки зможете зануритися в нетрі чужого коду. Для нашого занурення нам знадобиться: Для початку розпаковуємо завантажений архів з Quick Start Source Code. Запускаємо IntelliJ Idea і створюємо " New Project from Existing Sources ". Вибираємо в підкаталозі hibernate4 файл pom.xml . При імпорті вказуємо " Import Maven projects automatically " і завершуємо створення проекту залишаючи інші налаштування без змін. Поки імпортується проект, розархівуємо завантажений сервер додатків WildFly в якийсь каталог. Запускаємо сервер за допомогою файлу bin\standalone.bat(або standalone.sh для систем *nix). (!) Важливо запустити з параметром --debug Очікуємо, коли сервер стартує. Нам напишуть, що він started in та вкажуть час. Виглядатиме це приблизно так:
IntelliJ IDEA і Debug : Не дайвінг, але снорклінг - 2
Далі потрібно запустити вибраний проект на сервері. Цей процес описаний у невеликій документації, яку можна знайти в самому проекті: \hibernate4\README.adoc Як і зазначено в цій документації, нам потрібно в каталозі hibernate4 виконати команду: mvn clean package wildfly:deploy Очікуємо, коли нам напишуть, що збірка виконана успішно:
IntelliJ IDEA і Debug : Не дайвінг, але снорклінг - 3
Після цього в лозі сервера ми можемо побачити, як "задеплоївся" новий проект:
IntelliJ IDEA і Debug : Не дайвінг, але снорклінг - 4
Після цього ми переходимо на сторінку http://localhost:8080/wildfly-hibernate4і у нас має відобразитися сторінка з формою " Member Registration ". Отже, наша підготовка до експериментів виконана і ми можемо починати)) Попереду для наочності буде багато картинок, так що приготуйтеся)

Remote Debug

Отже, нам потрібно налаштувати режим Debug, щоб наша IDE керувала виконання коду на сервері додатків. IntelliJ Idea поставляється у двох варіантах: безкоштовний (Community) та платний (Ultimate). Останній можна офіційно спробувати як EAP. У Ultimate версії все просто – сервер додатків можна запускати відразу з IDE у режимі дебагу. А ось у Community версії треба небагато дій зробити вручну. Тому, розглянемо випадок складніше, тобто. налаштування в Community версії. У Community версії є деякі обмеження. Зокрема, з неї не можна запускати сервер додатків. Але можна налаштувати віддалену налагодження (Remote Debug), коли десь окремо є запущений сервер із потрібним нам додатком. Скористайтеся описом налаштування звідси: Remote debug Wildfly in IntelliJ Idea community edition(Налаштування Remote Run Configuration для 8787 порту). Після налаштування запускаємо в Debug режимі нашу нову конфігурацію:
IntelliJ IDEA і Debug : Не дайвінг, але снорклінг - 5
Якщо все добре, ми побачимо внизу про це повідомлення:
IntelliJ IDEA і Debug : Не дайвінг, але снорклінг - 6

Процес Debug'а

Давайте «відпочинимо» збереження запису. Для цього треба спочатку визначитися з місцем, де ми будемо досліджувати. Судячи з вікна, нам потрібна кнопка Register. Давайте знайдемо її у коді. Отже, нам потрібний елемент, у нього має бути текст: "Register". Або вона має якось ставитися до цього. Натискаємо Ctrl+Shift+Fта шукаємо Register у лапках. Бачимо, що така є на index.xhtml.
IntelliJ IDEA і Debug : Не дайвінг, але снорклінг - 7
Натискаємо Enter для переходу до знайденого джерела:
IntelliJ IDEA і Debug : Не дайвінг, але снорклінг - 8
Отже, бачимо, що з реєстрації викликається memberController.register Судячи з усього, це має бути деякий java клас. Натискаємо Ctrl+N, шукаємо:
IntelliJ IDEA і Debug : Не дайвінг, але снорклінг - 9
Справді такий клас є . Переходимо до нього. Мабуть, тут має бути метод register. Натискаємо Ctrl+F12та шукаємо метод register
IntelliJ IDEA і Debug: Не дайвінг, але снорклінг - 10
Справді знайшли. Зважаючи на все, реєстрація відбувається тут, в memberRegistration.register . Натискаємо Ctrl і клацаємо за методом, щоб «провалитися» в нього:
IntelliJ IDEA і Debug : Не дайвінг, але снорклінг - 11
Давайте тепер поставимо точку зупинки або Break Point. Це такий маркер, який каже, де виконання коду має призупинитись. Ми зараз отримаємо можливість дізнатися багато цікавого. Щоб його поставити потрібно клікнути в місце правіше за номер рядка.
IntelliJ IDEA і Debug : Не дайвінг, але снорклінг - 12
На сторінці http://localhost:8080/wildfly-hibernate4 заповнюємо поля та натискаємо кнопку Register. Значок ідеї на панелі блимає:
IntelliJ IDEA і Debug : Не дайвінг, але снорклінг - 13
Перейшовши в Idea видно, що на панелі налагодження багато цікавої інформації:
IntelliJ IDEA і Debug : Не дайвінг, але снорклінг - 14
Тут можна переглянути значення полів об'єкта. Наприклад, з чого складається Member, що реєструється:
IntelliJ IDEA і Debug : Не дайвінг, але снорклінг - 15
Чудово. Що ми можемо зробити? Ми можемо відкрити контекстне меню та вибрати там Evaluate Expression (або через меню Run -> Evaluate Expression). А ще краще на панелі керування дебаггером:
IntelliJ IDEA і Debug: Не дайвінг, але снорклінг - 16
Це супер чудова можливість у точці зупинки, маючи доступ до всього, до чого є доступ до цього місця коду, виконати будь-який код, який можна було б виконати у цьому місці. Наприклад:
IntelliJ IDEA і Debug: Не дайвінг, але снорклінг - 17
На панелі керування дебаггером є також кнопки керування, які відповідають за те, куди необхідно перемістити керування ходом виконання програми. Чи не так, магія?) Натискаючи кнопку F8 (Step Out) ми ходимо за кодом без заходів у методи. Натиснувши F9 ми припиняємо ходити рядками коду дебаггером, а віддаємо дебаггером керування ходом виконання програми. Якщо ми натиснемо F7 (Step Into), то ми підемо за кодом із заходом у кожний метод, який зустрінемо на своєму шляху. До речі, зверніть особливу увагу на цей інформаційний блок:
IntelliJ IDEA і Debug: Не дайвінг, але снорклінг - 18
Тут показаний потік, у якому ми і методи у стеку поточного потоку. Але це ще не все. Для зручності можна відкрити вкладку кадрів. Для цього вона має бути включена:
IntelliJ IDEA і Debug: Не дайвінг, але снорклінг - 19
Тепер вкладці фреймів бачимо інформацію про перехід від методу до методу, т.к. почали ходити за кодом за допомогою Step Into.
IntelliJ IDEA і Debug : Не дайвінг, але снорклінг - 20
Як бачимо, який завжди нас може перекинути туди, де зараз виконання програми. Ми зараз перебуваємо в «getDelegate:469, AbstractEntityManager (org.jboss.as.jpa.container)». Але насправді ми в реалізації. Про це свідчить клас, зазначений у цьому:
IntelliJ IDEA і Debug : Не дайвінг, але снорклінг - 21
Дивимося на це. Як відомо, він вказується на поточний об'єкт. Ми в TransactionScopedEntityManager. Чому ж Idea нам не може показати код? Справа в тому, що IntelliJ Idea зараз не знає ні про яку TransactionScopedEntityManager, т.к. він не підключений до нашого проекту (його немає у залежностях проекту). Коли працює сервер додатків, то всередині нього крутиться багато всяких бібліотек. А про них відомо дуже мало, т.к. у загальному випадку нам не потрібно копатися у нутрощах, нам потрібно, щоб воно просто працювало. Але іноді цього потребує робота чи спортивний інтерес. Тоді треба про цю бібліотеку повідомляти Idea, щоб вона знала, де брати код класів.

Підключення сторонніх бібліотек для дебагу

Спершу нам самим потрібно зрозуміти, що ж це за бібліотека, яку потрібно підключити. Перший шлях він найважчий – шукати в інтернеті. Швидкість та результат знаходження результату сильно залежать від того, наскільки добре вели проект. Наприклад, WildFly має відкритий репозиторій. Тому, при пошуку в куті "TransactionScopedEntityManager" ми вийдемо на https://github.com/wildfly/wildfly/tree/master/jpa/subsystem і знайдемо, що нам потрібен wildfly-jpa. Другий спосіб – правильний. Де лежить сервер, там шукати. У цьому можуть допомогти різні засоби. Наприклад, на Windows це може бути Far Manager . Далі приклад алгоритму пошуку наведено на ньому. Встановивши та запустивши його, перемикаємось за допомогою Tabна одну із вкладок, за допомогою Alt+F1для лівої вкладки або Alt+F2для правої та вибираємо потрібний нам розділ на жорсткому диску. Цілком можливо, що Far Manager після установки відкритий каталог самого Far Manager. Щоб перейти в корінь диска, натисніть Ctrl + \. За допомогою Alt+Fвідкриваємо віконце пошуку, починаємо набирати назву каталозі та натискаємо Enter після того, як каталог знайдено. Цей пошук хитрий і виділяє каталоги, які збігаються з текстом пошуку. Якщо вводяться символи, для яких немає папок, такі символи не можна ввести. Переходимо у каталог сервера додатків. Допустимо, ми не знаємо, де на сервері лежать модулі. Можливо, Ви взагалі вперше чуєте про якийсь там WildFly. Тому, натискаємо одразу тутAlt+F7для пошуку файлів. Отже, логіка підказує: нам потрібний файл із бібліотекою. Тобто нам потрібне jar. Всередині повинен бути клас TransactionScopedEntityManager. Т.к. клас = файл, то шукаємо по «містить». Тобто якось так:
IntelliJ IDEA і Debug : Не дайвінг, але снорклінг - 22
Тепер, чекаємо на результат. Він не змусить себе чекати)
IntelliJ IDEA і Debug : Не дайвінг, але снорклінг - 23
Тепер нам треба десь знайти вихідний код для нього. І тут є 2 варіанти: Скористаємося, мабуть, другим. Знайдемо там:
IntelliJ IDEA і Debug : Не дайвінг, але снорклінг - 24
Тепер переходимо до опису залежності. На цій сторінці можна завантажити вихідний код. Відмінно, тепер код у нас завантажений. Залишилось підключити бібліотеку. Підключається вона дуже просто. Нам потрібно відкрити налаштування проекту:
IntelliJ IDEA і Debug : Не дайвінг, але снорклінг - 25
Там вибираємо "Libraries" і в розділ "Sources" додаємо отримані вихідні коди, а в розділі "Classes" вказуємо сам jar файл бібліотеки з каталогу WildFly, який нами був знайдений за допомогою Far Manager'а. Після цього ми побачимо при переході по F7 вміст класу AbstractEntityManager і TransactionScopedEntityManager, а також стане доступним через пошук за класами через Ctrl+N.

Break Points з умовами

Повернемось тепер до Break Points. Іноді ми хочемо зупинитися не завжди, а лише за якоїсь умови. Що ж робити? І тут нам також допоможе наша IDE. Поставивши Break Point, ми можемо призначити їй умову. Наприклад, поставимо крапку та натиснемо по ній правою кнопкою миші:
IntelliJ IDEA і Debug : Не дайвінг, але снорклінг - 26
Тепер точка зупинки буде працювати тільки тоді, коли ім'я буде Maximilian. На кнопці More Вам будуть доступні розширений набір для Break Point'ів.

Break Points на винятки

Іноді ми можемо отримувати помилку і хочеться простежити, звідки вона йде. Тоді ми можемо додати точку зупинки не на конкретний рядок коду, а на місце, де буде кинуто виняток. Для цього потрібно розкрити список усіх точок зупинки:
IntelliJ IDEA і Debug: Не дайвінг, але снорклінг - 27
І створити нове правило для вибраного типу виключення:
IntelliJ IDEA і Debug : Не дайвінг, але снорклінг - 28
Наприклад, для NPE:
IntelliJ IDEA і Debug : Не дайвінг, але снорклінг - 29

HotSwap класів

Дебаггер - дивовижна річ. Вона, крім дебагу, дозволяє змінювати класи! Так, ресурси (такі як xhtml стріниці, наприклад) не змінити так просто. Але код java класів можна підмінити на льоту (це і називається Hot Swap). Для цього достатньо при приєднаному дебаггері змінити клас і виконати Run -> Reload Changed Classes. Корисний огляд на цю тему: 4 free ways to hot-swap code on the JVM

Висновок

Дебаггер - потужний інструмент, що дозволяє розробнику проникнути в саму глибину коду, що виконується, вивчити його у всіх деталях. Це дозволяє виправляти заплутані помилки. Також це дозволяє краще зрозуміти те, як ті чи інші бібліотеки працюють. Навіть такий короткий огляд вийшов досить значним, але я сподіваюся він буде корисним і цікавим. Якщо когось зміг зацікавити цей матеріал, то продовжити занурення можна за посиланнями:
IntelliJ IDEA і Debug: Не дайвінг, але снорклінг - 30
#Viacheslav
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ