Есть несколько недокументированных расширений Python для GDB.
Из исходного кода Python захват 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 (f=f@entry=
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), throwflag=throwflag@entry=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):
Как вы можете видеть, теперь у нас есть видимость в стек Python, соответствующий цепочке вызовов CPython.
Некоторые предостережения:
- Ваша версия GDB должна быть больше 7, и она должна быть скомпилирована с
--with-python
gdb
встраивает python (путем ссылки на libpython
), он не запускает его в подоболочке. Это означает, что он не обязательно совпадает с версией python на $PATH
.
- Вам необходимо загрузить
libpython.py
из любой версии исходного кода Python, которая соответствует любой, с которой gdb
связана.
- Возможно, вам придется запустить gdb с правами root - если это так, вам может потребоваться настроить
sys.path
в соответствии с кодом, который вы отлаживаете.
Если вы не можете скопировать libpython.py
в sys.path
, вы можете добавить его местоположение к sys.path
следующим образом:
(gdb) python
>import sys
>sys.path.append('/path/to/containing/dir/')
>import libpython
>
>end
Это несколько плохо документировано в документации по Python для разработчиков , вики Fedora и вики Python
Если у вас более старый gdb
или вы просто не можете заставить его работать, в исходном коде Python также есть gdbinit , который вы можете скопировать в ~/.gdbinit
, который добавляет некоторые подобные функции