JavaRush /Blog Java /Random-VI /IntelliJ IDEA và Debug: không phải lặn mà là lặn với ống ...
Viacheslav
Mức độ

IntelliJ IDEA và Debug: không phải lặn mà là lặn với ống thở

Xuất bản trong nhóm
Viết mã là một nửa trận chiến. Nó vẫn cần phải được thực hiện để hoạt động chính xác. IDE và các công cụ gỡ lỗi giúp chúng ta rất nhiều trong việc này.
IntelliJ IDEA và Debug: Không phải lặn mà là lặn với ống thở - 1
Sử dụng IntelliJ IDEA làm ví dụ, tôi đề xuất làm quen với cách chúng ta có thể tìm hiểu điều gì xảy ra với mã của mình khi nó chạy. Gỡ lỗi là một chủ đề rộng, vì vậy bài đánh giá này không cung cấp khả năng lặn sâu, giống như thợ lặn. Nhưng tôi hy vọng chắc chắn sẽ được lặn với ống thở)

Giới thiệu

Một phần của việc viết mã là gỡ lỗi nó. Và nếu nhiệm vụ của bạn bao gồm hỗ trợ mã, sẽ có nhiều lần gỡ lỗi hơn. Ngoài ra, với sự trợ giúp của tính năng gỡ lỗi, bạn có thể kiểm tra hoạt động của các thư viện và khung công tác được sử dụng một cách sâu sắc như thể bạn có thể đắm mình trong rừng mã của người khác. Đối với chuyến lặn của chúng tôi, chúng tôi sẽ cần: Đầu tiên, giải nén kho lưu trữ đã tải xuống bằng Mã nguồn bắt đầu nhanh. Khởi chạy IntelliJ Idea và tạo “ Dự án mới từ các nguồn hiện có ”. Chọn tệp pom.xml trong thư mục con hibernate4 . Khi nhập, hãy chỉ định “ Tự động nhập dự án Maven ” và hoàn tất quá trình tạo dự án, giữ nguyên các cài đặt khác. Trong khi dự án đang được nhập, hãy giải nén máy chủ ứng dụng WildFly đã tải xuống vào một thư mục nào đó. Chúng tôi khởi động máy chủ bằng tệp (hoặc Standalone.sh cho hệ thống *nix). (!) Điều quan trọng là bắt đầu với tham số --debug , chúng ta đợi máy chủ khởi động. Họ sẽ viết thư cho chúng tôi rằng nó đã bắt đầu và cho biết thời gian. Nó sẽ trông giống như thế này: bin\standalone.bat
IntelliJ IDEA và Debug: Không phải lặn mà là lặn với ống thở - 2
Tiếp theo, chúng ta cần chạy dự án mà chúng ta đã chọn trên máy chủ. Quá trình này được mô tả trong một tài liệu nhỏ có thể tìm thấy trong chính dự án: \hibernate4\README.adoc Như đã nêu trong tài liệu này, chúng ta cần chạy lệnh trong thư mục hibernate4: mvn clean package wildfly:deploy Chúng tôi đang đợi thông báo rằng quá trình xây dựng đã hoàn tất thành công:
IntelliJ IDEA và Debug: Không phải lặn mà là lặn với ống thở - 3
Sau đó, trong nhật ký máy chủ, chúng ta có thể thấy dự án mới đã được “triển khai” như thế nào:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 4
Sau đó, chúng ta đi đến trang http://localhost:8080/wildfly-hibernate4và sẽ hiển thị một trang có biểu mẫu “ Đăng ký thành viên ”. Vậy là quá trình chuẩn bị cho thí nghiệm của chúng ta đã hoàn tất và chúng ta có thể bắt đầu)) Sẽ có rất nhiều hình ảnh phía trước cho rõ ràng, vì vậy hãy chuẩn bị sẵn sàng)

Gỡ lỗi từ xa

