কম্পিউটার টিউটোরিয়াল

পাইথন ডিবাগার (pdb)

সফ্টওয়্যার ডেভেলপমেন্ট জার্গনে, 'ডিবাগিং' اصطلাহটি একটি প্রোগ্রামের ত্রুটি সনাক্ত এবং সংশোধন করার প্রক্রিয়া বোঝাতে популярভাবে ব্যবহৃত হয়। পাইথনের স্ট্যান্ডার্ড লাইব্রেরিতে pdb মডিউল রয়েছে যা পাইথন প্রোগ্রাম ডিবাগ করার জন্য ইউটিলিটির একটি সেট।

ডিবাগিং ফাংশনালিটি Pdb ক্লাসে সংজ্ঞায়িত। মডিউল ইন্টারনালি bdb এবং cmd মডিউল ব্যবহার করে।

pdb মডিউলের একটি খুব সুবিধাজনক কমান্ড লাইন ইন্টারফেস রয়েছে। এটি পাইথন স্ক্রিপ্ট এক্সিকিউশনের সময় -m সুইচ ব্যবহার করে ইম্পোর্ট করা হয়:

python -m pdb script.py

ডিবাগার কীভাবে কাজ করে সে সম্পর্কে জানতে, প্রথমে একটি পাইথন মডিউল (fact.py) লিখি নিচের মত:

def fact(x):
    f = 1
    for i in range(1, x+1):
        print(i)
        f = f * i
    return f
if __name__ == "__main__":
    print("factorial of 3=", fact(3))

কমান্ড লাইন থেকে এই মডিউল ডিবাগিং শুরু করুন। এই কেসে এক্সিকিউশন কোডের প্রথম লাইনে থেমে যায়, তার বামে অ্যারো (->) দেখায়, এবং ডিবাগার প্রম্পট (Pdb) উৎপন্ন করে।

C:\python36>python -m pdb fact.py
> c:\python36\fact.py(1)() -> def fact(x):
(Pdb)

ডিবাগার প্রম্পটের সামনে 'help' টাইপ করে সকল ডিবাগার কমান্ডের তালিকা পেতে পারেন। যেকোনো কমান্ড সম্পর্কে জানতে 'help ' সিনট্যাক্স ব্যবহার করুন।

পাইথন ডিবাগার (pdb)

list কমান্ড পুরো কোড লিস্ট করে যেখানে প্রোগ্রাম থেমেছে সেটার বামে -> সিম্বল থাকে।

(Pdb) list
1 -> def fact(x):
2     f = 1
3     for i in range(1, x+1):
4         print(i)
5         f = f * i
6     return f
7 if __name__ == "__main__":
8     print("factorial of 3 = ", fact(3))

প্রোগ্রাম লাইন বাই লাইন যেতে step বা next কমান্ড ব্যবহার করুন।

(Pdb) step
> c:\python36\fact.py(7)() -> if __name__ == "__main__":
(Pdb) next
> c:\python36\fact.py(8)() -> print("factorial of 3 = ", fact(3))
(Pdb) next
1
2
3
factorial of 3= 6
--Return--
> c:\python36\fact.py(8)() -> None
-> print("factorial of 3 = ", fact(3))

step এবং next কমান্ডের মূল পার্থক্য হলো step কমান্ড প্রোগ্রামকে একটি ফাংশনের ভিতরে থামাতে বাধ্য করে যখন next কоман্ড একটি কল করা ফাংশন এক্সিকিউট করে এবং তার পর থামে।

