একটি চলমান পাইথন অ্যাপ্লিকেশন থেকে স্ট্যাক ট্রেস দেখানো হচ্ছে


340

আমার কাছে পাইথন অ্যাপ্লিকেশন রয়েছে যা সময়ে সময়ে আটকে যায় এবং আমি কোথায় তা জানতে পারি না।

যে সঠিক কোডটি চলছে তা আপনাকে দেখানোর জন্য পাইথন ইন্টারপ্রেটার সংকেত দেওয়ার কোনও উপায় আছে কি?

ফ্লাই স্ট্যাকট্রেস কিছু ধরণের?

সম্পর্কিত প্রশ্নাবলী:



উত্তর:


315

আমার মতো পরিস্থিতিগুলির জন্য আমি মডিউলটি ব্যবহার করি - যেখানে একটি প্রক্রিয়া দীর্ঘ সময়ের জন্য চলতে থাকবে তবে অজানা এবং অপ্রতিরোধ্য কারণে কখনও কখনও আটকে যায়। এটি কিছুটা হ্যাকি, এবং কেবল ইউনিক্সে কাজ করে (সংকেতের প্রয়োজন):

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 এখানে পোস্ট করার জন্য এটি কিছুটা বড়, তবে আমি একে অজগর রান্নার বইয়ের রেসিপি হিসাবে যুক্ত করেছি ।


1
ধন্যবাদ! এটিই আমি যা খুঁজছিলাম। হয়তো আপনি কোনও পাইথনের স্নিপেট সাইটে পাইপ সমর্থন সহ সেই স্ক্রিপ্টটি পোস্ট করতে পারেন?
Seb

2
আমি এখন এটি পাইথন কুকবুক সাইটে পোস্ট করেছি - লিঙ্ক যুক্ত করা হয়েছে।
ব্রায়ান

1
ইতিহাসের বৈশিষ্ট্যগুলি সক্ষম করতে আমার "আমদানি পাঠ্যলাইন" যুক্ত করা দরকার।
चमत्कार 2k

2
দুর্দান্ত টিপ! এটি "মাইপাইথন্যাপ" শব্দটি সম্বলিত সমস্ত প্রক্রিয়াতে সিগন্যাল প্রেরণেও কাজ করে: pkill -SIGUSR1 -f মাইপাইথন্যাপ
আলেকজান্ডার

10
যদি অ্যাপ্লিকেশনটি আটকে থাকে তবে পাইথন ইন্টারপ্রেটার লুপটি সংকেতটি প্রক্রিয়া করতে চালাতে সক্ষম হতে পারে না। ব্যবহার করুন faulthandlerএকটি সি স্তর সংকেত হ্যান্ডলার রয়েছে যা ব্যাখ্যাকারী লুপ প্রয়োজন প্রতিক্রিয়াশীল হতে ছাড়া পাইথন স্ট্যাক প্রিন্ট করব জন্য মডিউল (এবং তার গুলো পুরনো PyPI পাওয়া যাবে)।
জিপিএস

146

সিগন্যাল হ্যান্ডলারটি ইনস্টল করার পরামর্শটি ভাল, এবং আমি এটি প্রচুর ব্যবহার করি। উদাহরণস্বরূপ, bzr দ্বারা ডিফল্টরূপে SIGQUIT হ্যান্ডলার রয়েছে যা পূজা ইনস্টল pdb.set_trace()অবিলম্বে তোমাকে ড্রপ পিডিবি প্রম্পট। ( সঠিক বিশদগুলির জন্য bzrlib.breakin মডিউলটির উত্স দেখুন )) পিডিবি দিয়ে আপনি কেবল বর্তমান স্ট্যাক ট্রেস পেতে পারবেন না তবে ভেরিয়েবলগুলিও পরিদর্শন করতে পারেন ইত্যাদি

