JavaRush /Java Blog /Random-KO /IntelliJ IDEA 및 디버그: 다이빙이 아닌 스노클링
Viacheslav
레벨 3

IntelliJ IDEA 및 디버그: 다이빙이 아닌 스노클링

Random-KO 그룹에 게시되었습니다
코드 작성은 전투의 절반입니다. 여전히 올바르게 작동하도록 만들어야 합니다. IDE와 디버깅 도구는 이에 대해 많은 도움을 줍니다.
IntelliJ IDEA 및 디버그: 다이빙이 아니라 스노클링 - 1
IntelliJ IDEA를 예로 들어 코드가 실행될 때 코드에 어떤 일이 발생하는지 알아내는 방법을 알아볼 것을 제안합니다. 디버그는 광범위한 주제이므로 이 리뷰에서는 다이버처럼 딥 다이빙을 제공하지 않습니다. 그러나 나는 확실히 스노클링을 희망합니다)

소개

코드 작성의 일부는 디버깅입니다. 작업에 코드 지원이 포함되어 있으면 디버깅이 훨씬 더 많이 이루어집니다. 게다가 디버깅의 도움으로 다른 사람의 코드 정글에 빠져들 수 있는 만큼 깊이 사용된 라이브러리와 프레임워크의 작업을 검사할 수 있습니다. 다이빙을 위해서는 다음이 필요합니다: 먼저, Quick Start Source Code로 다운로드한 아카이브의 압축을 풀어주세요. IntelliJ Idea를 실행하고 " 기존 소스에서 새 프로젝트 "를 만듭니다. hibernate4 하위 디렉터리에서 pom.xml 파일을 선택합니다 . 가져올 때 " Maven 프로젝트 자동 가져오기 "를 지정하고 다른 설정은 변경하지 않고 프로젝트 생성을 완료합니다. 프로젝트를 가져오는 동안 다운로드한 WildFly 애플리케이션 서버의 압축을 일부 디렉터리에 푼다. 파일 bin\standalone.bat(또는 *nix 시스템의 경우standalone.sh)을 사용하여 서버를 시작합니다. (!) --debug 매개변수로 시작하는 것이 중요합니다 . 서버가 시작될 때까지 기다립니다. 그들은 그것이 시작되었다고 우리에게 편지를 보내고 시간을 표시할 것입니다. 다음과 같이 보일 것입니다:
IntelliJ IDEA 및 디버그: 다이빙이 아니라 스노클링 - 2
다음으로, 서버에서 선택한 프로젝트를 실행해야 합니다. 이 프로세스는 프로젝트 자체에서 찾을 수 있는 작은 문서에 설명되어 있습니다. \hibernate4\README.adoc 이 문서에 표시된 대로 hibernate4 디렉터리에서 명령을 실행해야 합니다. mvn clean package wildfly:deploy 빌드가 성공적으로 완료되었다는 메시지를 기다리고 있습니다.
IntelliJ IDEA 및 디버그: 다이빙이 아니라 스노클링 - 3
그런 다음 서버 로그에서 새 프로젝트가 어떻게 "배포"되었는지 확인할 수 있습니다.
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 4
그런 다음 해당 페이지로 이동하면 “ 회원 등록http://localhost:8080/wildfly-hibernate4 ” 양식이 있는 페이지가 표시됩니다 . 이제 실험 준비가 완료되었으며 시작할 수 있습니다.)) 명확성을 위해 앞으로 많은 사진이 있을 것이므로 준비하세요)

원격 디버그

