Gỡ lỗi ứng dụng chuỗi

Trong chương này, chúng ta sẽ học cách gỡ lỗi các ứng dụng luồng. Chúng ta cũng sẽ tìm hiểu tầm quan trọng của việc gỡ lỗi.

Gỡ lỗi là gì?

Trong lập trình máy tính, gỡ lỗi là quá trình tìm và loại bỏ các lỗi, lỗi và bất thường khỏi chương trình máy tính. Quá trình này bắt đầu ngay sau khi mã được viết và tiếp tục theo các giai đoạn liên tiếp khi mã được kết hợp với các đơn vị lập trình khác để tạo thành một sản phẩm phần mềm. Gỡ lỗi là một phần của quy trình kiểm thử phần mềm và là một phần không thể thiếu trong toàn bộ vòng đời phát triển phần mềm.

Trình gỡ lỗi Python

Trình gỡ lỗi Python hoặc pdblà một phần của thư viện chuẩn Python. Nó là một công cụ dự phòng tốt để theo dõi các lỗi khó tìm và cho phép chúng tôi sửa mã bị lỗi một cách nhanh chóng và đáng tin cậy. Tiếp theo là hai nhiệm vụ quan trọng nhất củapdp trình gỡ lỗi -

  • Nó cho phép chúng ta kiểm tra giá trị của các biến trong thời gian chạy.
  • Chúng ta cũng có thể bước qua mã và thiết lập các điểm ngắt.

Chúng ta có thể làm việc với pdb theo hai cách sau:

  • Thông qua dòng lệnh; điều này cũng được gọi là gỡ lỗi sau khi chết.
  • Bằng cách chạy pdb tương tác.

Làm việc với pdb

Để làm việc với trình gỡ lỗi Python, chúng ta cần sử dụng đoạn mã sau tại vị trí mà chúng ta muốn xâm nhập vào trình gỡ lỗi:

import pdb;
pdb.set_trace()

Hãy xem xét các lệnh sau để làm việc với pdb thông qua dòng lệnh.

  • h(help)
  • d(down)
  • u(up)
  • b(break)
  • cl(clear)
  • l(list))
  • n(next))
  • c(continue)
  • s(step)
  • r(return))
  • b(break)

Sau đây là bản trình diễn lệnh h (trợ giúp) của trình gỡ lỗi Python:

import pdb

pdb.set_trace()
--Call--
>d:\programdata\lib\site-packages\ipython\core\displayhook.py(247)__call__()
-> def __call__(self, result = None):
(Pdb) h

Documented commands (type help <topic>):
========================================
EOF   c         d       h        list     q       rv      undisplay
a     cl        debug   help     ll       quit    s       unt
alias clear     disable ignore   longlist r       source  until
args  commands  display interact n        restart step    up
b     condition down    j        next     return  tbreak  w
break cont      enable  jump     p        retval  u       whatis
bt    continue  exit    l        pp       run     unalias where

Miscellaneous help topics:
==========================
exec pdb

Thí dụ

Trong khi làm việc với trình gỡ lỗi Python, chúng ta có thể đặt điểm ngắt ở bất kỳ đâu trong tập lệnh bằng cách sử dụng các dòng sau:

import pdb;
pdb.set_trace()

Sau khi thiết lập điểm ngắt, chúng ta có thể chạy script bình thường. Tập lệnh sẽ thực thi cho đến một thời điểm nhất định; cho đến khi một dòng đã được thiết lập. Hãy xem xét ví dụ sau, nơi chúng tôi sẽ chạy tập lệnh bằng cách sử dụng các dòng được đề cập ở trên tại các vị trí khác nhau trong tập lệnh -

import pdb;
a = "aaa"
pdb.set_trace()
b = "bbb"
c = "ccc"
final = a + b + c
print (final)

Khi script trên được chạy, nó sẽ thực thi chương trình cho đến khi a = “aaa”, chúng ta có thể kiểm tra điều này trong kết quả sau.

Đầu ra

--Return--
> <ipython-input-7-8a7d1b5cc854>(3)<module>()->None
-> pdb.set_trace()
(Pdb) p a
'aaa'
(Pdb) p b
*** NameError: name 'b' is not defined
(Pdb) p c
*** NameError: name 'c' is not defined

Sau khi sử dụng lệnh 'p (print)' trong pdb, tập lệnh này chỉ in 'aaa'. Tiếp theo là lỗi vì chúng tôi đã đặt điểm ngắt cho đến a = "aaa".

Tương tự, chúng ta có thể chạy tập lệnh bằng cách thay đổi các điểm ngắt và xem sự khác biệt trong đầu ra -

import pdb
a = "aaa"
b = "bbb"
c = "ccc"
pdb.set_trace()
final = a + b + c
print (final)

Đầu ra

--Return--
> <ipython-input-9-a59ef5caf723>(5)<module>()->None
-> pdb.set_trace()
(Pdb) p a
'aaa'
(Pdb) p b
'bbb'
(Pdb) p c
'ccc'
(Pdb) p final
*** NameError: name 'final' is not defined
(Pdb) exit

Trong đoạn mã sau, chúng tôi đang thiết lập điểm ngắt ở dòng cuối cùng của chương trình -

import pdb
a = "aaa"
b = "bbb"
c = "ccc"
final = a + b + c
pdb.set_trace()
print (final)

Kết quả như sau:

--Return--
> <ipython-input-11-8019b029997d>(6)<module>()->None
-> pdb.set_trace()
(Pdb) p a
'aaa'
(Pdb) p b
'bbb'
(Pdb) p c
'ccc'
(Pdb) p final
'aaabbbccc'
(Pdb)