Hvad der er behov for at bruge gdb 7 s støtte til debugging Python-programmer?

Jeg vil gerne bruge gdb 7 s støtte til debugging Python “ringere processer”.

Hvad har jeg brug for at være i stand til at gøre det?

For eksempel:

  • Hvad flagene betyder ringere Python ‘ s konfigurere script nødt til at have kørt med?
  • Gør den ringere Python-processen er nødt til at være Python 2.7 eller nyere (jeg kan se det er da en del af gdb støtte til dette, der i Python kildekode-træet blev begået)? Eller er Python 2.7 kun brug af gdb-processen i sig selv?
  • Hvilke filer der er nødt til at have installeret, som ikke kunne være pakket af alle distributioner? For eksempel, på packages.ubuntu.com jeg må ikke få nogen hits for python-gdb.py, som jeg mener, er nødvendige.

Det ville være meget praktisk at vide, hvad der er brug for på bestemte fordelinger. Jeg er især interesseret i, hvad der er nødvendigt for Ubuntu og Centos.

Er du sikker på du fortolkningen af denne funktion korrekt? GDB 7 tilføjet støtte til at udvide GDB sig selv i python, men jeg er ikke bevidst om at være i stand til at bruge det til at foretage fejlfinding af et python program (uden for debugging tolken selv, der er). Det er, hvad fbf er for, tænkte jeg.
Ja, temmelig sikker på. Strengt, mit spørgsmål er om Python-funktion, som bruger har i gdb for at give træk til debugging Python-programmer (eller Python selv): wiki.python.org/moin/DebuggingWithGdb — fx der er py-up og py-ned-kommandoer til at flytte gennem Python-stakken, en py-bt kommando til udskrivning af Python stak, og en py-kommandoen print for at udskrive den værdi, der er bundet til en Python-navn. Synes især nyttigt for de problemer, der krydser over den C / Python grænse, men jeg er interesseret i at prøve det også til af fejlfinde en ren Python problemer, der opstår i produktionen, ved hjælp af javaprogrammer.

OriginalForfatteren Croad Langshan | 2013-02-14

2 svar

  1. 21

    Python synes at have været oversat med --with-pydebug (på Ubuntu 12.04, pakke python-dbg indeholder en egnet Python eksekverbare, selv python-dbg). Den ringere Python behøver ikke at være Python 2.7 — 2.6 indlæser 2.7 gdb extensions succes (se debugging session nedenfor). Mindst på Ubuntu 12.04, den fil, der bliver installeret, der definerer gdb udvidelser kaldes libpython.py, ikke python-gdb.py (for nogle grund, bygning Python giver en bygge-folder, der indeholder både de filer, — de er identiske).

    Men jeg tror ikke, det er i øjeblikket muligt at fejlsøge hjælp produktion core-filer: det ligner gdb-udvidelser til Python ringere processer forsøger at få fat i variabler at få optimeret væk i en produktion binære (for eksempel, f variabel i PyEval_EvalFrameEx). Det synes Linux /gdb, og Python har endnu til at nå det niveau, af awesomeness, der er opnået for JavaScript på Illumos som Bryan Cantrill rapporter her er i stand til at fejlrette produktion core dumps på denne måde:

    http://www.infoq.com/presentations/Debugging-Production-Systems

    Her er en debug session på Ubuntu 12.04, som viser gdb kører en Python 2.6 ringere proces at fejlsøge en segmenteringsfejl, ved hjælp af Python 2.7 gdb ‘ s udvidelser. Den første kode til at fremkalde 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()

    og debugging session:

    ~/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) 

    OriginalForfatteren Croad Langshan

  2. 0

    For Centos 6, er du simpelthen nødt til at gøre:

    yum install gdb python-debuginfo
    debuginfo-install python

    Du kan derefter debug at køre python-processer ved blot at knytte til dem med gdb:

    gdb python [process id]

    Når du er tilsluttet, skal du blot skrive:

    py-bt

    OriginalForfatteren CpnCrunch

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *