paint-brush
Gỡ lỗi như một nhà phát triển cấp cao: Luồng điều khiển chương trình gỡ lỗitừ tác giả@shai.almog
956 lượt đọc
956 lượt đọc

Gỡ lỗi như một nhà phát triển cấp cao: Luồng điều khiển chương trình gỡ lỗi

từ tác giả Shai Almog7m2022/12/14
Read on Terminal Reader
Read this story w/o Javascript

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

Luồng điều khiển nhiều hơn bước qua. Bạn có thể "nhảy" tới các hiệu số mã tùy ý trong khi gỡ lỗi để tái tạo các trạng thái và hành vi phức tạp!
featured image - Gỡ lỗi như một nhà phát triển cấp cao: Luồng điều khiển chương trình gỡ lỗi
Shai Almog HackerNoon profile picture

Hiện tại mình đã xuất bản 3 video đầu tiên của khóa học và sẽ xuất bản video thứ 4 vào ngày mai. Tôi dự định xuất bản hai video mỗi tuần trên YouTube để tối đa hóa tác động, nhưng ở đây, tôi sẽ chỉ viết blog một bài học mỗi tuần để tránh quá bão hòa.


Tôi đã quay nội dung video khoảng 4 giờ và vẫn chưa hoàn thành mô-đun thứ 2 trong số 8 giờ. Khóa học này sẽ rất chi tiết và chuyên sâu.


Tôi đang làm việc trên nền tảng khóa học ngay bây giờ, đang có tiến triển tốt và hy vọng sẽ sớm xuất bản nó ở đây . Nó có thể đã được phát hành vào thời điểm bạn đọc nó!


Điều quan trọng đối với tôi là trải nghiệm người dùng đối với nền tảng khóa học khiến tôi hài lòng. Vì vậy, tôi tránh DRM càng nhiều càng tốt. Hy vọng rằng mọi người sẽ tôn trọng điều đó và những nỗ lực mà tôi đang bỏ ra.


Tôi đang xây dựng nền tảng khóa học trên Spring Boot 3 với GraalVM nên lý tưởng nhất là nền tảng này sẽ gọn gàng, nhanh chóng và khá đơn giản. Tôi dự định lưu trữ các video trên YouTube dưới dạng video không công khai để mang lại trải nghiệm xem phù hợp.


Điều này có nghĩa là các nhà phát triển có thể phản bội lòng tin của tôi và chia sẻ các video không công khai. Tôi hy vọng họ không.


Lý do của tôi ở đây là chi phí thấp và hiệu suất tuyệt vời. Tôi cũng muốn làm cho khóa học miễn phí trong một vài năm. Bằng cách sử dụng YouTube, tôi có thể cung cấp khóa học miễn phí bằng cách đặt các video ở chế độ công khai.


Video sau đây thảo luận về luồng điều khiển trong gỡ lỗi. Điều này bắt đầu với những điều cơ bản nhưng có thể đi sâu hơn đối với nhảy tới dòng, buộc trả lại, v.v. Đây là những công cụ có thể thay đổi đáng kể cách chúng tôi gỡ lỗi mã.


Đừng quên xem cuốn sách của tôi và đăng ký kênh YouTube để xem các video trong tương lai!

Bảng điểm

Chào mừng bạn quay trở lại phần thứ hai của gỡ lỗi tại Quy mô nơi bạn có thể tìm hiểu các thủ thuật bí mật của việc gỡ lỗi.


Trong phần này, chúng ta sẽ thảo luận về khía cạnh cơ bản nhất của việc gỡ lỗi. Chúng tôi đạt một điểm dừng. Giờ thì sao?

Chà, đây là nơi trình gỡ lỗi cho phép chúng tôi kiểm soát luồng để điều tra cách mọi thứ hoạt động trong môi trường được kiểm soát.


Vì vậy, những gì trong chương trình nghị sự cho ngày hôm nay?


Chúng ta sẽ thảo luận về từng bước và viết mã, tôi hy vọng hầu hết danh sách này đều quen thuộc với bạn. Hai mục cuối cùng mà chúng tôi làm gián đoạn quy trình kiểm soát có thể không quen thuộc với bạn. Tôi khá chắc chắn rằng hầu hết các bạn không quen thuộc với mục cuối cùng trong chương trình nghị sự. Làm sao tôi biết? Hãy theo dõi và tìm hiểu!

Bước qua, vào, ra và cưỡng bức