যাইহোক, কখনও কখনও আমাকে একটি প্রক্রিয়া ডিবাগ করতে হবে যা সিগন্যাল হ্যান্ডলারটি ইনস্টল করার জন্য আমার দূরদর্শিতা ছিল না lin লিনাক্সে, আপনি প্রক্রিয়াটির সাথে জিডিবি সংযুক্ত করতে পারেন এবং কিছু জিডিবি ম্যাক্রো দিয়ে পাইথন স্ট্যাক ট্রেস পেতে পারেন। রাখুন http://svn.python.org/projects/python/trunk/Misc/gdbinit মধ্যে ~/.gdbinit, তারপর:

  • জিডিবি সংযুক্ত করুন: gdb -p PID
  • পাইথন স্ট্যাক ট্রেস পান: pystack

দুর্ভাগ্যক্রমে এটি সম্পূর্ণ নির্ভরযোগ্য নয়, তবে বেশিরভাগ সময় এটি কাজ করে।

পরিশেষে, সংযুক্তি straceপ্রায়শই আপনাকে একটি ভাল ধারণা দিতে পারে কোনও প্রক্রিয়া কী করছে।


2
উজ্জ্বল! পাইস্ট্যাক কমান্ডটি মাঝে মাঝে লক হয়ে যায়, তবে এটি করার আগে কোনও প্রক্রিয়া করার প্রয়োজন ছাড়াই পাইথন কোড লাইনে আমাকে প্রক্রিয়াটির একটি সম্পূর্ণ স্ট্যাক ট্রেস দেয়।
Muudscope

26
গৌণ আপডেট: এই জিডিবি কৌশলটি (এবং আপডেট কোড) উইকি.পাইথন.আর . / মাইন / ডেবিগিংবিথজিডিবিতে নথিভুক্ত হয়েছে, এই ইউআরএলে নথিভুক্ত, এবং দৃশ্যত জিডিবি 7-তে কিছু পাইথন সমর্থন রয়েছে।
নেলসন

7
যতদূর আমি বলতে পারি, এটি কেবল সত্যই কার্যকর হয় যদি আপনার পাইথন বাইনারিতে ডিবাগ চিহ্নগুলি সংকলন করা থাকে - যেমন: আপনি আপনার প্রোগ্রামটি পাইথন 2-ডিবিজি দিয়ে চালিয়েছেন (উবুন্টুতে, এটি একটি পৃথক প্যাকেজে রয়েছে python-dbg)। এই চিহ্নগুলি ব্যতীত, আপনি খুব বেশি দরকারী তথ্য পাবেন বলে মনে হয় না।
drevicko

1
আমার ক্ষেত্রে এটি Unable to locate python frameপ্রতিটি কমান্ডে ফিরে আসে
seriyPS

6
gdb 7+ - পাইথন সমর্থন পাইথন- gdb.py দ্বারা সরবরাহ করা হয়। আরও বিশদ এখানে: chezsoi.org/lucas/blog/2014/11/07/en-gdb-python-macros
লুকাস

71

আমি প্রায় সবসময় একাধিক থ্রেড নিয়ে কাজ করি এবং মূল থ্রেড সাধারণত বেশি কিছু করে না, তাই সবচেয়ে মজার বিষয়টি হ'ল সমস্ত স্ট্যাকগুলি (যা জাভার ডাম্পের মতো) ডাম্প করা। এই ব্লগের উপর ভিত্তি করে একটি বাস্তবায়ন এখানে দেওয়া হয়েছে :

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)

53

একটি একটি স্ট্যাক ট্রেস পথ অপ্রস্তুত পাইথন প্রোগ্রাম, একটি স্টক পাইথন চলমান প্রতীক ডিবাগ ছাড়া দিয়ে করা যাবে 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

(অন্যান্য সরঞ্জামের মধ্যে @ অ্যালবার্টের টুপি, যার উত্তরে এটিতে একটি নির্দেশক রয়েছে))


5
এটি আমার পক্ষে দুর্দান্ত কাজ করেছে, যেখানে dump_stacks.pyছিল সহজভাবেimport traceback; traceback.print_stack()
জন লেহম্যান

