जीडीबी के लिए कुछ हद तक अनियंत्रित पायथन एक्सटेंशन हैं।
पायथन स्रोत से Tools/gdb/libpython.py
(इसे सामान्य इंस्टॉल में शामिल नहीं किया गया है) से।
sys.path
तो में इस रखो:
# gdb /gps/python2.7_x64/bin/python coredump
...
Core was generated by `/usr/bin/python script.py'.
Program terminated with signal 11, Segmentation fault.
#0 call_function (oparg=<optimized out>, pp_stack=0x7f9084d15dc0) at Python/ceval.c:4037
...
(gdb) python
>import libpython
>
>end
(gdb) bt
#0 call_function (oparg=<optimized out>, pp_stack=0x7f9084d15dc0) at Python/ceval.c:4037
#1 PyEval_EvalFrameEx ([email protected]=
Frame 0x7f9084d20ad0,
for file /usr/lib/python2.7/site-packages/librabbitmq/__init__.py, line 220,
in drain_events (self=<Connection(channels={1: <Channel(channel_id=1, connection=<...>, is_open=True, connect_timeout=4, _default_channel=<....(truncated), [email protected]=0) at Python/ceval.c:2681
...
(gdb) py-list
218 else:
219 timeout = float(timeout)
>220 self._basic_recv(timeout)
221
222 def channel(self, channel_id=None):
आप देख सकते हैं अब हम अजगर ढेर CPython कॉल चेन के साथ इसी होते हैं।
कुछ चेतावनियां:
- gdb का संस्करण 7 से अधिक होने की जरूरत है और यह (
libpython
से लिंक करके) --with-python
gdb
साथ संकलित किया गया है की जरूरत है अजगर को एम्बेड करता है, यह नहीं चलता है यह एक सबहेल में। इसका अर्थ यह है कि यह आवश्यक रूप से पाइथन के संस्करण से मेल नहीं खा सकता है जो $PATH
पर है।
- आपको
libpython.py
को पाइथन स्रोत के किसी भी संस्करण से डाउनलोड करने की आवश्यकता है जो gdb
से मेल खाता है।
- आपको gdb को रूट के रूप में चलाने की आवश्यकता हो सकती है - यदि ऐसा है तो आपको डिबगिंग कोड के मिलान के लिए
sys.path
सेट अप करने की आवश्यकता हो सकती है।
आप sys.path
में libpython.py
कॉपी नहीं कर सकते हैं तो आप इस तरह यह स्थान है जोड़ सकते हैं sys.path
रहे हैं:
(gdb) python
>import sys
>sys.path.append('/path/to/containing/dir/')
>import libpython
>
>end
यह कुछ हद तक खराब python dev docs, the fedora wiki और the python wiki
में प्रलेखित है यदि आपके पास एक पुराना gdb
या सिर्फ यह काम नहीं कर सकता है पाइथन स्रोत में gdbinit भी है जिसे आप ~/.gdbinit
w पर कॉपी कर सकते हैं इसमें कुछ समान कार्यक्षमता
क्या यह सी एक्सटेंशन के साथ काम करता है? –
@MadPhysicist: यदि आपका मतलब यह है कि यह आपके सी कोड की लाइन संख्या प्रिंट नहीं करेगा। :-) यह पाइथन कोड की लाइन संख्या मुद्रित करेगा जो आपके सी कोड में कॉल करता है। – RichieHindle
यही मेरा मतलब था। मैंने मूल प्रश्न दिलचस्प पाया क्योंकि मुझे एक ही समस्या थी। Segfault इसलिए हो गया क्योंकि मेरा सी कोड एक पूर्ण तत्व को एक PyList_Object में डालने वाला था। जब मैंने सूची में पुनरावृत्ति करने की कोशिश की तो यह खुद पाइथन पक्ष पर प्रकट हुआ। सुनिश्चित नहीं है कि एक पायथन डीबगर उस मामले में बहुत मदद करेगा। –