Bước qua là hình thức cơ bản nhất của luồng điều khiển. Chúng tôi để mã trong dòng thực thi và sau đó chúng tôi có thể kiểm tra kết quả trong ngăn biến. Thật đơn giản và dễ dàng.


Trong trường hợp này, tôi chỉ cần nhấn nút ở đây một vài lần, nhưng tôi cũng có thể nhấn F8 để có hiệu ứng tương tự…


Tiếp theo, chúng ta sẽ thảo luận về hai hoạt động riêng biệt, bước vào và bước ra liên quan. Step into đi vào phương thức mà chúng ta gọi. Lưu ý rằng nếu không có phương pháp nào để đi vào bước, thì bước vào sẽ hoạt động giống như bước qua.


Chúng tôi có hai hoạt động bước vào. Cái thông thường và bước lực thường hoạt động theo cùng một cách. Chúng tôi cần phiên bản bắt buộc khi chúng tôi muốn bước vào một API mà IntelliJ thường sẽ bỏ qua. Chúng ta có thể nhấn F7 để bước vào một phương thức. Chúng ta có thể nhấn Shift F7 để buộc bước vào.


Khi chúng ta xem xong một phương pháp và không quan tâm đến phần còn lại, chúng ta có thể bước ra ngoài. Điều này thực thi phần còn lại của phương thức và trả về.


Lưu ý rằng nếu chúng ta có một điểm ngắt trước khi trả về thì nó vẫn dừng ở điểm ngắt như chúng ta thấy trong trường hợp này. Chúng ta có thể nhấn nút này ở đây để thoát ra hoặc nhấn shift-F8 để làm điều tương tự.

Tiếp tục và chạy đến con trỏ

Tiếp tục tiến hành thực hiện dự án cho đến khi điểm ngắt được nhấn lại. Điều này cũng được gọi là sơ yếu lý lịch. Đó là một tính năng đơn giản mà chúng tôi sử dụng rất nhiều. Bạn có thể tiếp tục bằng cách nhấn phiên bản đặc biệt của nút phát tại đây. Phím tắt cũng hữu ích vì chúng tôi sử dụng nó rất nhiều, đó là F9.


Chạy tới con trỏ cho phép chúng tôi bỏ qua các dòng không thú vị và tiếp cận mã quan trọng. Chúng ta có thể đặt điểm dừng tại dòng đó để có được hiệu ứng tương tự, nhưng điều này đôi khi thuận tiện hơn vì nó loại bỏ nhu cầu đặt và hủy đặt điểm ngắt.


Chúng ta có thể nhấn nút này để chạy đến con trỏ hoặc có thể sử dụng ALT-F9 làm phím tắt cho tính năng này.

Buộc trả lại và ném ngoại lệ

Tính năng này được gọi là trả lại lực lượng trong IntelliJ/IDEA.


Để xem tùy chọn trả lại lực lượng, chúng tôi nhấp chuột phải vào dấu vết ngăn xếp và có thể thấy một tập hợp các tùy chọn. Một tùy chọn thậm chí còn thú vị hơn là thả khung hình mà tôi sẽ trình bày ngay sau đây.


Lưu ý tùy chọn ném ngoại lệ giống với tùy chọn buộc trả lại, nhưng nó ném một ngoại lệ khỏi phương thức.


Khi tôi nhấp vào tùy chọn này, tôi sẽ thấy một hộp thoại để nhập giá trị trả về từ phương thức. Điều này cho phép tôi thay đổi giá trị được trả về từ phương thức, điều này rất hữu ích khi tôi muốn gỡ lỗi một lỗi khó tái tạo.


Hãy tưởng tượng một trường hợp lỗi xảy ra với khách hàng, nhưng bạn không thể tái tạo nó. Trong trường hợp này, tôi có thể mô phỏng những gì khách hàng có thể gặp phải bằng cách trả về một giá trị khác từ phương thức.


Ở đây, giá trị là một biến boolean, vì vậy nó đơn giản. Nhưng mã của bạn có thể trả về một đối tượng; sử dụng kỹ thuật này, bạn có thể thay thế đối tượng đó bằng một giá trị tùy ý. Một ví dụ điển hình sẽ là null, nếu phương thức này trả về null thì nó có tái tạo sự cố mà người dùng của tôi đang gặp phải không?


Tương tự, ném ngoại lệ cho phép chúng tôi tái tạo các trường hợp cạnh chẳng hạn như ném ngoại lệ do lỗi tùy ý.