2
traceback -lআপনি ব্যবহার করতে পারেন পূর্বনির্ধারিত পাইথন স্ক্রিপ্টগুলির একটি তালিকা আপনাকে দেয় এবং সেগুলির dump_stacks.pyমধ্যে একটি। যদি আপনি নিজের ব্যবহার করে থাকেন (উদাহরণস্বরূপ কোনও ফাইলের জন্য স্ট্যাক ট্রেস লেখার জন্য) তবে আলাদা কোনও নাম ব্যবহার করা বুদ্ধিমানের কাজ হতে পারে।
jhndodo

12
গুরুত্বপূর্ণ টিপ: apt-get install gdb python-dbgপাইরেসাইট চালানোর আগে চালনা (বা সমমান), অন্যথায় এটি নিঃশব্দে ব্যর্থ হবে। অন্যথায় কবজির মতো কাজ করে!
jhndodo

পাইরেসাইটের শেষ প্রকাশটি 2012 সালে
বোরিস

35
>>> 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চলমান পাইথন প্রক্রিয়াটিতে প্রেরণ করে স্ট্যাকটি মুদ্রণ করতে পারেন ।


2
এটি কেবলমাত্র মূল থ্রেডের ব্যাকট্রেস মুদ্রণ করবে। আমি এখনও সমস্ত থ্রেডের ট্রেস দেখার সমাধান খুঁজে পাইনি। প্রকৃতপক্ষে, পাইথন থ্রেড অবজেক্ট থেকে স্ট্যাক পুনরুদ্ধারের জন্য একটি API এর অভাব বলে মনে হচ্ছে, যদিও থ্রেডিং.ইনুমারেট () সমস্ত থ্রেড অবজেক্টগুলিতে অ্যাক্সেস দেয়।
haridsv

এটি সাইগউইনে দুর্দান্ত কাজ করে। এটি স্ট্যাক ট্রেসটির কেবল মাত্র তিনটি লাইন মুদ্রণ করে তবে এটির একটি ক্লু পাওয়া যথেষ্ট
স্ল্যাশডোটার

28

ট্রেসব্যাক মডিউল তাদের মধ্যে কিছু চমৎকার ফাংশন, রয়েছে: print_stack:

import traceback

traceback.print_stack()

1
একটি ফাইল ব্যবহারের জন্য স্ট্যাক ট্রেস লিখতে: import traceback; f = open('/tmp/stack-trace.log', 'w') traceback.print_stack(file=f) f.close()
গুরু এম

1
উত্তরটি সহজে ব্যবহারের জন্য @ গুল্গীকে +1 করুন। স্ক্রিপ্টের ফাংশন থেকে কল-স্ট্যাক ট্রেস পাওয়ার সহজ কাজটির জন্য অন্য কয়েকটি উত্তর খুব জটিল বলে মনে হয়েছিল।
গুরুম

24

আপনি ফল্টহ্যান্ডার মডিউল চেষ্টা করতে পারেন । এটি ব্যবহার করে ইনস্টল করুন pip install faulthandlerএবং যুক্ত করুন:

import faulthandler, signal
faulthandler.register(signal.SIGUSR1)

আপনার প্রোগ্রামের শুরুতে। তারপরে kill -USR1 42স্ট্যান্ডার্ড আউটপুটে সমস্ত থ্রেডের পাইথন ট্রেসব্যাক প্রদর্শনের জন্য আপনার প্রক্রিয়াতে (প্রাক্তন:) SIGUSR1 প্রেরণ করুন । আরও বিকল্পের জন্য ডকুমেন্টেশন পড়ুন (উদাহরণস্বরূপ: কোনও ফাইলটিতে লগইন করুন) এবং ট্রেসব্যাক প্রদর্শন করার অন্যান্য উপায়।

মডিউলটি এখন পাইথনের ৩.৩ অংশ। পাইথন 2 এর জন্য দেখুন http://faulthandler.readthedocs.org/


20