C:\python36>python -m pdb fact.py
> c:\python36\fact.py(1)() -> def fact(x):
(Pdb) s
> c:\python36\fact.py(7)() -> if __name__ == "__main__":
(Pdb) n
> c:\python36\fact.py(8)() -> print("factorial of 3=", fact(3))
(Pdb) s
--Call--
> c:\python36\fact.py(1)fact() -> def fact(x):
(Pdb) n
> c:\python36\fact.py(2)fact() -> f = 1
(Pdb) n
> c:\python36\fact.py(3)fact() -> for i in range(1, x+1):
(Pdb) n
> c:\python36\fact.py(4)fact() -> print(i)
(Pdb) n
1
> c:\python36\fact.py(5)fact() -> f = f * i
(Pdb) n
> c:\python36\fact.py(3)fact() -> for i in range(1, x + 1):
(Pdb) n
> c:\python36\fact.py(4)fact() -> print(i)
(Pdb) f,i
(1, 2)
(Pdb)

step কমান্ড --call-- ইন্ডিকেশন দেখায় যখন প্রোগ্রাম একটি ফাংশন কল এনকাউন্টার করে এবং --return-- যখন একটি ফাংশন শেষ হয়। যেকোনো সময়, আমরা শুধু এর নাম লিখে একটি নির্দিষ্ট ভেরিয়েবলের মান চেক করতে পারি।

আপনি break কমান্ড ব্যবহার করে প্রোগ্রামের মধ্যে ব্রেকপয়েন্ট সেট করতে পারেন। লাইন নম্বর (যেখানে ব্রেকপয়েন্ট সেট করা উচিত) দিতে হবে। উদাহরণস্বরূপ 'break 5' করেন্ট প্রোগ্রামের লাইন 5-এ একটি ব্রেকপয়েন্ট সেট করবে।

(Pdb) list
2 f = 1
3 for i in range(1, x + 1):
4 print(i)
5 f = f * i
6 return f
7 -> if __name__ == "__main__":
8 print("factorial of 3=", fact(3))
[EOF]
(Pdb) break 5
Breakpoint 1 at c:\python36\fact.py:5
(Pdb) continue
1
> c:\python36\fact.py(5)fact() -> f = f * i
(Pdb) break
Num Type Disp Enb Where
1 breakpoint keep yes at c:\python36\fact.py:5
breakpoint already hit 1 time
(Pdb) continue
2
> c:\python36\fact.py(5)fact() -> f = f * i
(Pdb) b
Num Type Disp Enb Where
1 breakpoint keep yes at c:\python36\fact.py:5
breakpoint already hit 2 times

'continue' কমান্ড ইস্যু করলে, প্রোগ্রাম এক্সিকিউশন ব্রেকপয়েন্ট এনকাউন্টার করার পর্যন্ত চলবে। সকল ব্রেকপয়েন্ট দেখতে, সিম্পলি লাইন নম্বর ছাড়া break কমান্ড ইস্যু করুন।

যেকোনো ব্রেকপয়েন্ট disable/enable কমান্ড দ্বারা ডিজেবল/এনেবল করা যেতে পারে বা clear কমান্ড দ্বারা পুরোপুরি ক্লিয়ার করা যায়।

(Pdb) disable 1
Disabled breakpoint 1 at c:\python36\fact.py:5
(Pdb) b
Num Type Disp Enb Where
1 breakpoint keep no at c:\python36\fact.py:5
breakpoint already hit 2 times

Pdb ডিবাগারকে পাইথন স্ক্রিপ্টের ভিতর থেকেও ব্যবহার করা যায়। এর জন্য, স্ক্রিপ্টের টপে pdb ইম্পোর্ট করুন এবং প্রোগ্রামের ভিতরে set_trace() মেথড ব্যবহার করুন।

import pdb
def fact(x):
    f = 1
    for i in range(1, x+1):
        pdb.set_trace()
        print(i)
        f = f * i
    return f
if __name__ == "__main__":
    print("factorial of 3=", fact(3))

ডিবাগার আচরণ কমান্ড লাইন এনভায়রনমেন্টে যা পাই той একই হবে।

  1. পাইথন yield কিওয়ার্ড: একটি গাইড

  2. জাভাস্ক্রিপ্টে debugger স্টেটমেন্ট

  3. পাইথনে List-এর অভ্যন্তরীণ কাজকর্ম

  4. পাইথনে match() ফাংশন কী