2013-02-14 13 views
13

Chciałbym użyć obsługi gdb 7 do debugowania "gorszych procesów" Pythona.Co jest potrzebne do korzystania z obsługi gdb 7 w celu debugowania programów w języku Python?

Co jest potrzebne, aby to zrobić?

Na przykład:

  • Co robi skrypt flagi skonfigurować gorszy Pythona trzeba mieć prowadzony z?

  • Czy gorszy proces w Pythonie musi być w Pythonie w wersji 2.7 lub nowszej (widzę, że właśnie wtedy została zatwierdzona część wsparcia dla gdb w drzewie źródłowym w języku Python)? Czy Python 2.7 jest potrzebny tylko w samym procesie gdb?

  • Jakie pliki należy zainstalować, które mogą nie być spakowane przez wszystkie dystrybucje? Na przykład na packages.ubuntu.com nie dostaję żadnych haseł dla python-gdb.py, które moim zdaniem są potrzebne.

Byłoby bardzo przydatny wiedzieć, co jest potrzebne w poszczególnych dystrybucjach. Jestem szczególnie zainteresowany tym, co jest potrzebne dla Ubuntu i Centos.

+2

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

+0

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. –

Odpowiedz

19

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) 
0

Dla Centosu 6, po prostu trzeba zrobić:

yum install gdb python-debuginfo 
debuginfo-install python 

Następnie można debugować biegu pytona procesy, po prostu dołączając do nich za pomocą gdb:

gdb python [process id] 

Po połączeniu wystarczy wpisać:

py-bt