Debugger là gì? Dùng Python debugger để fix code

2307
06-11-2018
Debugger là gì? Dùng Python debugger để fix code

Debugger là một trong những phần mềm mà phần lớn, nếu không muốn nói là tất cả các developer đã từng sử dụng ít nhất một lần trong cuộc đời lập trình của mình. Tuy nhiên, không thực sự nhiều người thực sự hiểu hết về công cụ này. Cùng Bizfly Cloud giải đáp về debugger và cách debugger hoạt động trong bài sau.

Giải nghĩa debugger là gì?

Để giải thích ngắn gọn, debugger là một phần mềm được sử dụng để kiểm tra và phát hiện lỗi (bug) trong các chương trình trên máy tính. Một debugger còn được gọi là công cụ gỡ lỗi.

Các debugger có thể sử dụng các trình hướng dẫn mô phỏng, thay vì trực tiếp chạy chương trình trên bộ vi xử lý để đạt mức kiểm soát thực thi cao hơn. Nhờ vậy mà các debugger có thể dừng hoặc tạm dừng chương trình tùy vào từng trường hợp cụ thể. Tuy nhiên, sử dụng trình mô phỏng sẽ làm giảm tốc độ thực thi.

Khi một chương trình bị treo, debugger sẽ hiển thị vị trí xảy ra lỗi trong chương trình đó. Hầu hết các debugger cũng có thể chạy chương trình theo trình tự bước một, ngoài việc dừng tại các điểm lỗi. Debugger cũng thường thực hiện sửa đổi trạng thái của các chương trình trong khi đang chạy.

>> Tham khảo thêm: Kiến thức căn bản về Bug và Report Bug

Dùng Python debugger để chữa lỗi code

Tìm hiểu về debugger là gì? Dùng Python debugger để fix code - Ảnh 1.

 Khi chữa lỗi, sử dụng python sẽ cung cấp thêm cho bạn một số tiện ích khác. Bạn không chỉ có thể xem được code trong quá trình xử lý mà còn chạy được code trong dòng lệnh debugger hoặc thậm chí tác động đến quy trình khi thay đổi giá trị biến.

>> Tìm hiểu thêm: Python là gì? Tại sao lại chọn Python?

Python còn sở hữu một loại vũ khí hết sức lợi hại, đó chính là debugger tích hợp sẵn có tên gọi là `pdb` với giao diện dòng lệnh đơn giản vô cùng hữu ích. Pdb là một tiện ích đơn giản cung cấp tất cả các tính năng debug cơ bản bạn có thể cần đến. Tuy nhiên, nếu bạn cần khả năng xử lý phức tạp hơn, bạn có thể mở rộng pdb với ipdb cung cấp thêm một số tính năng debugger bổ sung từ IPython.

Cách sử dụng dễ nhất là bạn gọi `pdb` trong code đang làm việc ra.

import pdb; pdb.set_trace()

Bạn chạy trình thông dịch, và khi chạy đến dòng này, bạn sẽ nhận được một dấu nhắc lệnh trên giao diện chương trình đang sử dụng. Về cơ bản, đây là một lời nhắc chung trong Python, tuy nhiên nó cung cấp thêm một số lệnh mới.

List (l)

Lệnh list (l) sử dụng để xem trình thông dịch Python đang nằm trên dòng code nào. Bạn có thể sử dụng lệnh này để kiểm tra một khoảng code khác - các đối số sẽ được thể hiện trong dòng đầu tiên và dòng cuối cùng. Nhưng nếu bạn chỉ cung cấp số dòng đầu tiên, bạn sẽ chỉ thấy code chạy xung quanh dòng cụ thể này.

up(p) and down(d)

Lệnh sử dụng để điều hướng thông qua các call stack. Bạn có thể xem được ai đang gọi hàm hiện hành, hoặc tại sao trình thông dịch lại được thực hiện như vậy.

step(s) and next(n)

Một cặp lệnh quan trọng khác là step(s) and next(n). Bạn có thể tiếp tục chạy các ứng dụng theo dòng với cặp lệnh này. Sự khác biệt duy nhất là lệnh next(n) sẽ chỉ đưa bạn đến dòng tiếp theo trong hàm hiện hành, ngay cả khi một hàm khác đang được gọi, nhưng step(s) sẽ đưa bạn đến với các dòng sâu hơn trong hàm với các trường hợp như thế này.

break(b)

Nếu bạn cần thiết lập các breakpoint mới mà không cần phải thay đổi mã, bạn có thể sử dụng lệnh break (b).

Bảng câu lệnh cơ bản dùng trong Python debugger:

Lệnh

Lệnh viết tắt

Nhiệm vụ

args

a

In danh sách đối số của hàm hiện tại

break

b

Tạo breakpoint (yêu cầu tham số) trong khi chạy chương trình

continue

c or cont

Tiếp tục chạy chương trình

help

h

Cung cấp danh sách lệnh hoặc hỗ trợ một lệnh xác định

jump

j