Khi chúng tôi nhấn OK, chúng tôi sẽ quay lại với một giá trị khác. Trong trường hợp này, tôi đã ở rìa của phương thức nhưng tôi có thể thực hiện nó khi bắt đầu phương thức và bỏ qua hoàn toàn việc thực thi phương thức.


Điều này cho phép chúng tôi mô phỏng các trường hợp trong đó một phương thức có thể bị lỗi, nhưng chúng tôi muốn mô phỏng hành vi của nó. Điều đó có thể hợp lý nếu chúng ta không thể tái tạo hành vi mà khách hàng nhìn thấy. Chúng ta có thể mô phỏng bằng cách sử dụng các công cụ như thế này.

thả khung

Giảm khung hình gần như là một cuộc cách mạng nhưng nó cũng giống như một “thủ thuật gọn gàng” hơn. Ở đây, tôi bước vào một phương pháp do nhầm lẫn. Rất tiếc, tôi không muốn làm điều đó. Tôi muốn thay đổi một số thứ trước khi bước vào... May mắn thay, có khung hình thả xuống.


Chúng tôi đã thấy tôi có thể tiếp cận nó trong menu chuột phải; bạn cũng có thể nhấp vào đây để kích hoạt nó.


Khung thả xuống có hiệu quả làm giảm khung ngăn xếp. Đó là một hoạt động hoàn tác. Nhưng nó không chính xác như vậy. Nó không thể hoàn tác các thay đổi trạng thái đã xảy ra trong phương thức mà chúng ta đã thực hiện.


Vì vậy, nếu bạn bước vào phương thức và các biến không có trong ngăn xếp đã bị thay đổi, thì chúng sẽ vẫn thay đổi.


Các biến trên ngăn xếp là những biến mà phương thức khai báo hoặc chấp nhận làm đối số, những biến này sẽ được đặt lại. Tuy nhiên, nếu một trong các biến đó trỏ vào một đối tượng, thì đối tượng đó nằm trong đống và không thể đặt lại các thay đổi ở đó bằng cách hủy ngăn xếp.


Đây vẫn là một tính năng rất hữu ích tương tự như force return với ngoại lệ là nó sẽ trả về dòng hiện tại chứ không phải dòng tiếp theo. Vì vậy, nó sẽ không trả về một giá trị.


Điều này thậm chí còn tốt hơn thế!

Chuyển đến Dòng

Nhảy tới dòng là một tính năng bí mật trong IntelliJ. Nó hoạt động, nhưng các nhà phát triển không biết về nó. Bạn cần cài đặt plugin Jump to Line để sử dụng nó. Vì nó có số lượt cài đặt tương đối thấp nên tôi cho rằng mọi người không biết nó tồn tại. Bởi vì đây là một plugin phải có. Nó sẽ thay đổi cách bạn gỡ lỗi!


Với nhảy tới dòng, chúng ta có thể di chuyển con trỏ lệnh hiện tại đến một vị trí khác trong phương thức. Ta có thể kéo mũi tên bên trái để đưa phần thực thi đến vị trí mới. Lưu ý rằng điều này hoạt động theo cả hai hướng, tôi có thể di chuyển qua lại phần thực thi hiện tại.


Điều này không thực thi mã ở giữa, nó thực sự di chuyển hướng dẫn hiện tại sang một vị trí mới. Nó thật tuyệt, tôi phải thể hiện nó một lần nữa…


Nếu bạn thấy lỗi, chỉ cần kéo phần thực thi trở lại và tạo lại nó. Bạn có thể thay đổi các giá trị của biến và lặp đi lặp lại vấn đề cho đến khi bạn hoàn toàn hiểu nó.


Chúng ta có thể bỏ qua mã bị lỗi, v.v. Điều này thật ngoạn mục. Tôi không cần biên dịch lại mã. Nếu bạn từng gặp trường hợp vô tình bước qua vạch kẻ và “Rất tiếc. Đó không phải là điều tôi muốn.”

Sau đó dừng trình gỡ lỗi và bắt đầu lại từ đầu. Đây là plugin dành cho bạn. Điều này đã xảy ra với tất cả mọi người!


Chúng ta chỉ có thể kéo quá trình thực thi trở lại và thực hiện lại. Nó hoàn toàn tuyệt vời!

Cuối cùng

Trong video tiếp theo, chúng ta sẽ thảo luận ngắn gọn về đồng hồ. Chúng ta sẽ tìm hiểu sâu hơn về vấn đề này trong video thứ sáu của loạt bài này. Vậy nên hãy chờ trong giây lát!


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!