Bir çok kanallı Python işlemi bir hata ayıklayıcı eklemek için bir yol var mı?

oy
26

Ben kilitli sonra bir çok kanallı Python uygulaması bir kilitlenme hata ayıklamak çalışıyorum. sürecin durumunu incelemek için bir hata ayıklayıcı eklemek için bir yolu var mı?

Düzenleme: Linux üzerinde bu çalışılıyor, ama bir çapraz platform çözümü olsaydı çok iyi olurdu. Her şeye rağmen Python var :)

Oluştur 06/09/2008 saat 17:14
kaynak kullanıcı
Diğer dillerde...                            


9 cevaplar

oy
0

Ne platformu üzerinde bu çalışıyorsunuz? Çoğu debugger'lar numaralı süreci kullanarak bir çalışan sürecine eklemesine olanak tanır. Sen günlük veya Görev Yöneticisi gibi bir şey kullanarak yoluyla ya çıkış süreci id can. bu bir kez ulaşıldığında, tek tek iplikler ve bunların çağrı yığınları kontrol etmek mümkün olacaktır.

DÜZENLEME: Ben ancak bunu buldum, çapraz platform GNU Debugger (GDB), ile herhangi bir deneyimi yok linki ve doğru yolda başlayabilir. Bu ve nasıl talimat gdb çalışan bir piton işlem eklemek (yığın izlerini okumak için kullanışlı) hata ayıklama simgeleri eklemek açıklar.

Cevap 06/09/2008 saat 18:08
kaynak kullanıcı

oy
10

Evet, gdb alt düzey hata ayıklama için iyidir.

Sen ile konuları değiştirebilir iplik komutu.

Örneğin

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

Ayrıca böyle Python belirli debugger'lar kontrol edebilir Winpdb veya pydb . Bağımsız Hem platformu.

Cevap 11/09/2008 saat 12:19
kaynak kullanıcı

oy
3

Eğer pydb demek, bunu yapmak için hiçbir yolu yoktur. : Orada bu yönde bazı çabalar oldu svn taahhüt bkz ama terk edildi. Sözde winpdb destekliyorsa .

Cevap 12/09/2008 saat 13:51
kaynak kullanıcı

oy
3

(Windows XP üzerinde Eclipse) Pydev çoklu iş parçacıklı programlar ayıklama Benim deneyim ipler thread.start_new_thread bağımlısı edilemedi, ancak threading.Thread bağımlısı olabilir kullanılarak oluşturulan ipliğe kullanılarak oluşturulan vardır. bilgi yararlı olduğunu umuyoruz.

Cevap 10/11/2008 saat 11:58
kaynak kullanıcı

oy
6

Bir çok kanallı Python işlemi bir hata ayıklayıcı eklemek, ancak C düzeyinde yapmak gerekir. Neler mantıklı için, sembollerle derlenmiş olması Python yorumlayıcısı gerekir. Eğer bir tane yoksa, sen Python.org gelen kaynak indirip kendiniz oluşturmak gerekir:

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

işyükünüzü yorumlayıcısı ilgili sürümünde çalıştığından emin olun. Daha sonra herhangi bir zamanda GDB ile buna ekleyebilirsiniz. Python millet bazı yararlı makrolar vardır onların Çeşitli dizininde bir örnek ".gdbinit" dahil ettik. Ancak çok kanallı hata ayıklama için kırık (!). Böyle satırları değiştirmeniz gerekiyor

while $pc < Py_Main || $pc > Py_GetArgcArgv

Takip ederek:

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

Aksi gibi komutları pystackana iş parçacığı dışında başka iş parçacığı üzerinde sonlandırılacak. Yerine bu malzeme ile, gibi şeyler yapabilirsiniz

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

ve neler olduğunu görüyoruz. Biraz.

Sen nesneleri "pyo" makro ile ne ayrıştırabilir. Chris bazı örnekler vardır onun blog.

İyi şanslar.

(Için Shoutout Dan blogunda benim için bazı temel bilgilere, özellikle diş düzeltme için!)

Cevap 15/02/2009 saat 11:18
kaynak kullanıcı

oy
13

Kullan Winpdb . Bu bir platform bağımsız uzak bir ağ üzerinden hata ayıklama, birden fazla parçacığı, ad modifikasyonu, gömülü ayıklama, şifreli iletişim için destek ile grafik GPL Python ayıklama ve pdb daha hızlı 20 kata kadar.

Özellikler:

  • GPL lisansı. Winpdb ücretsiz bir yazılımdır.
  • 2.6 ile 3000 Python aracılığıyla CPython 2.3 ile uyumlu
  • 2.8 ile wxPython 2.6 ile uyumlu
  • Platform bağımsız ve Ubuntu Gutsy ve Windows XP üzerinde test etti.
  • Kullanıcı Arayüzü: winpdb wxPython gerektirir 2.6 veya sonrası ise rpdb2, konsol tabanlı.

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

Cevap 16/02/2009 saat 14:18
kaynak kullanıcı

oy
0

pdbinject Eğer zaten çalışan piton sürecine Pdb enjekte sağlar.

pdbinject yürütülebilir sadece python2 altında çalışır, ancak sadece iyi de python3 içine enjekte edebilir.

Cevap 17/03/2015 saat 05:18
kaynak kullanıcı

oy
0

Pycharm IDE sürüm 4.0 beri çalışan bir Python sürecine takılarak sağlar.

İşte bunun nasıl tarif edilir.

Cevap 30/03/2015 saat 18:02
kaynak kullanıcı

oy
0

Bu ölü basit "uzak" ayıklayıcıyla kullanılabilir:

import sys
import socket
import pdb

def remote_trace():
    server = socket.socket()
    server.bind(('0.0.0.0', 12345))
    server.listen()
    client, _= server.accept()
    stream = client.makefile('rw')
    sys.stdin = sys.stdout = sys.stderr = stream
    pdb.set_trace()

remote_trace()

# Execute in the shell: `telnet 127.0.0.1 12345`

Windows'ta yerine Telnet Netcat (ki aynı zamanda linux üzerinde çalışacak) kullanmak daha kolaydır.

Cevap 24/11/2019 saat 23:25
kaynak kullanıcı

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