paint-brush
Gỡ lỗi như một nhà phát triển cấp cao: Xem và đánh giátừ tác giả@shai.almog
996 lượt đọc
996 lượt đọc

Gỡ lỗi như một nhà phát triển cấp cao: Xem và đánh giá

từ tác giả Shai Almog6m2022/12/20
Read on Terminal Reader

dài quá đọc không nổi

Khu vực xem trình gỡ lỗi là một công cụ mạnh mẽ, xứng đáng với hai bài học trong khóa học. Nếu bạn chưa biết về Đánh dấu đối tượng, bạn cần xem cái này!
featured image - Gỡ lỗi như một nhà phát triển cấp cao: Xem và đánh giá
Shai Almog HackerNoon profile picture

Đây là một tuần chuyên sâu ngoạn mục. Kênh YouTube mới về khóa học đang bùng nổ về lượng đăng ký; mới bước sang tuần thứ 3...


Trang web của khóa học hiện đang hoạt động; bạn có thể xem toàn bộ khóa học ở đó mặc dù tôi luôn thêm video và đã thực hiện được khoảng 1/3 công việc.


Hiện tại, nó có 3 giờ 17 phút nội dung. Tôi có một giờ nội dung sẵn sàng để thêm và tôi đang làm việc trên một số nội dung khác. Tôi khá chắc chắn rằng khóa học sẽ kéo dài hơn 6 giờ khi hoàn thành.


Tôi cũng đang thực hiện một số video thú vị khác, chẳng hạn như video về bảo vệ bản thân khỏi khai thác tuần tự hóa . Tôi sẽ viết một bài blog đầy đủ về nó trong vài tuần tới.


Nếu bạn có bất kỳ câu hỏi, suy nghĩ hoặc ý tưởng nào, tôi rất muốn nghe từ bạn. Dưới đây là video của tuần này và bảng điểm.

Bảng điểm

Chào mừng bạn quay trở lại phần thứ ba của gỡ lỗi ở Quy mô nơi chúng ta học cách săn lỗi như dân chuyên nghiệp!

Trong phần này, chúng ta sẽ thảo luận về các biểu thức đồng hồ vốn là nền tảng của việc gỡ lỗi. Điều này rất quan trọng, tôi sẽ xem lại chủ đề này sau.


Khu vực xem là khu vực ở dưới cùng của màn hình


Trong IntelliJ, chúng ta cũng có thể nhúng các biểu thức đồng hồ bên cạnh mã. Đồng hồ là một trong những khả năng quan trọng nhất của trình gỡ lỗi. Đây là cách chúng ta có thể xem những gì đang diễn ra trong trình gỡ lỗi.


Nhưng tôi sẽ đi sâu hơn thế nhiều. Đặc biệt đối với việc đánh dấu đối tượng, đây là một trong những tính năng gỡ lỗi thú vị nhất từng có.

Giá trị trả về

Bạn đã bao giờ quay lại từ một phương thức chỉ để nghĩ, "phương thức đó đã trả về cái gì?"


Điều này rất phổ biến, đặc biệt là khi giá trị trả về không được lưu trữ trong một biến. May mắn thay, IDE có tùy chọn lưu giá trị đó cho chúng tôi để chúng tôi có thể kiểm tra nó ngay lập tức!


Bằng cách bật tùy chọn này, chúng ta có thể thấy các giá trị trả về từ tất cả các phương thức trong tương lai. Nếu chúng ta bước vào phương thức isPrime và sau đó bước ra, bạn sẽ có thể thấy giá trị trả về cho phương thức ở dưới cùng tại đây.

Đánh giá

Đánh giá biểu thức là một trong những tính năng thú vị của trình gỡ lỗi mà chúng tôi không sử dụng đủ.


Chúng ta có thể khởi chạy hộp thoại biểu thức đánh giá từ trình đơn nhấp chuột phải và nhập bất kỳ biểu thức Java hợp lệ nào. Đây là một công cụ mạnh mẽ có thể gọi bất kỳ phương thức nào, thực hiện phép tính số học và thậm chí thay đổi giá trị của các biến.


