Er det en måte å feste en debugger til en multi-threaded Python prosessen?

stemmer
27

Jeg prøver å feilsøke en fastlåst i en multi-threaded Python-programmet etter at den har låst opp. Er det en måte å feste en debugger for å sjekke status på prosessen?

Edit: jeg forsøker dette på Linux, men det ville være flott om det var en kryssplattform-løsning. Det er Python tross alt :)

Publisert på 06/09/2008 klokken 18:14
kilden bruker
På andre språk...                            


8 svar

stemmer
14

Bruk Winpdb . Det er et plattformuavhengig grafisk GPL Python feilsøkingsprogram med støtte for ekstern feilsøking over et nettverk, flere tråder, navnerom modifikasjon, innebygd feilsøking, kryptert kommunikasjon og er opp til 20 ganger raskere enn pdb.

Egenskaper:

  • GPL lisensen. Winpdb er fri programvare.
  • Kompatibelt med CPython 2.3 gjennom 2,6 og Python 3000
  • Kompatibelt med wxPython 2.6 2.8 via
  • Plattformuavhengig, og testet på Ubuntu Gutsy og Windows XP.
  • Brukergrensesnitt: rpdb2 er konsollbasert, mens winpdb krever wxPython 2.6 eller nyere.

Skjermbilde http://winpdb.org/images/screenshot_winpdb_small.jpg

Svarte 16/02/2009 kl. 15:18
kilden bruker

stemmer
11

Ja, er gdb bra for lavere nivå debugging.

Du kan bytte tråd med tråden kommandoen.

f.eks

(gdb) thr 2
[Switching to thread 2 (process 6159 thread 0x3f1b)]
(gdb) backtrace
....

Du kan også sjekke ut Python spesifikke debuggere som Winpdb eller pydb . Både plattformuavhengig.

Svarte 11/09/2008 kl. 13:19
kilden bruker

stemmer
7

Du kan feste en debugger til en multi-threaded Python prosess, men du må gjøre det på C-nivå. Å forstå hva som skjer, trenger du Python tolk for å være kompilert med symboler. Hvis du ikke har en, må du laste ned kilde fra python.org og bygge det selv:

./configure --prefix=/usr/local/pydbg
make OPT=-g
sudo make install
sudo ln -s /usr/local/pydbg/bin/python /usr/local/bin/dbgpy

Pass på at arbeidsmengden din kjører på denne versjonen av tolk. Du kan deretter legge til det med GDB når som helst. Python folk har tatt en prøve ".gdbinit" i sin Diverse katalog, som har noen nyttige makroer. Men det er brutt for multi-threaded debugging (!). Du må bytte linjer som dette

while $pc < Py_Main || $pc > Py_GetArgcArgv

med følgende:

while ($pc < Py_Main || $pc > Py_GetArgcArgv) && ($pc < t_bootstrap || $pc > thread_PyThread_start_new_thread)

Ellers kommandoer som pystackikke vil opphøre på andre enn hovedtråden tråder. Med slike ting på plass, kan du gjøre ting som

gdb> attach <PID>
gdb> info threads
gdb> thread <N>
gdb> bt
gdb> pystack
gdb> detach

og se hva som skjer. På en måte.

Du kan analysere hva objektene er med "pyo" makro. Chris har noen eksempler på hans blogg.

Lykke til.

(Shoutout for Dan blogg for noen viktige opplysninger for meg, spesielt threading fix!)

Svarte 15/02/2009 kl. 12:18
kilden bruker

stemmer
4

Min erfaring debugging flertrådede programmer PyDev (Eclipse på Windows XP) er, tråder opprettet ved hjelp thread.start_new_thread kunne ikke bli hekta, men gjengene er opprettet ved hjelp threading.Thread kan bli hekta. Håper informasjonen er nyttig.

Svarte 10/11/2008 kl. 12:58
kilden bruker

stemmer
4

Hvis du mener pydb, er det ingen måte å gjøre det. Det var noen innsats i den retningen: se svn commit , men den ble forlatt. Tilsynelatende winpdb støtter det .

Svarte 12/09/2008 kl. 14:51
kilden bruker

stemmer
0

PyCharm IDE lar fester et kjører Python prosess siden versjon 4.0.

Her beskrives hvordan du gjør det.

Svarte 30/03/2015 kl. 19:02
kilden bruker

stemmer
0

pdbinject tillater deg å injisere PDB inn i en allerede kjører python prosessen.

Den pdbinject kjørbar fungerer bare under python2, men kan sprøyte inn python3 helt fint også.

Svarte 17/03/2015 kl. 07:18
kilden bruker

stemmer
0

Hvilken plattform du forsøker dette på? De fleste debuggere tillate deg å legge til en løpende prosess ved hjelp av prosessen id. Du kan enten sende ut prosessen id via logging eller bruke noe sånt som Task Manager. Når det er oppnådd vil det være mulig å inspisere individuelle tråder og deres samtale stabler.

EDIT: Jeg har ikke noen erfaring med GNU Debugger (GDB), som er cross platform, men jeg fant denne linken og det kan starte deg på rett vei. Den forklarer hvordan du legger feilsøkingssymboler (hendig for å lese stack spor), og hvordan å instruere gdb å feste til en kjørende python prosess.

Svarte 06/09/2008 kl. 19:08
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more