অপ্রস্তুত পাইথন প্রক্রিয়াটির স্ট্যাক ট্রেস পাওয়ার জন্য স্পিভের টিপটি (যা আমি ভোট দিয়েছি এবং সুনামের পয়েন্টগুলি থাকলে আমি মন্তব্য করব) তা এখানে সত্যই আমাকে কীভাবে সাহায্য করেছিল । আমি জিডিবিনিট স্ক্রিপ্টটি সংশোধন না করা পর্যন্ত এটি কাজ করে না । তাই:

  • http://svn.python.org/projects/python/trunk/Misc/gdbinit ডাউনলোড করুন এবং এতে রেখে~/.gdbinit

  • এটি সম্পাদনা করুন, এ পরিবর্তন PyEval_EvalFrameকরেPyEval_EvalFrameEx[সম্পাদনা: আর প্রয়োজন নেই; লিঙ্কযুক্ত ফাইলে ২০১০-০১-১৪ পর্যন্ত ইতিমধ্যে এই পরিবর্তন রয়েছে]

  • জিডিবি সংযুক্ত করুন: gdb -p PID

  • পাইথন স্ট্যাক ট্রেস পান: pystack


উল্লিখিত ইউআরএলটিতে জিডিবিনিট ইতিমধ্যে মনে হচ্ছে আপনার প্রস্তাবিত প্যাচটি রয়েছে। আমার ক্ষেত্রে, যখন আমি পাইপ্যাকটি টাইপ করলাম তখন আমার সিপিইউ সবে স্তব্ধ হয়ে গেল। নিশ্চিত কেন।
জেসি গ্লিক

2
নাহ, এটি হয় না - আমি অস্পষ্ট ছিলাম, দুঃখিত, কারণ সেই রেখাটি তিন জায়গায় উপস্থিত রয়েছে। এই প্যাচটির সাথে আমি যুক্ত প্যাচটি দেখায় যে আমি এই কাজটি দেখলে কোনটি পরিবর্তন করেছি।
গুন্নলাউগুর ব্রিম

2
@ স্পাইভের উত্তরের মতো, এটির জন্য ডিবাগিং প্রতীকগুলি সংকলিত পাইথনের অধীনে প্রোগ্রামটি চালানো দরকার। অন্যথায় আপনি কেবল পাবেনNo symbol "co" in current context.
নিকোল্লে

12

আমি হরিদ্বের প্রতিক্রিয়াতে এটি একটি মন্তব্য হিসাবে যুক্ত করব , তবে এটি করার মতো খ্যাতি আমার নেই:

আমাদের মধ্যে কিছু এখনও ২.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)

11

পাইথন -dv thycript.py

এটি দোভাষীকে ডিবাগ মোডে চালিত করতে এবং আপনাকে দোভাষী কী করছে তার একটি ট্রেস দেবে।

আপনি যদি ইন্টারেক্টিভভাবে কোডটি ডিবাগ করতে চান তবে আপনার এটির মতো চালানো উচিত:

পাইথন-এম পিডিবি তোমার স্ক্রিপ্ট.পি

এটি পাইথন ইন্টারপ্রেটারকে আপনার স্ক্রিপ্টটি "পিডিবি" মডিউলটি দিয়ে চালাতে বলে যা পাইথন ডিবাগার, আপনি যদি এটি চালান যে ইন্টারপ্রেক্টর ইন্টারেক্টিভ মোডে কার্যকর করা হবে, অনেকটা জিডিবির মতো


এটি প্রশ্নের উত্তর দেয় না। প্রশ্নটি ইতিমধ্যে একটি চলমান প্রক্রিয়া সম্পর্কে ছিল।
dbn

11

faulthandlerপাইথন ৩.৩-তে নতুন মডিউলটি দেখুন । একজন faulthandlerগুলো পুরনো পাইথন 2 ব্যবহারের জন্য PyPI পাওয়া যায়।


2
@ হাইপোর একটি সাম্প্রতিক উত্তর এটিকে আরও বিশদে কভার করে। আমি নিশ্চিত না কীভাবে এটি সাধারণত এসও তে পরিচালিত হয়, তবে দুটি মূল উত্তরটি নকল করা ভুল বলে মনে হয় ...
নিকোলে