Vì vậy, chúng ta cần định cấu hình chế độ Gỡ lỗi để IDE kiểm soát việc thực thi mã trên máy chủ ứng dụng. IntelliJ Idea có hai phiên bản: miễn phí (Cộng đồng) và trả phí (Cuối cùng). Loại thứ hai có thể được thử chính thức dưới dạng EAP. Trong phiên bản Ultimate, mọi thứ đều đơn giản - máy chủ ứng dụng có thể được khởi chạy trực tiếp từ IDE ở chế độ gỡ lỗi. Nhưng trong phiên bản Cộng đồng, bạn cần thực hiện một số thao tác theo cách thủ công. Do đó, hãy xem xét một trường hợp phức tạp hơn, tức là cài đặt trong phiên bản Cộng đồng. Phiên bản Cộng đồng có một số hạn chế. Đặc biệt, bạn không thể chạy máy chủ ứng dụng từ nó. Nhưng bạn có thể thiết lập gỡ lỗi từ xa (Remote Debug), khi ở đâu đó riêng biệt có một máy chủ đang chạy với ứng dụng chúng ta cần. Hãy sử dụng mô tả thiết lập từ đây: Gỡ lỗi từ xa Wildfly trong phiên bản cộng đồng IntelliJ Idea (thiết lập Cấu hình chạy từ xa cho cổng 8787). Sau khi cấu hình, chúng tôi khởi chạy cấu hình mới ở chế độ Gỡ lỗi:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 5
Nếu tất cả đều ổn, chúng ta sẽ thấy một thông báo về điều này bên dưới:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 6

Quá trình gỡ lỗi

Hãy gỡ lỗi lưu bản ghi. Để làm được điều này, trước tiên chúng ta phải quyết định địa điểm mà chúng ta sẽ khám phá. Đánh giá qua cửa sổ, chúng ta cần nút “Đăng ký”. Hãy tìm nó trong mã. Vì vậy, chúng ta cần một phần tử, nó phải có dòng chữ: "Đăng ký". Hoặc cô ấy nên có một cái gì đó để làm với nó. Nhấp vào Ctrl+Shift+Fvà tìm kiếm Đăng ký trong dấu ngoặc kép. Chúng tôi thấy rằng có một cái trên index.xhtml.
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 7
Nhấn Enter để đi đến nguồn tìm thấy:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 8
Vì vậy, chúng ta thấy rằng khi đăng ký, memberController.register được gọi. Rõ ràng, đây phải là một loại lớp java nào đó. Bấm vào Ctrl+Nvà tìm kiếm:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 9
Quả thực có một lớp học như vậy. Chúng ta hãy đi sâu vào nó. Rõ ràng, nên có một phương pháp đăng ký. Nhấp Ctrl+F12và tìm phương thức đăng ký
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 10
Quả thực, chúng tôi đã tìm thấy nó. Rõ ràng, việc đăng ký diễn ra ở đây, trong memberRegistration.register . Nhấn Ctrl và click vào phương thức để “đi xuyên qua” nó:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 11
Bây giờ chúng ta hãy đặt “điểm ngắt” hoặc Điểm dừng. Đây là điểm đánh dấu cho biết nơi thực thi mã sẽ tạm dừng. Lúc này chúng ta sẽ có cơ hội học hỏi được rất nhiều điều thú vị. Để đặt nó, bạn cần nhấp vào vị trí bên phải số dòng.
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 12
Trên trang http://localhost:8080/wildfly-hibernate4 điền vào các trường và nhấp vào nút Đăng ký. Biểu tượng ý tưởng trên bảng sẽ nhấp nháy:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 13
Vào Idea các bạn có thể thấy có rất nhiều thông tin thú vị trong debug panel:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 14
Tại đây bạn có thể thấy giá trị của các trường của đối tượng. Ví dụ: Thành viên đã đăng ký bao gồm những gì:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 15
Tuyệt vời. Ta còn làm gì khác được nữa? Chúng ta có thể mở menu ngữ cảnh và chọn Đánh giá biểu thức ở đó (hoặc thông qua menu Chạy -> Đánh giá biểu thức). Tốt hơn nữa, trên bảng điều khiển trình gỡ lỗi:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 16
Đây là một khả năng cực kỳ thú vị tại một điểm dừng, có quyền truy cập vào mọi thứ mà điểm mã đó có quyền truy cập, để thực thi bất kỳ mã nào có thể được thực thi tại thời điểm đó. Ví dụ:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 17
Ngoài ra còn có các nút điều khiển trên bảng điều khiển trình gỡ lỗi chịu trách nhiệm về nơi bạn muốn di chuyển điều khiển luồng chương trình. Đó không phải là phép thuật sao?) Bằng cách nhấn nút F8 (Bước ra), chúng ta xem qua mã mà không cần nhập phương thức. Bằng cách nhấn F9, chúng tôi dừng việc duyệt qua các dòng mã bằng trình gỡ lỗi và cung cấp cho trình gỡ lỗi quyền kiểm soát việc thực thi chương trình. Nếu chúng ta nhấn F7 (Step Into), thì chúng ta sẽ xem qua mã, nhập từng phương thức mà chúng ta gặp trong quá trình thực hiện. Nhân tiện, hãy đặc biệt chú ý đến khối thông tin này:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 18
Điều này hiển thị luồng chúng ta đang ở và các phương thức trên ngăn xếp của luồng hiện tại. Nhưng đó không phải là tất cả. Để thuận tiện, bạn có thể mở tab khung. Để làm điều này nó phải được kích hoạt:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 19
Bây giờ trên tab khung, chúng ta thấy thông tin về quá trình chuyển đổi từ phương thức này sang phương thức khác, bởi vì bắt đầu xem qua mã bằng Step Into.
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 20
Như chúng ta thấy, không phải lúc nào chúng ta cũng được chuyển đến nơi chương trình hiện đang được thực thi. Chúng tôi hiện đang ở "getDelegate:469, Tóm tắtEntityManager(org.jboss.as.jpa.container)". Nhưng trên thực tế, chúng tôi đang thực hiện. Điều này được chứng minh bằng lớp được chỉ định bởi điều này:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 21
Hãy nhìn vào điều này. Như chúng ta biết, nó trỏ đến đối tượng hiện tại. Chúng tôi đang ở TransactionScopedEntityManager. Tại sao Idea không thể hiển thị mã cho chúng tôi? Thực tế là IntelliJ Idea hiện không biết về bất kỳ TransactionScopedEntityManager nào, bởi vì nó không được kết nối với dự án của chúng tôi (nó không nằm trong phần phụ thuộc của dự án). Khi một máy chủ ứng dụng đang chạy, có rất nhiều thư viện khác nhau đang chạy bên trong nó. Nhưng chúng ta biết rất ít về họ, bởi vì... nói chung, chúng ta không cần đi sâu vào bên trong, chúng ta chỉ cần nó hoạt động. Nhưng đôi khi công việc hoặc sở thích thể thao đòi hỏi điều đó. Sau đó, bạn cần thông báo cho Idea về thư viện này để nó biết lấy mã lớp ở đâu.