Đặt lệnh chạy cho dòng tiếp theo

list

l

In mã nguồn quanh dòng hiện tại

next

n

Tiếp tục chạy cho đến khi đạt hoặc trả về dòng tiếp theo trong hàm hiện tại

step

s

Chạy dòng hiện tại, dừng lại ở lần đầu tiên

pp

pp

Pretty-prints giá trị của biểu thức

quit or exit

q

Hủy bỏ chương trình

return

r

Tiếp tục chạy cho đến khi hàm trả về hiện tại

Am hiểu và thực hành tốt một số lệnh cơ bản trên đây, bạn có thể thực hiện các thao tác fix lỗi code nhanh với python debugger.

Mục đích của việc sử dụng Debugger là gì?

Debugger là một công cụ trợ giúp đắc lực trong quá trình phát triển phần mềm. Debugger giúp xác định các lỗi mã code (coding errors) ở các giai đoạn khác nhau của hệ điều hành hoặc trong quá trình phát triển ứng dụng. Lập trình viên có thể theo dõi từng bước trong việc thực thi chương trình thông qua đánh giá giá trị của các biến và dừng việc thực thi bất cứ khi nào cần để lấy giá trị của các biến hoặc đặt lại các biến chương trình. Mục đích của việc sử dụng Debugger là đảm bảo chức năng phần mềm hoạt động ổn định, bền bỉ trên tất cả các thiết bị và nền tảng dự kiến. Vì lý do này, nhiều Debugger không chỉ kiểm tra mã nguồn tương ứng mà còn cả sự tương tác với hệ điều hành đang thực thi và phần cứng bên dưới.

Một số nguyên nhân dẫn đến các bug

Có nhiều lý do cho sự xuất hiện của lỗi phần mềm (bug). Khi bạn đã biết nguyên nhân dẫn đến các bug, bạn sẽ dễ dàng thực hiện các hành động khắc phục để giảm thiểu những lỗi này.

1. Các vấn đề về giao tiếp

Sự thành công của bất kỳ ứng dụng phần mềm nào phụ thuộc vào sự giao tiếp giữa các bên liên quan, dev team và test team. Yêu cầu không rõ ràng hoặc diễn giải sai yêu cầu là hai yếu tố chính gây ra lỗi trong phần mềm. Đôi khi, lỗi xảy ra do giao tiếp giữa doanh nghiệp và nhóm phát triển phần mềm không rõ ràng . Nếu công ty chưa xác định và đưa ra các yêu cầu cụ thể khi bắt đầu dự án, nhóm phát triển phần mềm sẽ gặp khó khăn trong việc đáp ứng và dẫn đến sản phẩm ra đời không đáp ứng đúng kỳ vọng cũng như tầm nhìn của lãnh đạo doanh nghiệp.

2. Bug phát sinh do sai sót của con người

Làm việc với các nhà phát triển thiếu kinh nghiệm và kỹ năng cần thiết có thể dẫn đến một chương trình phát sinh nhiều bug. Do đó cần phải thực hiện một quy trình kiểm tra nghiêm ngặt khi thuê cả nhóm gia công phần mềm nội bộ và nước ngoài

3. Áp lực thời gian

Cần có thời gian để quá trình phát triển phần mềm đi đúng hướng. Nếu không có đủ thời gian để thiết kế, lập trình và kiểm thử phù hợp, việc phát sinh bug là điều hiển nhiên. Mọi nỗ lực sẽ trở nên vô nghĩa nếu bạn quá vội vàng, bạn sẽ có nguy cơ mắc phải lỗi nhiều hơn hoặc không phát hiện ra chúng, điều này sẽ dẫn đến hậu quả rất nghiêm trọng.

4. Lỗi logic thiết kế

Phần cốt lõi chính của phát triển phần mềm là thiết kế và mức độ tối ưu của thiết kế sẽ quyết định khả năng phát triển của ứng dụng phần mềm. Thiết kế không logic hoặc quá phức tạp cũng có thể phát sinh bug trong phần mềm. Trong thị trường phát triển phần mềm phức tạp hiện nay, để thực hiện dự án cần nghiên cứu nhiều hơn để tối ưu hóa quá trình thiết kế và lập trình.

5. Thiếu kiểm soát phiên bản

Việc kiểm soát phiên bản đóng một vai trò quan trọng. Ngay cả khi có hệ thống kiểm soát phiên bản, lỗi vẫn có thể lọt vào final build nếu người lập trình không đảm bảo rằng phiên bản mới nhất của mỗi module vẫn được liên kết khi một phiên bản mới đang được xây dựng để thử nghiệm.

6. Công cụ bên thứ ba bị lỗi

Phần lớn thời gian chúng ta phải sử dụng các công cụ của bên thứ ba trong quá trình phát triển phần mềm. Đây là các công cụ mã nguồn mở hoặc các công cụ thương mại dựa trên yêu cầu của dự án. Các công cụ của bên thứ ba như debugger, HTML editor, shared DLLs, add-on/plugin… được phát triển bởi người khác và có thể có lỗi trong các công cụ, điều này có thể gây ra bug trong phần mềm của bạn.