7

সোলারিসে, আপনি পেস্ট্যাক ব্যবহার করতে পারেন (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.

2
কোনও ডেবিয়ান / উবুন্টু প্রোগ্রাম pstackউপস্থিত রয়েছে যা একই কাজ করে
ররি

1
এটি কেবল লিনাক্সের অধীনে ব্যাকট্রেস দেবে বলে মনে হচ্ছে, ফাইল নাম এবং লাইন নম্বরগুলির সাথে পাইথন ট্রেসব্যাক নয়।
ogrisel

6

আপনি যদি লিনাক্স সিস্টেমে থাকেন তবে 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

দেখুন উদাহরণ অধিবেশন এবং আরো তথ্য এখানে এবং এখানে


6

আমি আমার থ্রেডগুলি ডিবাগ করার সমাধানের জন্য কিছুক্ষণ খুঁজছিলাম এবং হরিদসকে ধন্যবাদ জানিয়ে আমি এটি এখানে পেয়েছি। আমি ট্রেসব্যাক নিয়োগ করে কিছুটা সরলীকৃত সংস্করণ ব্যবহার করি 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)

আমার প্রয়োজনের জন্য আমি নাম অনুসারে থ্রেডও ফিল্টার করি।


3

পাইডবির দিকে নজর রাখা উচিত , "জিডিবি কমান্ড সেটের উপর ভিত্তি করে পাইথন ডিবাগারের বিস্তৃত সংস্করণ"। এটিতে সিগন্যাল পরিচালকদের অন্তর্ভুক্ত রয়েছে যা নির্দিষ্ট সিগন্যাল প্রেরণের সময় ডিবাগার শুরু করার যত্ন নিতে পারে।

২০০ 2006 গ্রীষ্মের সামার অফ কোড প্রকল্পটি এমপিডিবি নামে একটি মডিউলে পিডিবির সাথে রিমোট-ডিবাগিং বৈশিষ্ট্যগুলি যুক্ত করার দিকে তাকিয়েছিল


মনে হয় এটা দুই (মাধ্যমে চলে গেছে 1 ) নতুন করে লেখা হয় ( 2 ) যোগ ছাড়া সংযুক্ত-পিআইডির বৈশিষ্ট্য আমি ... খুঁজছেন ছিল
নিকোলে

3

আমি এমন কিছু সরঞ্জাম একসাথে হ্যাক করেছি যা চলমান পাইথন প্রক্রিয়াতে সংযুক্ত হয় এবং পাইথন শেলটি পেতে কিছু কোড সংকেত দেয়।

এখানে দেখুন: https://github.com/albertz/pydbattach


1
দ্রষ্টব্য: এটি কীভাবে তৈরি করা যায় তা স্পষ্ট নয়। আপনি যে লিঙ্কগুলি README এ রেখেছেন তার জন্য ধন্যবাদ: pyrasiteনিখুঁতভাবে কাজ করেছেন!
নিকোলায়

3

এটি চমৎকার পাই-স্পাই দিয়ে করা যেতে পারে । এটি পাইথন প্রোগ্রামগুলির জন্য একটি নমুনা প্রদানকারী প্রোফাইল , সুতরাং এর কাজটি পাইথন প্রসেসের সাথে সংযুক্ত করা এবং তাদের কল স্ট্যাকের নমুনা দেওয়া। সুতরাং, প্রক্রিয়াটিতে 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)  

2

পিরিঞ্জ হ'ল একটি ডিবাগার যা কোনও প্রাইরি সেটআপ ছাড়াই অজগর প্রক্রিয়াগুলি প্রিন্ট স্ট্যাক ট্রেস, ভেরিয়েবল ইত্যাদির সাথে ইন্টারেক্ট করতে পারে।

যদিও আমি আগে প্রায়শই সিগন্যাল হ্যান্ডলার সমাধানটি ব্যবহার করেছি, এখনও নির্দিষ্ট পরিবেশে সমস্যাটি পুনরুত্পাদন করা প্রায়শই কঠিন হতে পারে।