Nếu bạn cần mô phỏng thứ gì đó khó kiểm tra trong mã hiện tại, thì đây là nơi bạn có thể chơi với nền tảng và thử nghiệm “các lý thuyết hoang dã”.


Điều này rất giống với REPL mà chúng ta có trong các phiên bản Java mới hơn, nhưng nó tốt hơn về nhiều mặt vì chúng ta có thể thực thi mã trong ngữ cảnh ứng dụng của mình.


Nếu tôi có một phương thức trả về giá trị sai, tôi thường sao chép lệnh gọi vào hộp thoại đánh giá và thử nhiều cách kết hợp lệnh gọi khác nhau để xem “cái gì hiệu quả”.


Chỉ cần thử tất cả các tùy chọn mà không cần khởi động lại có thể giúp chúng tôi tiết kiệm rất nhiều thời gian!


Bạn có thể khởi chạy hộp thoại này bằng tổ hợp Alt-F8 .

Đồng hồ

Khả năng xem trong IntelliJ là hoàn toàn ngoạn mục.


IntelliJ cho phép chúng tôi nhúng đồng hồ trực tiếp vào trình chỉnh sửa IDE bằng cách chọn “Thêm đồng hồ nội tuyến” từ menu ngữ cảnh. Đây là một tính năng tuyệt vời, theo như tôi biết, chỉ có ở JetBrains.


Sau khi được chọn, đồng hồ sẽ xuất hiện ở bên phải bên cạnh dòng mà chúng tôi đã thêm đồng hồ nội tuyến giúp dễ dàng đánh giá bằng mã. Điều này rất thuận tiện khi lặp đi lặp lại cùng một dòng.


Chúng ta cũng có thể sử dụng đồng hồ tiêu chuẩn sẽ thêm các phần tử với các biến khác. Điều này hữu ích cho các đối tượng mà chúng tôi muốn theo dõi trên các vùng mã lớn. Tôi có rất nhiều điều để nói về khu vực theo dõi khi chúng ta tiến về phía trước nhưng hiện tại, hãy tạm dừng việc này.

Thay đổi trạng thái

Đặt giá trị là một tính năng tôi thường quên sử dụng khi gỡ lỗi.


Đó là một sự xấu hổ vì nó rất mạnh mẽ. Chúng ta có thể đặt giá trị cho bất kỳ trường nào bằng cách nhấp chuột phải vào trường đó và chọn giá trị đặt.


Chúng tôi cũng có thể sử dụng F2 để tăng tốc độ này


Tôi có thể thay đổi giá trị thành bất kỳ giá trị tùy ý nào. Điều này cũng có thể áp dụng cho các đối tượng mà tôi có thể gán một giá trị hiện có hoặc gọi một phương thức tạo, một câu lệnh mới hoặc bất kỳ biểu thức nào tôi muốn.


Đó là một tính năng cực kỳ mạnh mẽ khi chúng ta có thể thay đổi đối tượng một cách linh hoạt để tái tạo trạng thái mà chúng ta muốn kiểm tra.


Chúng ta có thể kết hợp khả năng này với nhảy tới dòng mà chúng ta đã thảo luận trước đây và kiểm tra một phương thức thông qua nhiều hoán vị khác nhau. Ngay cả những thứ có thể không thể tái tạo bình thường. Một ví dụ điển hình là mã mà tôi có chỉ chạy trên Windows. Nhưng tôi có máy Mac.


Tôi chỉ thay đổi giá trị của biến tĩnh cho biết hệ điều hành hiện tại và kiểm tra mã đó.

đánh dấu đối tượng

Đánh dấu đối tượng là một trong những tính năng thú vị nhất mà chúng ta sẽ thảo luận trong khóa học này và nó hầu như không được biết đến.

Đó là một chút tinh tế; trước tiên, chúng ta sẽ thêm một đồng hồ cho Thread.currentThread() trả về thể hiện đối tượng đại diện cho luồng hiện tại.


Như bạn có thể thấy, tôi có thể thấy chuỗi hiện tại trong đồng hồ.


Bây giờ, tôi có thể chạy đi chạy lại phương thức này và xem luồng hiện tại; phương thức này có luôn được thực hiện từ cùng một luồng không?


