Có phần mở rộng python không có giấy tờ cho gdb.
Từ nguồn lấy Python Tools/gdb/libpython.py
(không được bao gồm trong cài đặt bình thường).
Đặt này trong sys.path
Sau đó:
# 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):
Như bạn có thể thấy bây giờ chúng ta có tầm nhìn vào Python chồng tương ứng với chuỗi gọi CPython.
Một số hãy cẩn thận:
- Phiên bản của bạn gdb cần lớn hơn 7 và nó cần phải được biên soạn với
--with-python
gdb
nhúng python (bằng cách liên kết để libpython
), nó không chạy nó trong một subshell. Điều này có nghĩa rằng nó có thể không nhất thiết phải phù hợp với phiên bản của python đó là trên $PATH
.
- Bạn cần tải xuống
libpython.py
từ bất kỳ phiên bản nào của nguồn Python khớp với bất kỳ nội dung nào gdb
được liên kết.
- Bạn có thể phải chạy gdb dưới dạng gốc - nếu bạn có thể cần phải thiết lập
sys.path
để khớp với mã bạn đang gỡ lỗi.
Nếu bạn không thể sao chép libpython.py
vào sys.path
sau đó bạn có thể thêm vị trí của nó để sys.path
như thế này:
(gdb) python
>import sys
>sys.path.append('/path/to/containing/dir/')
>import libpython
>
>end
này hơi kém tài liệu trong python dev docs, the fedora wiki và the python wiki
Nếu bạn có cũ hơn gdb
hoặc không thể làm việc này cũng có một số gdbinit trong nguồn Python mà bạn có thể sao chép sang ~/.gdbinit
w hich thêm một số chức năng tương tự
Tính năng này có hoạt động với các tiện ích mở rộng C không? –
@MadPhysicist: Nó sẽ không in số dòng mã C của bạn, nếu đó là ý của bạn. :-) Nó sẽ in số dòng của mã Python gọi vào mã C của bạn. – RichieHindle
Đó là những gì tôi muốn nói. Tôi tìm thấy câu hỏi ban đầu thú vị vì tôi đã có cùng một vấn đề. Segfault hóa ra là vì mã C của tôi đã chèn một phần tử NULL vào một PyList_Object. Nó biểu hiện chính nó ở phía Python khi tôi cố gắng lặp qua danh sách. Bạn không chắc chắn một trình gỡ lỗi python có thể đã giúp nhiều trong trường hợp đó. –