3
স্পষ্টতই এটি নির্দিষ্ট জিডিবি বিল্ডগুলির সাথে বেমানান (যেমন আমি উবুন্টুতে ইনস্টল করেছিলাম): github.com/google/pyringe/issues/16 , ম্যানুয়ালি পুনর্নির্মাণের প্রয়োজন। আর একজন ডিবাগার, pyrasiteআমার জন্য কবজির মতো কাজ করেছিল।
নিকোলে

1

চলমান অজগর প্রক্রিয়াটিতে প্রবেশ করার এবং যুক্তিসঙ্গত ফলাফল পাওয়ার কোনও উপায় নেই। যদি প্রক্রিয়াগুলি লকআপ হয় তবে স্ট্রেসকে জড়িয়ে ধরে কী ঘটছে তা সঠিকভাবে আবিষ্কার করার চেষ্টা করছি do

দুর্ভাগ্যক্রমে প্রায়ই স্ট্রেস এমন পর্যবেক্ষক যা "রেস কন্ডিশন" রেসের শর্তাদি করে যাতে আউটপুটটি সেখানেও অকেজো হয়।


1
হ্যাঁ, এটা সত্য। এটি একটি লজ্জার বিষয় যদিও থাড পিডিবি কোনও চলমান প্রক্রিয়া সংযুক্তি সমর্থন করে না ...
বার্তোস্জ রেডাচিজিস্কি

এটি সত্য নয়। উপরে "স্পিভ" দ্বারা উত্তরটি দেখুন, যা জিডিবি সংযুক্ত করতে এবং পাইথন স্ট্যাক ট্রেস পেতে কীভাবে তা দেখায়।
অ্যান্ড্রু কোক

এটি একই নয় - এই জিডিবি ম্যাক্রোগুলি নির্ভরযোগ্য নয় এবং pdb এর সম্পূর্ণ শক্তি / পরিচিত ইন্টারফেস সরবরাহ করে না। আমি প্রায়শই ইচ্ছুক যে কেউ একটি ছোট অ্যাপ্লিকেশন লিখেছিল যা পাইথন বাইটকোডকে চলমান পাইথন প্রক্রিয়াতে ইনজেক্ট করার জন্য এবং এটি 'ইম্পোর্ট পিডিবি এক্সিকিউট' করতে ব্যবহার করবে; pdb.set_trace () ', অস্থায়ীভাবে sys.stdin / stdout পুনর্নির্দেশের পরেও।
মারিয়াস গেডমিনাস

এটি আর সত্য নয়, পিরঞ্জ / পাইরেসাইটের দিকে নির্দেশ করে অন্যান্য উত্তরগুলি দেখুন।
নিকোলায়

1

এটি করার জন্য আপনি পিউডিবি , একটি পাইথন ডিবাগার ব্যবহার করতে পারেন es শুধু যোগ কর

from pudb import set_interrupt_handler; set_interrupt_handler()

আপনার কোডটিতে এবং যখন আপনি ব্রেক করতে চান তখন Ctrl-C ব্যবহার করুন। আপনি cযদি এটিকে মিস করেন এবং আবার চেষ্টা করতে চান তবে আপনি এক সাথে চালিয়ে যেতে পারেন এবং আবারও বিরতি দিতে পারেন।


আপনি যখন জাঙ্গোতে উপরের কমান্ডটি ব্যবহার করেন, তখন ভুলগুলি প্রতিরোধ করার জন্য কোনও সার্ভারটি সঠিকভাবে চালাতে ভুলবেন না: "ম্যানেজ.পি রানার্সভার
নরলোড

1

অজগর এক্সটেনশান নিয়ে আমি জিডিবি ক্যাম্পে আছি। Https://wiki.python.org/moin/DebuggingWithGdb , যার অর্থ অনুসরণ করুন

  1. dnf install gdb python-debuginfo অথবা sudo apt-get install gdb python2.7-dbg
  2. gdb python <pid of running process>
  3. 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?
কুটিলতা 18