7. Quá phụ thuộc vào kiểm thử tự động

Vì kiểm thử tự động thiếu trực giác và kinh nghiệm của con người, nên việc phụ thuộc quá mức vào nó có thể khiến người kiểm tra thủ công bỏ sót bug. Điều quan trọng để kiểm thử tự động thành công, bạn cần những người kiểm thử có kinh nghiệm cùng với khả năng quản lý tốt.

8. Thay đổi vào phút cuối trước khi release

Ngay trước khi release sản phẩm, những yêu cầu thay đổi vào phút cuối có thể gây nguy hiểm, dẫn đến sự mất ổn định đối với phần mềm. Những hành động như kiểm tra khả năng tương thích của phần mềm trên nhiều trình duyệt và hệ điều hành, di chuyển cơ sở dữ liệu, v.v. là những việc phức tạp và nếu được thực hiện vội vàng (do thay đổi vào phút cuối), chúng có thể gây ra bug. Việc thay đổi yêu cầu dự án quá thường xuyên cũng có khả năng phát sinh nhiều bug trong phần mềm của bạn.

9. Kỹ năng kiểm thử phần mềm kém

Việc không có đủ kiến thức về kỹ năng kiểm thử có thể dẫn đến các khiếm khuyết trong hệ thống. Ngoài ra, nếu người kiểm thử không tập trung tối đa cho hoạt động kiểm thử, không chỉ dẫn đến chất lượng sản phẩm kém mà còn làm tăng nguy cơ xuất hiện lỗi lớn.

Một số phương pháp sử dụng Debugger

1. Print statements

Sử dụng print statements có thể là cách đơn giản nhất để debug. Tất cả các ngôn ngữ lập trình đều có một hoặc nhiều lệnh mà bạn có thể sử dụng để hiển thị (print) các giá trị ra console khi phần mềm đang chạy. Khi bạn theo dõi vị trí mà bạn nghĩ rằng có bug trong code của mình, bạn có thể thêm một câu lệnh print để hiển thị ra giá trị của các biến xung quanh bug để xác định lý do tại sao bug có thể xảy ra. Đây là một phương pháp hữu ích vì nó không cần thêm bất kỳ công cụ bổ sung hoặc IDE nào.

2. Error handling

Một phương pháp debug khác là sử dụng Error handling. Code không sử dụng Error handling thường sẽ bị treo khi gặp bug. Error handling bắt lỗi trước khi bug có cơ hội làm ứng dụng bị sập. Sau đó, nó thực hiện hành động với dữ liệu lỗi, như logging hoặc lưu trữ nó trong cơ sở dữ liệu và ứng dụng sau đó tiếp tục hoạt động bình thường. Error handling là phương pháp hoàn hảo để tìm bug trong môi trường production mà không gây trải nghiệm xấu cho người dùng.

3. Commenting things out

Một phương pháp gỡ lỗi đơn giản khác là “commenting out" một số đoạn code. Tức là biến một số functional code thành các comment sẽ không được thực thi. Bạn bắt đầu bằng cách Commenting out code trong phần mà bạn cho rằng có vấn đề cho đến khi lỗi ngừng xảy ra. Sau đó, bạn chỉ cần thêm lại từng dòng code cho đến khi lỗi xuất hiện trở lại. Và khi đó, bạn đã xác định được vị trí đang có bug.

4. Công cụ debugging

Công cụ debugging là cách phức tạp nhất để tìm bug trong phần mềm. Chúng thường được tích hợp sẵn trong môi trường phát triển tích hợp (IDE - integrated development environments) mà các nhà phát triển sử dụng để lập trình. Ngoài ra còn có các debugger đi kèm với một số trình duyệt web (Chrome, Firefox,...) để debug các ứng dụng web.

Debugger cho phép lập trình viên tạo các "breakpoints" trong code. Khi chạy code sẽ ngừng chạy tại breakpoints. Sau đó, nhà phát triển có thể xem qua từng dòng code và kiểm tra các biến trong mỗi bước để xác định vấn đề. Sử dụng debugger là phương pháp tiên tiến nhất để tìm ra các lỗi khó nhất. Tuy nhiên bạn có thể bỏ qua công cụ này nếu các kỹ thuật khác vẫn hoạt động tốt.

5. Test

Một phương pháp khác để debug là thêm các test code. Có nhiều loại chẳng hạn như unit tests, integration tests, functional tests, v.v. Các loại test này được tạo ra để kiểm tra xem ứng dụng có đang chạy chính xác hay không. Các test sẽ chạy trên application code trước khi được thêm vào code repository hoặc được triển khai vào production. Khi các test không pass, nó sẽ chỉ ra bug cần được fix.

Nguồn: Tech.vccloud.vn

>> Có thể bạn quan tâm: Vòng đời của Bug bạn phải hiểu

SHARE