따라서 IDE가 애플리케이션 서버의 코드 실행을 제어하도록 디버그 모드를 구성해야 합니다. IntelliJ Idea는 무료(Community)와 유료(Ultimate)의 두 가지 버전으로 제공됩니다. 후자는 공식적으로 EAP 형태로 시도될 수 있습니다. Ultimate 버전에서는 모든 것이 간단합니다. 애플리케이션 서버는 디버그 모드의 IDE에서 직접 시작할 수 있습니다. 하지만 커뮤니티 버전에서는 몇 가지 작업을 수동으로 수행해야 합니다. 그러므로 좀 더 복잡한 경우, 즉 다음과 같은 경우를 생각해 봅시다. 커뮤니티 버전에서 설정합니다. Community 버전에는 몇 가지 제한 사항이 있습니다. 특히, 여기에서는 애플리케이션 서버를 실행할 수 없습니다. 그러나 필요한 애플리케이션이 포함된 실행 중인 서버가 별도로 어딘가에 있는 경우 원격 디버깅(원격 디버그)을 설정할 수 있습니다. IntelliJ Idea 커뮤니티 에디션의 원격 디버그 Wildfly (포트 8787에 대한 원격 실행 구성 설정) 의 설정 설명을 사용해 보겠습니다 . 구성 후에는 디버그 모드에서 새 구성을 시작합니다.
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 5
모든 것이 정상이면 아래에 이에 대한 메시지가 표시됩니다.
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 6

디버그 프로세스

레코드 저장을 디버그해 보겠습니다. 그러기 위해서는 먼저 탐색할 장소를 결정해야 합니다. 창으로 판단하면 "등록"버튼이 필요합니다. 코드에서 찾아보자. 따라서 요소가 필요합니다. 여기에는 "Register"라는 텍스트가 있어야 합니다. 아니면 그녀가 그것과 관련이 있어야합니다. 따옴표에 등록을 클릭 Ctrl+Shift+F하고 찾아보세요. index.xhtml에 하나가 있다는 것을 알 수 있습니다.
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 7
찾은 소스로 이동하려면 Enter를 누르세요.
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 8
등록할 때 memberController.register가 호출되는 것을 볼 수 있는데, 분명히 이것은 일종의 Java 클래스임에 틀림없습니다. 다음을 클릭 Ctrl+N하고 검색하세요.
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 9
실제로 그런 수업이 있습니다. 그것에 들어가 보자. 분명히, 등록 방법이 있어야 합니다. 클릭해서 Ctrl+F12등록방법을 찾아보세요
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 10
실제로 우리는 그것을 찾았습니다. 분명히 여기, memberRegistration.register 에서 등록이 발생합니다 . Ctrl 키를 누른 채 해당 메서드를 클릭하여 "빠져 들어가"십시오.
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 11
이제 "중단점" 또는 중단점을 설정해 보겠습니다. 이는 코드 실행을 일시 중지해야 하는 위치를 알려주는 마커입니다. 이 순간 우리는 많은 흥미로운 것들을 배울 기회를 갖게 될 것입니다. 그것을 넣으려면 줄 번호 오른쪽에 있는 곳을 클릭해야 합니다.
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 12
http://localhost:8080/wildfly-hibernate4 페이지에서 필드를 입력하고 등록 버튼을 클릭하세요. 패널의 아이디어 아이콘이 깜박입니다.
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 13
Idea로 이동하면 디버그 패널에 흥미로운 정보가 많이 있는 것을 볼 수 있습니다.
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 14
여기에서 개체 필드의 값을 볼 수 있습니다. 예를 들어 등록된 회원은 다음과 같이 구성됩니다.
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 15
엄청난. 또 무엇을 할 수 있나요? 상황에 맞는 메뉴를 열고 거기서 표현식 평가를 선택합니다(또는 실행 -> 표현식 평가 메뉴를 통해). 더 좋은 점은 디버거 제어판에서 다음을 수행하는 것입니다.
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 16
이는 중단점에서 해당 코드 포인트가 액세스할 수 있는 모든 것에 액세스하고 해당 지점에서 실행될 수 있는 모든 코드를 실행할 수 있는 매우 멋진 기능입니다. 예를 들어:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 17
디버거 제어판에는 프로그램 흐름 제어를 이동할 위치를 담당하는 제어 버튼도 있습니다. 마술 아닌가요?) F8(Step Out) 버튼을 누르면 메소드 입력 없이 코드를 따라가게 됩니다. F9 키를 누르면 디버거를 사용하여 코드 줄을 살펴보는 것을 중단하고 디버거가 프로그램 실행을 제어할 수 있게 됩니다. F7(한 단계씩 실행)을 누르면 코드를 살펴보며 도중에 만나는 각 메서드를 입력하게 됩니다. 그런데 이 정보 블록에 특별한 주의를 기울이십시오.
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에는 공개 저장소가 있습니다. 따라서 Google "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파일을 검색하세요. 따라서 논리에 따르면 라이브러리가 포함된 파일이 필요합니다. 즉, 항아리가 필요합니다. 내부에 TransactionScopedEntityManager 클래스가 있어야 합니다. 왜냐하면 class = file, 그런 다음 "contains"를 찾으세요. 즉, 다음과 같습니다.
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 22
이제 결과를 기다려 보겠습니다. 그는 당신을 기다리게 하지 않을 것이다)
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 23
이제 어딘가에서 소스 코드를 찾아야 합니다. 그리고 두 가지 옵션이 있습니다: 아마도 두 번째 것을 사용해 봅시다. 거기에서 찾아보자:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 24
이제 종속성을 설명하겠습니다. 이 페이지에서는 소스코드를 다운로드할 수 있습니다. 좋습니다. 이제 코드를 다운로드했습니다. 남은 것은 라이브러리를 연결하는 것뿐입니다. 매우 간단하게 연결됩니다. 프로젝트 설정을 열어야 합니다.
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 25
여기서 "라이브러리"를 선택하고 수신된 소스 코드를 "소스" 섹션에 추가하고 "클래스" 섹션에서는 Far Manager를 사용하여 찾은 WildFly 디렉터리의 라이브러리 jar 파일 자체를 나타냅니다. 이후 F7을 통해 탐색하면 AbstractEntityManager 및 TransactionScopedEntityManager 클래스의 내용이 표시되며 Ctrl+N을 사용하여 클래스별로 검색을 통해서도 사용할 수 있게 됩니다.