Chà, tôi có thể xem ID chủ đề, và vâng. Nó giống nhau. Vì vậy, nó có thể an toàn cho luồng. Nhưng làm thế nào tôi có thể xác minh điều này?


Tôi thường viết ra ID đối tượng hoặc con trỏ của biến trên một tờ giấy và kiểm tra xem nó có cùng giá trị không. Đó là một nỗi đau và không quy mô. Bao lâu thì tôi có thể nhấn tiếp tục nhiều lần?


Trong menu chuột phải, tôi chọn Mark Object và gõ tên tùy ý. MyThread trong trường hợp này, khi tôi đã làm điều đó, tôi có thể nhấn OK


Thao tác này sẽ thay thế giá trị của luồng hiện tại bằng nhãn mới. Vì vậy, chúng tôi có thể giả định sai rằng đây chỉ là tên của một biểu thức đồng hồ. Nó không phải. Chúng tôi đã khai báo một biến mới và đặt tên là MyThread .


Chúng tôi đã sao chép giá trị hiện tại của biểu thức đồng hồ vào biến đó. Bây giờ chúng ta có thể xử lý biến đó như chúng ta xử lý hầu hết các biến trong IDE.


Chúng tôi có thể đánh giá giá trị ở đây và nhận được mọi thứ chúng tôi muốn. Lưu ý hậu tố _DebugLabel được IntelliJ thêm vào để tránh xung đột khi đặt tên nhưng ngoài ra, chúng ta có thể gọi bất kỳ thao tác nào trên đối tượng này, chẳng hạn như lấy tên hoặc thậm chí truy cập tên trường riêng.


Nhưng điều này trở nên tốt hơn nhiều…


Hãy thêm một điểm dừng cho phương pháp này, một điểm dừng hoàn toàn tiêu chuẩn như chúng ta đã làm trước đây.


Đây sẽ là một điểm dừng có điều kiện tiêu chuẩn; chúng ta sẽ sớm thảo luận sâu về những vấn đề đó, nhưng ngay bây giờ, tất cả những gì bạn cần biết là tôi có thể xác định một điều kiện sẽ xác định xem điểm ngắt có dừng hay không.


Hãy phóng to.


Hãy nhập điều kiện; Tôi có thể so sánh MyThread với giá trị hiện tại của luồng. Lưu ý rằng điều kiện này sẽ hoạt động tương ứng vì giá trị của MyThread độc lập với câu lệnh theo dõi ban đầu của Thread.currentThread() .


Vì vậy, nếu luồng hiện tại thực sự khác, điểm ngắt sẽ dừng tại điểm này.


Điều này vô cùng hữu ích khi làm việc với nhiều đối tượng. Trong trường hợp này, tôi thực sự có thể kiểm tra xem phương thức có bị tấn công bằng cùng một luồng hay không. Tôi có thể sử dụng nó để so sánh bất kỳ đối tượng nào thay vì viết con trỏ của chúng lên một tờ giấy!

Đúng. Tôi thực sự sẽ ngồi với một tờ giấy và sao chép địa chỉ con trỏ để đảm bảo rằng tôi đã hiểu đúng nếu tôi nhìn thấy nó lần nữa. Điều này tốt hơn theo nhiều cách!


Tôi thường sử dụng điều này với các API như JPA, nơi đôi khi chúng ta có thể có hai phiên bản đối tượng có cùng danh tính. Điều này thực sự khó phát hiện. Chỉ cần đánh dấu một đối tượng, sau đó bạn có thể thấy ngay đó là một thể hiện khác.


Vì trường hợp này rõ ràng là đơn luồng, nên điểm dừng sẽ không bao giờ bị tấn công nữa. Nhưng điều này hoạt động khá tốt cho các trường hợp rất phức tạp và là một công cụ hữu ích đáng kể!

Cuối cùng

Tiếp theo, chúng ta sẽ đi sâu vào các điểm ngắt và những điều tuyệt vời mà chúng có thể làm. Đây là một video chuyên sâu mà bạn không muốn bỏ lỡ.

Nếu bạn có bất kỳ câu hỏi nào, vui lòng sử dụng phần bình luận. Cảm ơn bạn!