Kết nối thư viện của bên thứ ba để gỡ lỗi

Đầu tiên, bản thân chúng ta cần hiểu loại thư viện nào cần được kết nối. Cách đầu tiên là khó nhất - tìm kiếm trên Internet. Tốc độ và kết quả của việc tìm ra kết quả phụ thuộc rất nhiều vào việc dự án được quản lý tốt như thế nào. Ví dụ: WildFly có một kho lưu trữ mở. Vì vậy, khi chúng tôi sử dụng Google “TransactionScopedEntityManager”, chúng tôi sẽ truy cập https://github.com/wildfly/wildfly/tree/master/jpa/subsystem và thấy rằng chúng tôi cần Wildfly-jpa. Phương pháp thứ hai là chính xác. Máy chủ ở đâu, hãy nhìn vào đó. Nhiều phương tiện khác nhau có thể giúp với điều này. Ví dụ: trên Windows có thể là Far Manager . Dưới đây là một ví dụ về thuật toán tìm kiếm. Sau khi cài đặt và khởi chạy nó, hãy sử dụng Tab để chuyển sang một trong các tab, sử dụng Alt+F1tab bên trái hoặc Alt+F2tab bên phải và chọn phân vùng chúng ta cần trên ổ cứng. Rất có thể chính thư mục Far Manager được mở trong Far Manager sau khi cài đặt. Để đi tới thư mục gốc của đĩa, nhấn Ctrl + \. Sử dụng, Alt+Fmở cửa sổ tìm kiếm, bắt đầu nhập tên thư mục và nhấn Enter sau khi tìm thấy thư mục. Tìm kiếm này rất thông minh và làm nổi bật những thư mục phù hợp với văn bản tìm kiếm. Nếu bạn nhập các ký tự không có thư mục thì không thể nhập các ký tự đó. Bằng cách này chúng ta đi đến thư mục máy chủ ứng dụng. Giả sử chúng ta không biết các mô-đun được đặt ở đâu trên máy chủ. Có lẽ đây là lần đầu tiên trong đời bạn nghe về một loại WildFly nào đó. Vì vậy, hãy nhấn ngay vào đây Alt+F7để tìm kiếm file. Vì vậy, logic ra lệnh: chúng ta cần một tệp có thư viện. Tức là chúng ta cần một cái lọ. Cần có một lớp TransactionScopedEntityManager bên trong. Bởi vì class = file, sau đó tìm “contains”. Đó là, một cái gì đó như thế này:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 22
Bây giờ chúng ta hãy chờ đợi kết quả. Anh ấy sẽ không để bạn phải chờ đợi)
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 23
Bây giờ, chúng ta cần tìm mã nguồn của nó ở đâu đó. Và có 2 lựa chọn: Có lẽ chúng ta hãy sử dụng cái thứ hai. Chúng ta hãy tìm ở đó:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 24
Bây giờ hãy chuyển sang mô tả sự phụ thuộc. Trên trang này bạn có thể tải xuống mã nguồn. Tuyệt vời, bây giờ chúng ta đã tải được mã xuống. Tất cả những gì còn lại là kết nối thư viện. Nó kết nối vô cùng đơn giản. Chúng ta cần mở cài đặt dự án:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 25
Ở đó, chúng tôi chọn “Thư viện” và thêm mã nguồn nhận được vào phần “Nguồn”, và trong phần “Lớp”, chúng tôi chỉ ra chính tệp jar thư viện từ thư mục WildFly mà chúng tôi đã tìm thấy bằng Far Manager. Sau này, khi điều hướng qua F7, chúng ta sẽ thấy nội dung của lớp Tóm tắtEntityManager và TransactionScopedEntityManager và cũng sẽ có sẵn thông qua tìm kiếm theo lớp bằng cách sử dụng Ctrl+N.