조건이 있는 중단점

이제 Break Point로 돌아가 보겠습니다. 때때로 우리는 항상 멈추고 싶지는 않지만 어떤 조건에서만 멈추고 싶어합니다. 무엇을 해야 할까요? 그리고 여기서 우리 IDE도 우리를 도울 것입니다. 중단점을 배치하여 조건을 할당할 수 있습니다. 예를 들어, 점을 놓고 마우스 오른쪽 버튼을 클릭합니다.
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 26
이제 중단점은 이름이 Maximilian인 경우에만 실행됩니다. 자세히 버튼을 클릭하면 중단점에 대한 확장된 설정 세트를 사용할 수 있습니다.

예외에 대한 중단점

때로는 오류가 발생하여 오류가 어디서 발생했는지 추적하고 싶을 수도 있습니다. 그런 다음 특정 코드 줄이 아닌 예외가 발생하는 위치에 중단점을 추가할 수 있습니다. 이렇게 하려면 모든 중단점 목록을 확장해야 합니다.
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 27
선택한 예외 유형에 대한 새 규칙을 만듭니다.
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 28
예를 들어 NPE의 경우:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 29

HotSwap 클래스

디버거는 놀라운 것입니다. 디버깅 외에도 클래스를 변경할 수 있습니다! 예, 리소스(예: xhtml 페이지)는 쉽게 변경할 수 없습니다. 그러나 Java 클래스의 코드는 즉시 교체될 수 있습니다(이를 핫 스왑이라고 함). 이렇게 하려면 디버거가 연결된 클래스를 변경하고 실행 -> 변경된 클래스 다시 로드를 실행하면 됩니다. 이 주제에 대한 유용한 리뷰: JVM에서 코드를 핫스왑하는 4가지 무료 방법

결론

디버거는 개발자가 실행 코드의 깊이까지 침투하여 모든 세부 사항을 연구할 수 있게 해주는 강력한 도구입니다. 이를 통해 가장 혼란스러운 오류를 수정할 수 있습니다. 또한 특정 라이브러리의 작동 방식을 더 잘 이해할 수 있습니다. 이렇게 간단한 리뷰라도 꽤 인상적이었는데, 유익하고 흥미로웠으면 좋겠습니다. 누구든지 이 자료에 관심이 있다면 다음 링크를 사용하여 다이빙을 계속할 수 있습니다.
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 30
#비아체슬라프
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION