আমার কাছে পাইথন অ্যাপ্লিকেশন রয়েছে যা সময়ে সময়ে আটকে যায় এবং আমি কোথায় তা জানতে পারি না।
যে সঠিক কোডটি চলছে তা আপনাকে দেখানোর জন্য পাইথন ইন্টারপ্রেটার সংকেত দেওয়ার কোনও উপায় আছে কি?
ফ্লাই স্ট্যাকট্রেস কিছু ধরণের?
সম্পর্কিত প্রশ্নাবলী:
আমার কাছে পাইথন অ্যাপ্লিকেশন রয়েছে যা সময়ে সময়ে আটকে যায় এবং আমি কোথায় তা জানতে পারি না।
যে সঠিক কোডটি চলছে তা আপনাকে দেখানোর জন্য পাইথন ইন্টারপ্রেটার সংকেত দেওয়ার কোনও উপায় আছে কি?
ফ্লাই স্ট্যাকট্রেস কিছু ধরণের?
সম্পর্কিত প্রশ্নাবলী:
উত্তর:
আমার মতো পরিস্থিতিগুলির জন্য আমি মডিউলটি ব্যবহার করি - যেখানে একটি প্রক্রিয়া দীর্ঘ সময়ের জন্য চলতে থাকবে তবে অজানা এবং অপ্রতিরোধ্য কারণে কখনও কখনও আটকে যায়। এটি কিছুটা হ্যাকি, এবং কেবল ইউনিক্সে কাজ করে (সংকেতের প্রয়োজন):
import code, traceback, signal
def debug(sig, frame):
"""Interrupt running process, and provide a python prompt for
interactive debugging."""
d={'_frame':frame} # Allow access to frame object.
d.update(frame.f_globals) # Unless shadowed by global
d.update(frame.f_locals)
i = code.InteractiveConsole(d)
message = "Signal received : entering python shell.\nTraceback:\n"
message += ''.join(traceback.format_stack(frame))
i.interact(message)
def listen():
signal.signal(signal.SIGUSR1, debug) # Register handler
ব্যবহার করতে, আপনার প্রোগ্রামটি শুরু হওয়ার পরে কেবলমাত্র শ্রবণ () ফাংশনটি কল করুন (সমস্ত অজগর প্রোগ্রাম এটি ব্যবহার করার জন্য আপনি এটি সাইট.পিতেও আটকে রাখতে পারেন), এবং এটি চালাতে দিন। যে কোনও মুহুর্তে, কিল ব্যবহার করে বা পাইথন ব্যবহার করে প্রক্রিয়াটি একটি SIGUSR1 সিগন্যাল প্রেরণ করুন:
os.kill(pid, signal.SIGUSR1)
এটি আপনাকে বর্তমানে স্ট্যাকের চিহ্নটি দেখায় এবং আপনাকে ভেরিয়েবলগুলি ম্যানিপুলেট করতে দেয়, প্রোগ্রামটি বর্তমানে এটি যে পর্যায়ে রয়েছে অজগর কনসোলে বিরতি সৃষ্টি করবে। চলমান চালিয়ে যাওয়ার জন্য কন্ট্রোল-ডি (ইওএফ) ব্যবহার করুন (তবে মনে রাখবেন যে আপনি যে বিন্দুতে সিগন্যাল করেছেন তাতে সম্ভবত আপনি কোনও আই / ও ইত্যাদি বিঘ্নিত করবেন, সুতরাং এটি সম্পূর্ণরূপে অনুপ্রবেশকারী নয়)।
আমার কাছে অন্য স্ক্রিপ্ট রয়েছে যা একই কাজ করে, কেবল এটি পাইপের মাধ্যমে চলমান প্রক্রিয়াটির সাথে যোগাযোগ করে (ব্যাকগ্রাউন্ড প্রসেস ইত্যাদি ডিবাগ করার অনুমতি দেওয়ার জন্য) except এখানে পোস্ট করার জন্য এটি কিছুটা বড়, তবে আমি একে অজগর রান্নার বইয়ের রেসিপি হিসাবে যুক্ত করেছি ।
faulthandler
একটি সি স্তর সংকেত হ্যান্ডলার রয়েছে যা ব্যাখ্যাকারী লুপ প্রয়োজন প্রতিক্রিয়াশীল হতে ছাড়া পাইথন স্ট্যাক প্রিন্ট করব জন্য মডিউল (এবং তার গুলো পুরনো PyPI পাওয়া যাবে)।
সিগন্যাল হ্যান্ডলারটি ইনস্টল করার পরামর্শটি ভাল, এবং আমি এটি প্রচুর ব্যবহার করি। উদাহরণস্বরূপ, bzr দ্বারা ডিফল্টরূপে SIGQUIT হ্যান্ডলার রয়েছে যা পূজা ইনস্টল pdb.set_trace()
অবিলম্বে তোমাকে ড্রপ পিডিবি প্রম্পট। ( সঠিক বিশদগুলির জন্য bzrlib.breakin মডিউলটির উত্স দেখুন )) পিডিবি দিয়ে আপনি কেবল বর্তমান স্ট্যাক ট্রেস পেতে পারবেন না তবে ভেরিয়েবলগুলিও পরিদর্শন করতে পারেন ইত্যাদি
যাইহোক, কখনও কখনও আমাকে একটি প্রক্রিয়া ডিবাগ করতে হবে যা সিগন্যাল হ্যান্ডলারটি ইনস্টল করার জন্য আমার দূরদর্শিতা ছিল না lin লিনাক্সে, আপনি প্রক্রিয়াটির সাথে জিডিবি সংযুক্ত করতে পারেন এবং কিছু জিডিবি ম্যাক্রো দিয়ে পাইথন স্ট্যাক ট্রেস পেতে পারেন। রাখুন http://svn.python.org/projects/python/trunk/Misc/gdbinit মধ্যে ~/.gdbinit
, তারপর:
gdb -p
PID
pystack
দুর্ভাগ্যক্রমে এটি সম্পূর্ণ নির্ভরযোগ্য নয়, তবে বেশিরভাগ সময় এটি কাজ করে।
পরিশেষে, সংযুক্তি strace
প্রায়শই আপনাকে একটি ভাল ধারণা দিতে পারে কোনও প্রক্রিয়া কী করছে।
python-dbg
)। এই চিহ্নগুলি ব্যতীত, আপনি খুব বেশি দরকারী তথ্য পাবেন বলে মনে হয় না।
Unable to locate python frame
প্রতিটি কমান্ডে ফিরে আসে
আমি প্রায় সবসময় একাধিক থ্রেড নিয়ে কাজ করি এবং মূল থ্রেড সাধারণত বেশি কিছু করে না, তাই সবচেয়ে মজার বিষয়টি হ'ল সমস্ত স্ট্যাকগুলি (যা জাভার ডাম্পের মতো) ডাম্প করা। এই ব্লগের উপর ভিত্তি করে একটি বাস্তবায়ন এখানে দেওয়া হয়েছে :
import threading, sys, traceback
def dumpstacks(signal, frame):
id2name = dict([(th.ident, th.name) for th in threading.enumerate()])
code = []
for threadId, stack in sys._current_frames().items():
code.append("\n# Thread: %s(%d)" % (id2name.get(threadId,""), threadId))
for filename, lineno, name, line in traceback.extract_stack(stack):
code.append('File: "%s", line %d, in %s' % (filename, lineno, name))
if line:
code.append(" %s" % (line.strip()))
print "\n".join(code)
import signal
signal.signal(signal.SIGQUIT, dumpstacks)
একটি একটি স্ট্যাক ট্রেস পথ অপ্রস্তুত পাইথন প্রোগ্রাম, একটি স্টক পাইথন চলমান প্রতীক ডিবাগ ছাড়া দিয়ে করা যাবে pyrasite । উবুন্টু ট্রাস্টিতে আমার জন্য আকর্ষণীয় কাজ করেছিলেন:
$ sudo pip install pyrasite
$ echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
$ sudo pyrasite 16262 dump_stacks.py # dumps stacks to stdout/stderr of the python program
(অন্যান্য সরঞ্জামের মধ্যে @ অ্যালবার্টের টুপি, যার উত্তরে এটিতে একটি নির্দেশক রয়েছে))
dump_stacks.py
ছিল সহজভাবেimport traceback; traceback.print_stack()
traceback -l
আপনি ব্যবহার করতে পারেন পূর্বনির্ধারিত পাইথন স্ক্রিপ্টগুলির একটি তালিকা আপনাকে দেয় এবং সেগুলির dump_stacks.py
মধ্যে একটি। যদি আপনি নিজের ব্যবহার করে থাকেন (উদাহরণস্বরূপ কোনও ফাইলের জন্য স্ট্যাক ট্রেস লেখার জন্য) তবে আলাদা কোনও নাম ব্যবহার করা বুদ্ধিমানের কাজ হতে পারে।
apt-get install gdb python-dbg
পাইরেসাইট চালানোর আগে চালনা (বা সমমান), অন্যথায় এটি নিঃশব্দে ব্যর্থ হবে। অন্যথায় কবজির মতো কাজ করে!
>>> import traceback
>>> def x():
>>> print traceback.extract_stack()
>>> x()
[('<stdin>', 1, '<module>', None), ('<stdin>', 2, 'x', None)]
আপনি স্ট্যাক ট্রেসকে সুন্দরভাবে ফর্ম্যাট করতে পারেন, ডক্সটি দেখুন ।
সম্পাদনা : @ ডগলাস লিডারের পরামর্শ অনুসারে জাওয়ার আচরণ অনুকরণ করার জন্য এটি যুক্ত করুন:
import signal
import traceback
signal.signal(signal.SIGUSR1, lambda sig, stack: traceback.print_stack(stack))
আপনার অ্যাপ্লিকেশনটিতে স্টার্টআপ কোডে। তারপরে আপনি SIGUSR1
চলমান পাইথন প্রক্রিয়াটিতে প্রেরণ করে স্ট্যাকটি মুদ্রণ করতে পারেন ।
ট্রেসব্যাক মডিউল তাদের মধ্যে কিছু চমৎকার ফাংশন, রয়েছে: print_stack:
import traceback
traceback.print_stack()
import traceback; f = open('/tmp/stack-trace.log', 'w') traceback.print_stack(file=f) f.close()
আপনি ফল্টহ্যান্ডার মডিউল চেষ্টা করতে পারেন । এটি ব্যবহার করে ইনস্টল করুন pip install faulthandler
এবং যুক্ত করুন:
import faulthandler, signal
faulthandler.register(signal.SIGUSR1)
আপনার প্রোগ্রামের শুরুতে। তারপরে kill -USR1 42
স্ট্যান্ডার্ড আউটপুটে সমস্ত থ্রেডের পাইথন ট্রেসব্যাক প্রদর্শনের জন্য আপনার প্রক্রিয়াতে (প্রাক্তন:) SIGUSR1 প্রেরণ করুন । আরও বিকল্পের জন্য ডকুমেন্টেশন পড়ুন (উদাহরণস্বরূপ: কোনও ফাইলটিতে লগইন করুন) এবং ট্রেসব্যাক প্রদর্শন করার অন্যান্য উপায়।
মডিউলটি এখন পাইথনের ৩.৩ অংশ। পাইথন 2 এর জন্য দেখুন http://faulthandler.readthedocs.org/
অপ্রস্তুত পাইথন প্রক্রিয়াটির স্ট্যাক ট্রেস পাওয়ার জন্য স্পিভের টিপটি (যা আমি ভোট দিয়েছি এবং সুনামের পয়েন্টগুলি থাকলে আমি মন্তব্য করব) তা এখানে সত্যই আমাকে কীভাবে সাহায্য করেছিল । আমি জিডিবিনিট স্ক্রিপ্টটি সংশোধন না করা পর্যন্ত এটি কাজ করে না । তাই:
http://svn.python.org/projects/python/trunk/Misc/gdbinit ডাউনলোড করুন এবং এতে রেখে~/.gdbinit
এটি সম্পাদনা করুন, এ পরিবর্তন [সম্পাদনা: আর প্রয়োজন নেই; লিঙ্কযুক্ত ফাইলে ২০১০-০১-১৪ পর্যন্ত ইতিমধ্যে এই পরিবর্তন রয়েছে]PyEval_EvalFrame
করেPyEval_EvalFrameEx
জিডিবি সংযুক্ত করুন: gdb -p PID
পাইথন স্ট্যাক ট্রেস পান: pystack
No symbol "co" in current context.
আমি হরিদ্বের প্রতিক্রিয়াতে এটি একটি মন্তব্য হিসাবে যুক্ত করব , তবে এটি করার মতো খ্যাতি আমার নেই:
আমাদের মধ্যে কিছু এখনও ২.on এর চেয়ে বেশি পাইথনের একটি সংস্করণে আটকে রয়েছে (থ্রেড.সিডেন্টের জন্য প্রয়োজনীয়), তাই পাইথন ২.৫ এ কাজ করার কোডটি পেয়েছি (যদিও থ্রেডের নামটি প্রকাশ না করে):
import traceback
import sys
def dumpstacks(signal, frame):
code = []
for threadId, stack in sys._current_frames().items():
code.append("\n# Thread: %d" % (threadId))
for filename, lineno, name, line in traceback.extract_stack(stack):
code.append('File: "%s", line %d, in %s' % (filename, lineno, name))
if line:
code.append(" %s" % (line.strip()))
print "\n".join(code)
import signal
signal.signal(signal.SIGQUIT, dumpstacks)
পাইথন -dv thycript.py
এটি দোভাষীকে ডিবাগ মোডে চালিত করতে এবং আপনাকে দোভাষী কী করছে তার একটি ট্রেস দেবে।
আপনি যদি ইন্টারেক্টিভভাবে কোডটি ডিবাগ করতে চান তবে আপনার এটির মতো চালানো উচিত:
পাইথন-এম পিডিবি তোমার স্ক্রিপ্ট.পি
এটি পাইথন ইন্টারপ্রেটারকে আপনার স্ক্রিপ্টটি "পিডিবি" মডিউলটি দিয়ে চালাতে বলে যা পাইথন ডিবাগার, আপনি যদি এটি চালান যে ইন্টারপ্রেক্টর ইন্টারেক্টিভ মোডে কার্যকর করা হবে, অনেকটা জিডিবির মতো
faulthandler
পাইথন ৩.৩-তে নতুন মডিউলটি দেখুন । একজন faulthandler
গুলো পুরনো পাইথন 2 ব্যবহারের জন্য PyPI পাওয়া যায়।
সোলারিসে, আপনি পেস্ট্যাক ব্যবহার করতে পারেন (1) পাইথন কোডে কোনও পরিবর্তন প্রয়োজন। যেমন।
# pstack 16000 | grep : | head
16000: /usr/bin/python2.6 /usr/lib/pkg.depotd --cfg svc:/application/pkg/serv
[ /usr/lib/python2.6/vendor-packages/cherrypy/process/wspbus.py:282 (_wait) ]
[ /usr/lib/python2.6/vendor-packages/cherrypy/process/wspbus.py:295 (wait) ]
[ /usr/lib/python2.6/vendor-packages/cherrypy/process/wspbus.py:242 (block) ]
[ /usr/lib/python2.6/vendor-packages/cherrypy/_init_.py:249 (quickstart) ]
[ /usr/lib/pkg.depotd:890 (<module>) ]
[ /usr/lib/python2.6/threading.py:256 (wait) ]
[ /usr/lib/python2.6/Queue.py:177 (get) ]
[ /usr/lib/python2.6/vendor-packages/pkg/server/depot.py:2142 (run) ]
[ /usr/lib/python2.6/threading.py:477 (run)
etc.
pstack
উপস্থিত রয়েছে যা একই কাজ করে
আপনি যদি লিনাক্স সিস্টেমে থাকেন তবে gdb
পাইথন ডিবাগ এক্সটেনশনগুলির সাথে ( প্যাকেজে python-dbg
বা python-debuginfo
প্যাকেজ হতে পারে ) দুর্দান্ততার ব্যবহার করুন। এটি মাল্টিথ্রেডেড অ্যাপ্লিকেশন, জিইউআই অ্যাপ্লিকেশন এবং সি মডিউলগুলিতে সহায়তা করে।
আপনার প্রোগ্রামটি এর সাথে চালান:
$ gdb -ex r --args python <programname>.py [arguments]
এটি এটি gdb
প্রস্তুত python <programname>.py <arguments>
এবং r
আন করার নির্দেশ দেয়।
এখন আপনি যখন প্রোগ্রাম স্থগিত করবেন তখন gdb
কনসোলে স্যুইচ করুন , টিপুন Ctr+Cএবং সম্পাদন করুন:
(gdb) thread apply all py-list
দেখুন উদাহরণ অধিবেশন এবং আরো তথ্য এখানে এবং এখানে ।
আমি আমার থ্রেডগুলি ডিবাগ করার সমাধানের জন্য কিছুক্ষণ খুঁজছিলাম এবং হরিদসকে ধন্যবাদ জানিয়ে আমি এটি এখানে পেয়েছি। আমি ট্রেসব্যাক নিয়োগ করে কিছুটা সরলীকৃত সংস্করণ ব্যবহার করি prপ্রিন্ট_স্ট্যাক ():
import sys, traceback, signal
import threading
import os
def dumpstacks(signal, frame):
id2name = dict((th.ident, th.name) for th in threading.enumerate())
for threadId, stack in sys._current_frames().items():
print(id2name[threadId])
traceback.print_stack(f=stack)
signal.signal(signal.SIGQUIT, dumpstacks)
os.killpg(os.getpgid(0), signal.SIGQUIT)
আমার প্রয়োজনের জন্য আমি নাম অনুসারে থ্রেডও ফিল্টার করি।
পাইডবির দিকে নজর রাখা উচিত , "জিডিবি কমান্ড সেটের উপর ভিত্তি করে পাইথন ডিবাগারের বিস্তৃত সংস্করণ"। এটিতে সিগন্যাল পরিচালকদের অন্তর্ভুক্ত রয়েছে যা নির্দিষ্ট সিগন্যাল প্রেরণের সময় ডিবাগার শুরু করার যত্ন নিতে পারে।
২০০ 2006 গ্রীষ্মের সামার অফ কোড প্রকল্পটি এমপিডিবি নামে একটি মডিউলে পিডিবির সাথে রিমোট-ডিবাগিং বৈশিষ্ট্যগুলি যুক্ত করার দিকে তাকিয়েছিল ।
আমি এমন কিছু সরঞ্জাম একসাথে হ্যাক করেছি যা চলমান পাইথন প্রক্রিয়াতে সংযুক্ত হয় এবং পাইথন শেলটি পেতে কিছু কোড সংকেত দেয়।
এখানে দেখুন: https://github.com/albertz/pydbattach
pyrasite
নিখুঁতভাবে কাজ করেছেন!
এটি চমৎকার পাই-স্পাই দিয়ে করা যেতে পারে । এটি পাইথন প্রোগ্রামগুলির জন্য একটি নমুনা প্রদানকারী প্রোফাইল , সুতরাং এর কাজটি পাইথন প্রসেসের সাথে সংযুক্ত করা এবং তাদের কল স্ট্যাকের নমুনা দেওয়া। সুতরাং, প্রক্রিয়াটিতে py-spy dump --pid $SOME_PID
সমস্ত থ্রেডের কল স্ট্যাকগুলি ছুঁড়ে ফেলার জন্য আপনাকে যা করতে হবে তা হ'ল $SOME_PID
। সাধারণত এটির বাড়ানো সুবিধাগুলি প্রয়োজন (লক্ষ্য প্রক্রিয়াটির স্মৃতি পড়তে)।
থ্রেডযুক্ত পাইথন অ্যাপ্লিকেশনটির জন্য এটি দেখতে কেমন লাগে তার একটি উদাহরণ এখানে।
$ sudo py-spy dump --pid 31080
Process 31080: python3.7 -m chronologer -e production serve -u www-data -m
Python v3.7.1 (/usr/local/bin/python3.7)
Thread 0x7FEF5E410400 (active): "MainThread"
_wait (cherrypy/process/wspbus.py:370)
wait (cherrypy/process/wspbus.py:384)
block (cherrypy/process/wspbus.py:321)
start (cherrypy/daemon.py:72)
serve (chronologer/cli.py:27)
main (chronologer/cli.py:84)
<module> (chronologer/__main__.py:5)
_run_code (runpy.py:85)
_run_module_as_main (runpy.py:193)
Thread 0x7FEF55636700 (active): "_TimeoutMonitor"
run (cherrypy/process/plugins.py:518)
_bootstrap_inner (threading.py:917)
_bootstrap (threading.py:885)
Thread 0x7FEF54B35700 (active): "HTTPServer Thread-2"
accept (socket.py:212)
tick (cherrypy/wsgiserver/__init__.py:2075)
start (cherrypy/wsgiserver/__init__.py:2021)
_start_http_thread (cherrypy/process/servers.py:217)
run (threading.py:865)
_bootstrap_inner (threading.py:917)
_bootstrap (threading.py:885)
...
Thread 0x7FEF2BFFF700 (idle): "CP Server Thread-10"
wait (threading.py:296)
get (queue.py:170)
run (cherrypy/wsgiserver/__init__.py:1586)
_bootstrap_inner (threading.py:917)
_bootstrap (threading.py:885)
পিরিঞ্জ হ'ল একটি ডিবাগার যা কোনও প্রাইরি সেটআপ ছাড়াই অজগর প্রক্রিয়াগুলি প্রিন্ট স্ট্যাক ট্রেস, ভেরিয়েবল ইত্যাদির সাথে ইন্টারেক্ট করতে পারে।
যদিও আমি আগে প্রায়শই সিগন্যাল হ্যান্ডলার সমাধানটি ব্যবহার করেছি, এখনও নির্দিষ্ট পরিবেশে সমস্যাটি পুনরুত্পাদন করা প্রায়শই কঠিন হতে পারে।
pyrasite
আমার জন্য কবজির মতো কাজ করেছিল।
চলমান অজগর প্রক্রিয়াটিতে প্রবেশ করার এবং যুক্তিসঙ্গত ফলাফল পাওয়ার কোনও উপায় নেই। যদি প্রক্রিয়াগুলি লকআপ হয় তবে স্ট্রেসকে জড়িয়ে ধরে কী ঘটছে তা সঠিকভাবে আবিষ্কার করার চেষ্টা করছি do
দুর্ভাগ্যক্রমে প্রায়ই স্ট্রেস এমন পর্যবেক্ষক যা "রেস কন্ডিশন" রেসের শর্তাদি করে যাতে আউটপুটটি সেখানেও অকেজো হয়।
এটি করার জন্য আপনি পিউডিবি , একটি পাইথন ডিবাগার ব্যবহার করতে পারেন es শুধু যোগ কর
from pudb import set_interrupt_handler; set_interrupt_handler()
আপনার কোডটিতে এবং যখন আপনি ব্রেক করতে চান তখন Ctrl-C ব্যবহার করুন। আপনি c
যদি এটিকে মিস করেন এবং আবার চেষ্টা করতে চান তবে আপনি এক সাথে চালিয়ে যেতে পারেন এবং আবারও বিরতি দিতে পারেন।
অজগর এক্সটেনশান নিয়ে আমি জিডিবি ক্যাম্পে আছি। Https://wiki.python.org/moin/DebuggingWithGdb , যার অর্থ অনুসরণ করুন
dnf install gdb python-debuginfo
অথবা sudo apt-get install gdb python2.7-dbg
gdb python <pid of running process>
py-bt
এছাড়াও বিবেচনা করুন info threads
এবং thread apply all py-bt
।
Traceback (most recent call first): Python Exception <class 'gdb.error'> No frame is currently selected.: Error occurred in Python command: No frame is currently selected.
যখন চলমান py-bt
মধ্যে gdb
?
sudo
। gdb pyton <pid>
আমারও সুদো হিসাবে চালানো দরকার ছিল ।
কনসোলে যে কোনও কার্য কীভাবে ডিবাগ করবেন :
আপনি pdb.set_trace () ব্যবহার করেন এমন ফাংশন তৈরি করুন , তারপরে আপনি ডিবাগ করতে চান এমন ফাংশন করুন।
>>> import pdb
>>> import my_function
>>> def f():
... pdb.set_trace()
... my_function()
...
তারপরে কল করা ক্রিয়াকলাপ:
>>> f()
> <stdin>(3)f()
(Pdb) s
--Call--
> <stdin>(1)my_function()
(Pdb)
শুভ ডিবাগিং :)
জাভা'র প্রতিক্রিয়ার সাথে সাকুইয়েটের অনুরূপ কিছু আমি জানিনা , তাই আপনার অ্যাপ্লিকেশনটিতে আপনাকে এটি তৈরি করতে হতে পারে। হতে পারে আপনি অন্য থ্রেডে এমন একটি সার্ভার তৈরি করতে পারেন যা কোনও প্রকারের বার্তার প্রতিক্রিয়ায় স্ট্যাকট্রেস পেতে পারে?
পরিদর্শন মডিউলটি ব্যবহার করুন।
আমদানি পরিদর্শন সহায়তা (inspect.stack) মডিউল পরিদর্শন ফাংশন স্ট্যাক সহায়তা:
স্ট্যাক (প্রসঙ্গে = 1) কলারের ফ্রেমের উপরে স্ট্যাকের জন্য রেকর্ডগুলির একটি তালিকা ফেরত দিন।
আমি এটি সত্যিই খুব সহায়ক মনে করি।
পাইথন 3-এ, পিডিবি আপনি প্রথমবার ডিবাগারে সি (অন্ট (ইনু)) ব্যবহার করার পরে একটি সিগন্যাল হ্যান্ডলার স্বয়ংক্রিয়ভাবে ইনস্টল করবে। এরপরে কন্ট্রোল-সি টিপলে আপনি ঠিক সেখানে ফিরে আসবেন। পাইথন ২-তে, এখানে একটি ওয়ান-লাইনার রয়েছে যা তুলনামূলকভাবে পুরানো সংস্করণেও কাজ করা উচিত (২.7-এ পরীক্ষিত হয়েছিল তবে আমি পাইথনের উত্সটি ২.৪-এ ফিরে দেখেছি এবং এটি ঠিক আছে):
import pdb, signal
signal.signal(signal.SIGINT, lambda sig, frame: pdb.Pdb().set_trace(frame))
পিডিবি শেখার উপযুক্ত যদি আপনি পাইথনকে ডিবাগ করার জন্য কোনও পরিমাণ সময় ব্যয় করেন। ইন্টারফেসটি কিছুটা অবস্ফুট তবে যিনি জিডিবি-র মতো অনুরূপ সরঞ্জাম ব্যবহার করেছেন তার সাথে পরিচিত হওয়া উচিত।
আপনার যদি ইউডাব্লুএসজিআই দিয়ে এটি করার প্রয়োজন হয় তবে এটিতে পাইথন ট্রেসব্যাকার অন্তর্নির্মিত রয়েছে এবং এটি এটি কনফিগারেশনে সক্ষম করার বিষয়টি (প্রতিটি কর্মীর নামের সাথে সংযুক্ত রয়েছে):
py-tracebacker=/var/run/uwsgi/pytrace
একবার এটি হয়ে গেলে আপনি কেবল সকেটের সাথে সংযুক্ত হয়ে ব্যাকট্রেস মুদ্রণ করতে পারেন:
uwsgi --connect-and-read /var/run/uwsgi/pytrace1
কোডটি যে পর্যায়ে চলেছে সেখানে আপনি সুন্দর বিন্যাসিত মুদ্রিত স্ট্যাক ট্রেস দেখতে এই ছোট স্নিপেটটি sertোকাতে পারেন। এটি ধরে নেওয়া হয় যে logs
আপনার প্রকল্পের মূল ডিরেক্টরিতে আপনার কাছে একটি ফোল্ডার বলা হয়েছে।
# DEBUG: START DEBUG -->
import traceback
with open('logs/stack-trace.log', 'w') as file:
traceback.print_stack(file=file)
# DEBUG: END DEBUG --!