Python wydaje się konieczne, aby zostały skompilowane z --with-pydebug
(na Ubuntu 12.04, pakiet python-dbg
zawiera odpowiedni plik wykonywalny Pythona, sama nazywa python-dbg
). Gorszy Python nie musi być Pythonem 2.7 - 2.6 ładuje rozszerzenia 2.7 gdb (zobacz poniżej sesję debugowania). Przynajmniej w systemie Ubuntu 12.04 instalowany plik definiujący rozszerzenia gdb nosi nazwę libpython.py
, a nie python-gdb.py
(z jakiegoś powodu, budowanie Pythona daje katalog kompilacji zawierający oba te pliki - są one identyczne).
Uważam jednak, że obecnie nie można debugować przy użyciu plików rdzenia produkcyjnego: wygląda na to, że rozszerzenia gdb dla gorszych procesów Pythona próbują uzyskać zmienne, które zostaną zoptymalizowane w binarnym pliku produkcyjnym (na przykład zmienna f w PyEval_EvalFrameEx
). Wydaje Linux/gdb, a Python posiada jeszcze osiągnąć poziom grozy osiągnąć JavaScript na illumos który podlega tutaj Bryan Cantrill jest w stanie rdzenia produkcji debug wysypisk w ten sposób:
http://www.infoq.com/presentations/Debugging-Production-Systems
Oto sesja debugowania w systemie Ubuntu 12.04, w którym gdb działa w gorszym procesie Python 2.6, aby debugować segfault, używając rozszerzeń gdb w Pythonie 2.7. Pierwszy kod aby spowodować segfault:
~/Downloads/Python-2.6.4$ cat ~/bin/dumpcore.py
class Foo:
def bar(self):
from ctypes import string_at
string_at(0xDEADBEEF) # this code will cause Python to segfault
def main():
f = Foo()
f.someattr = 42
f.someotherattr = {'one':1, 'two':2L, 'three':[(), (None,), (None, None)]}
f.bar()
if __name__ == "__main__":
main()
i sesję debugowania:
~/Downloads/Python-2.6.4$ gdb --args ./python ~/bin/dumpcore.py
GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1) 7.4-2012.04
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://bugs.launchpad.net/gdb-linaro/>...
Reading symbols from /home/john/Downloads/Python-2.6.4/python...done.
(gdb) run
Starting program: /home/john/Downloads/Python-2.6.4/python /home/john/bin/dumpcore.py
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Program received signal SIGSEGV, Segmentation fault.
0x0000000000468d67 in PyString_FromString (str=0xdeadbeef <Address 0xdeadbeef out of bounds>) at Objects/stringobject.c:116
116 size = strlen(str);
(gdb) py-bt
Undefined command: "py-bt". Try "help".
(gdb) python
>import sys
>sys.path.insert(0, "/home/john/Downloads/Python-2.7/Tools/gdb")
>import libpython
>(gdb) py-bt
#10 Frame 0x8f0f90, for file /home/john/Downloads/Python-2.6.4/Lib/ctypes/__init__.py, line 496, in string_at (ptr=3735928559, size=-1)
return _string_at(ptr, size)
#14 Frame 0x8ebf90, for file /home/john/bin/dumpcore.py, line 5, in bar (self=<Foo(someattr=42, someotherattr={'three': [(), (None,), (None, None)], 'two': 2L, 'one': 1}) at remote 0x7ffff6e03240>, string_at=<function at remote 0x7ffff6e1c990>)
string_at(0xDEADBEEF) # this code will cause Python to segfault
#17 Frame 0x8ebd80, for file /home/john/bin/dumpcore.py, line 12, in main (f=<Foo(someattr=42, someotherattr={'three': [(), (None,), (None, None)], 'two': 2L, 'one': 1}) at remote 0x7ffff6e03240>)
f.bar()
#20 Frame 0x8eb680, for file /home/john/bin/dumpcore.py, line 16, in <module>()
main()
(gdb)
Czy jesteś pewien, że poprawnie interpretujesz tę funkcję?GDB 7 dodał obsługę rozszerzenia samego GDB w Pythonie, ale nie jestem świadomy możliwości użycia go do debugowania programu Pythona (poza debugowaniem samego interpretera). Po to jest pdb, pomyślałem. – FatalError
Tak, całkiem pewny. Ściśle, moje pytanie dotyczy funkcji Pythona, która * używa * funkcji w gdb, aby zapewnić funkcje do debugowania programów w języku Python (lub samego Pythona): http://wiki.python.org/moin/DebuggingWithGdb - np. istnieją komendy Py-up i Py-Down służące do poruszania się po stosie Pythona, polecenie py-bt służące do drukowania stosu Pythona i polecenie "py-print" służące do drukowania wartości związanych z nazwą Pythona. Wydaje się szczególnie przydatny w przypadku problemów przekraczających granicę C/Python, ale jestem zainteresowany wypróbowaniem go również w celu debugowania czystych problemów z językiem Python, które pojawiają się podczas produkcji przy użyciu zrzutów głównych. –