1
কিছু মনে করো না. এটি কারণ আমার অ্যাপটি চলছে sudogdb pyton <pid>আমারও সুদো হিসাবে চালানো দরকার ছিল ।
কুটিলতা 20 ই

1

কনসোলে যে কোনও কার্য কীভাবে ডিবাগ করবেন :

আপনি 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) 

শুভ ডিবাগিং :)


0

জাভা'র প্রতিক্রিয়ার সাথে সাকুইয়েটের অনুরূপ কিছু আমি জানিনা , তাই আপনার অ্যাপ্লিকেশনটিতে আপনাকে এটি তৈরি করতে হতে পারে। হতে পারে আপনি অন্য থ্রেডে এমন একটি সার্ভার তৈরি করতে পারেন যা কোনও প্রকারের বার্তার প্রতিক্রিয়ায় স্ট্যাকট্রেস পেতে পারে?


0

পরিদর্শন মডিউলটি ব্যবহার করুন।

আমদানি পরিদর্শন সহায়তা (inspect.stack) মডিউল পরিদর্শন ফাংশন স্ট্যাক সহায়তা:

স্ট্যাক (প্রসঙ্গে = 1) কলারের ফ্রেমের উপরে স্ট্যাকের জন্য রেকর্ডগুলির একটি তালিকা ফেরত দিন।

আমি এটি সত্যিই খুব সহায়ক মনে করি।


0

পাইথন 3-এ, পিডিবি আপনি প্রথমবার ডিবাগারে সি (অন্ট (ইনু)) ব্যবহার করার পরে একটি সিগন্যাল হ্যান্ডলার স্বয়ংক্রিয়ভাবে ইনস্টল করবে। এরপরে কন্ট্রোল-সি টিপলে আপনি ঠিক সেখানে ফিরে আসবেন। পাইথন ২-তে, এখানে একটি ওয়ান-লাইনার রয়েছে যা তুলনামূলকভাবে পুরানো সংস্করণেও কাজ করা উচিত (২.7-এ পরীক্ষিত হয়েছিল তবে আমি পাইথনের উত্সটি ২.৪-এ ফিরে দেখেছি এবং এটি ঠিক আছে):

import pdb, signal
signal.signal(signal.SIGINT, lambda sig, frame: pdb.Pdb().set_trace(frame))

পিডিবি শেখার উপযুক্ত যদি আপনি পাইথনকে ডিবাগ করার জন্য কোনও পরিমাণ সময় ব্যয় করেন। ইন্টারফেসটি কিছুটা অবস্ফুট তবে যিনি জিডিবি-র মতো অনুরূপ সরঞ্জাম ব্যবহার করেছেন তার সাথে পরিচিত হওয়া উচিত।


0

আপনার যদি ইউডাব্লুএসজিআই দিয়ে এটি করার প্রয়োজন হয় তবে এটিতে পাইথন ট্রেসব্যাকার অন্তর্নির্মিত রয়েছে এবং এটি এটি কনফিগারেশনে সক্ষম করার বিষয়টি (প্রতিটি কর্মীর নামের সাথে সংযুক্ত রয়েছে):

py-tracebacker=/var/run/uwsgi/pytrace

একবার এটি হয়ে গেলে আপনি কেবল সকেটের সাথে সংযুক্ত হয়ে ব্যাকট্রেস মুদ্রণ করতে পারেন:

uwsgi --connect-and-read /var/run/uwsgi/pytrace1

0

কোডটি যে পর্যায়ে চলেছে সেখানে আপনি সুন্দর বিন্যাসিত মুদ্রিত স্ট্যাক ট্রেস দেখতে এই ছোট স্নিপেটটি sertোকাতে পারেন। এটি ধরে নেওয়া হয় যে logsআপনার প্রকল্পের মূল ডিরেক্টরিতে আপনার কাছে একটি ফোল্ডার বলা হয়েছে।

# DEBUG: START DEBUG -->
import traceback

with open('logs/stack-trace.log', 'w') as file:
    traceback.print_stack(file=file)
# DEBUG: END DEBUG --!
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.