Điểm dừng có điều kiện

Bây giờ chúng ta hãy quay lại Break Points. Đôi khi, không phải lúc nào chúng ta cũng muốn dừng lại mà chỉ với một điều kiện nào đó. Phải làm gì? Và ở đây IDE của chúng tôi cũng sẽ giúp chúng tôi. Bằng cách đặt Điểm ngắt, chúng ta có thể gán một điều kiện cho nó. Ví dụ: đặt một điểm và nhấp chuột phải vào nó:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 26
Bây giờ điểm dừng sẽ chỉ kích hoạt khi tên là Maximilian. Bằng cách nhấp vào nút Thêm, bạn sẽ có sẵn một bộ cài đặt mở rộng cho Điểm nghỉ.

Điểm dừng trong trường hợp ngoại lệ

Đôi khi chúng tôi có thể nhận được lỗi và chúng tôi muốn theo dõi lỗi đó đến từ đâu. Sau đó, chúng ta có thể thêm một điểm dừng không phải ở một dòng mã cụ thể mà ở vị trí mà ngoại lệ sẽ được ném ra. Để làm điều này, bạn cần mở rộng danh sách tất cả các điểm dừng:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 27
Và tạo quy tắc mới cho loại ngoại lệ đã chọn:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 28
Ví dụ: đối với NPE:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 29

Các lớp HotSwap

Trình gỡ lỗi là một điều tuyệt vời. Ngoài việc gỡ lỗi, nó còn cho phép bạn thay đổi lớp học! Có, các tài nguyên (chẳng hạn như các trang xhtml chẳng hạn) không thể thay đổi dễ dàng như vậy. Nhưng mã của các lớp java có thể được thay thế nhanh chóng (cái này được gọi là Hoán đổi nóng). Để thực hiện việc này, chỉ cần thay đổi lớp có đính kèm trình gỡ lỗi và thực thi Chạy -> Tải lại các lớp đã thay đổi. Đánh giá hữu ích về chủ đề này: 4 cách miễn phí để trao đổi nóng mã trên JVM

Phần kết luận

Trình gỡ lỗi là một công cụ mạnh mẽ cho phép nhà phát triển thâm nhập sâu vào mã thực thi và nghiên cứu nó đến từng chi tiết. Điều này cho phép bạn sửa những lỗi khó hiểu nhất. Nó cũng cho phép bạn hiểu rõ hơn cách hoạt động của một số thư viện nhất định. Ngay cả một bài đánh giá ngắn gọn như vậy hóa ra cũng khá ấn tượng, nhưng tôi hy vọng nó sẽ hữu ích và thú vị. Nếu ai quan tâm đến tài liệu này, bạn có thể tiếp tục tìm hiểu bằng các liên kết sau:
IntelliJ IDEA и Debug : Не дайвинг, но снорклинг - 30
#Viacheslav
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION