PDB, Python ile birlikte gelen bir pakettir.Python programları için etkileşimli bir kaynak kodu hata ayıklama işlevi sağlar.Ana özellikler arasında kesme noktaları ayarlama, tek adımlı hata ayıklama, işlev hata ayıklama, mevcut kodu görüntüleme, yığın parçalarını görüntüleme ve değişkenleri dinamik olarak değiştirme yer alır. Değer vb.
Hata ayıklama aracını başlatın
PDB'yi kullanmanın ilk adımı, uygun olduğunda yorumlayıcıyı hata ayıklama aracına almaktır. Birçok farklı yöntem kullanılabilir
Bu hedefe ulaşmak için, başlangıç koşullarına ve hata ayıklanacak içeriğe bağlıdır.
Komut satırından yürütün:
PDB'nin en doğrudan yolu komut satırı üzerinden çalıştırmaktır, komut formatı aşağıdaki gibidir:
python3 -m pdb py dosyasıBurada küçük bir örneğimiz var, 1.py adında bir dosya var, kod aşağıdaki gibi:
def foo (num): print (f "Geçerli numara: {num}") __name__ == '__ main__' ise: foo (3)Ardından komut satırında geçerli konumu bulun.
PDB'yi komut satırından çalıştırın
Genellikle PDB, bir dosya adı yazdırırken çıktıdaki her modülün tam yolunu içerir ve ardından bir sonraki satırda çalıştırılacak kodu görüntüler. Bu durumda, bir sonraki foo fonksiyonu çalıştırılacaktır.
Yorumlayıcıda çalıştırın:
Hata ayıklama aracını etkileşimli bir ortamda çalıştırırsanız, run () veya runeval () kullanabilirsiniz.
Programda çalıştırın:
Yukarıdaki durum yalnızca hata ayıklama aracını başlangıçta başlatmak için uygundur.Uzun süreli ve hata ayıklamadan önce bir süre çalıştırılması gerekiyorsa, çalıştırılması gereken koddan önce set_trace () yöntemini eklemek daha uygundur.
set_trace () aşağıdaki örnekte olduğu gibi herhangi bir konumda çağrılabilir.
pdb'yi içe aktar def foo (num): print (f "Geçerli numara: {num}") aralıktaki i için (num): pdb.set_trace () print (f "Geçerli döngünün numarası: {i}") __name__ == '__ main__' ise: foo (10)Yukarıdaki kod, for döngüsünde bir kesme noktasına isabet eder, programımızın for döngüsü konumunda durduğunu ve ardından bir sonraki satırda yürütülecek içeriği görüntülediğini görebilirsiniz.
print (f "Geçerli döngünün numarası: {i}") Hangi numaraya döneceğinizi nasıl anlarsınız?Cevap: i değişkenini doğrudan girerek mevcut değeri görebilirsiniz.
Mevcut kodun nerede çalıştığını nasıl anlarsınız?
Cevap: Burada (w olarak kısaltılmıştır) komutuyla, hangi satırın çalıştırıldığını ve programın çağrı yığınının yerini bulabilirsiniz.
Yakındaki kurs kodunun yakınındaki kod bilgileri nasıl görüntülenir?
Cevap: Listede (l kısaltması), çevreleyen kodun varsayılan olarak 5 satır yukarıda ve 5 satır aşağıda olduğunu görebilirsiniz. Ek olarak, longlist komutu (ll olarak kısaltılır) mevcut fonksiyonun kaynak kodunu verebilir. Tüm sınıfın kaynak kodunu görmeniz gerekiyorsa, kaynak kodunu kaynak + sınıf adı üzerinden alabilirsiniz.
Ortak komutlar
Adım yürütme:
step (s olarak kısaltılır): Fonksiyon tek bir adımda çalıştırılır. Bir fonksiyonla karşılaşırsa, hata ayıklamaya devam etmek için fonksiyona girer.Fonksiyon gövdesine girip sadece adım adım çalıştırmanız gerekmiyorsa, bir sonraki gereklidir.
Sonraki (kısaca n): Komutun tek adımlı yürütülmesi işlev gövdesine girmeyecektir, ancak 10 kez bir for döngüsü ile karşılaştıysanız, 10000 kez ise, bu sefer aşağıdaki komut kullanılacaktır.
kadar: Komut türü bir sonraki aşamadır, ancak aynı işlevdeki geçerli değerden daha büyük bir satır numarasına sahip bir satıra ulaşana kadar çalışmaya devam eder, bu da döngünün sonundan atlayana kadar kullanabileceğiniz anlamına gelir. Tabii ki, siz de belirtilen pozisyona transfer etmek için mevcut satır numarasından daha büyük bir değer belirleyene kadar.
bir örnek:
pdb'yi içe aktar sınıf Myobj (): def foo (self, num): print (f "Geçerli numara: {num}") pdb.set_trace () aralıktaki i için (num): print (f "Geçerli döngünün numarası: {i}") baskı ("üzerinde") __name__ == '__ main__' ise: m = Myobj () m.foo (4)Tüm döngüden geçene kadar yürütülmesini ve ardından bir sonraki satıra geçildiğini görebilirsiniz.
- > baskı ("üzerinde") return: return ayrıca bir kod parçasını atlamak için bir kısayol olabilir, ancak çalışmaya devam edecektir. İşlev bir return ifadesini yürütmeye hazır olana kadar, işlev dönmeden önce dönüş değerinin görülebilmesi için duracaktır.Pratik kullanımı olmayan bir örnek, ancak bu etkiyi iyi gösterebilir.
pdb'yi içe aktar lst = sınıf Myobj (): def foo (self, num): print (f "Geçerli numara: {num}") pdb.set_trace () aralıktaki i için (num): print (f "Geçerli döngünün numarası: {i}") lst.append (i) dönüş lst __name__ == '__ main__' ise: m = Myobj () m.foo (4)Kesme noktası ile ilgili:
Break (b olarak kısaltılır): Elbette, kod büyüdükçe, return kullanmak zaman alsa bile ve bir sonrakine kadar, belirli bir konumda bir kesme noktası ayarlamayı düşünmelisiniz.Dosyanın belirli bir satırında bir kesme noktası ayarlamak istiyorsanız , Break lineno'yu kullanabilir ve ardından sonraki kesme noktasına geçmek için aşağıdaki devam et (kısaltılmış c) komutunu kullanabilirsiniz.
Ayrıca bir işlevde bir kesme noktası ayarlamayı da belirleyebiliriz, örneğin: break Myobj (). Foo.
Ek olarak, sys.path üzerindeki bir dosyanın göreli yoluna da eşdeğer olabilecek kesme noktaları ayarlamak için başka dosyalar da çalıştırabilirsiniz. Yalnızca break komutunu çalıştırırsanız, hangi dosya satır numarası ve diğer bilgiler dahil olmak üzere kesme noktalarının nerede olduğunu görebilirsiniz.
devre dışı bırak: Yukarıdaki kesmeden sonra görüntülenen kesme noktasını belirtebilirsiniz Yürütmeden sonra, Enb sütunundaki evet'in yanlış olarak değiştiğini görebilirsiniz. Şu anda l girin ve kırılma noktasının B ile işaretlendiğini görebilirsiniz.
Tamamen silmek istiyorsanız, temizleme komutunu uygulamanız gerekir.
Kesme noktası efekti görüntüleme diyagramı ekleme ve silme
temizle: bir kesme noktasını tamamen silin, açık kimlik numarası kullanın, devre dışı bırakın.
tbreak: Program geçici kesme noktasına ilk kez ulaştığında otomatik olarak silinecek olan geçici kesme noktası. Manuel olarak silmenize gerek yok.
Koşullu kesme noktası:
Bazı kurallar, yalnızca koşullar karşılandığında çalıştırılmaları için kesme noktalarına uygulanabilir. Kesme noktalarının manuel olarak etkinleştirilmesi ve devre dışı bırakılmasıyla karşılaştırıldığında, koşullu kesme noktalarının kullanılması, hata ayıklayıcının programı duraklatma şeklini daha iyi kontrol edebilir.
Koşullu kesme noktaları iki şekilde ayarlanabilir. İlk yöntem, kesme noktası ayarlamak için break kullanılırken koşulları belirlemektir. Kullanım yöntemi, kod satırı numarası artı ifadedir. Bir uygulama örneğine bakın.
pdb'yi içe aktar lst = sınıf Myobj (): pdb.set_trace () def foo (self, num): print (f "Geçerli numara: {num}") __name__ == '__ main__' ise: m = Myobj ()Aşağıdaki şekildeki komutların anlamını analiz edin:
1. son 10, sayı > 5, 10. satırdaki kesme noktasına başvurur ve koşul num > 5'te, daha sonra break çıktısını alarak belirli kesme noktası bilgilerini görebilirsiniz ve kesme noktası koşullarımızı görebileceğimiz açıktır.
sadece num ise dur > 52. İfadenin hesaplama sonucu doğruysa, yürütme kesme noktasında duracaktır.
Ek olarak, koşulları mevcut kesme noktalarına uygulamak için koşullu komutları da kullanabilirsiniz. Parametreler, kesme noktası kimliği ve ifadesidir.
Yine de yukarıdaki kod renderlara bakmamıza izin veriyor.
Kesme noktalarını yoksay
Döngü sırasında ilk birkaç sonucu göz ardı etmek istiyorsanız, örneğin buradaki ilk üç sonucu yok saymak istiyorsanız, göz ardı edebilirsiniz.
Kullanım yöntemi:
Kesme noktası kimliğini yoksay, zamanları yoksay. Çalıştırmadan önce görmezden gelmek istemiyorsanız, aşağıdaki komutu kullanabilirsiniz, zaten devam et'i çalıştırdıysanız hiçbir etkisi olmayacaktır. kesme noktası kimliğini yoksay 0İzleme değişkenleri:
display: Bazen bir değişkendeki değişiklikleri gerçek zamanlı olarak gözlemlememiz gerekir. Dispaly şu anda en iyi yardımcıdır. Kaldırmak istiyorsanız, undisplay kullanabilirsiniz.
görüntü monitör değişkeni
İş akışını değiştirin:
Jump: jump komutu, kodu değiştirmeden çalışma zamanında programın akışını değiştirir. Bazı kodların çalıştırılmasını önlemek için ileri atlayabilir veya tekrar çalıştırmak için geri atlayabilir.
pdb'yi içe aktar def f (n): pdb.set_trace () sonuç = j = 0 aralıktaki i için (n): j = i * n + j j + = n sonuç.append (j) dönüş sonucu __name__ == '__ main__' ise: baskı (f (5))İleri atla:
İleri atla, yürütme sırasında herhangi bir ifade olmaksızın yürütme noktasını geçerli konumdan sonra hareket ettirir.
Geriye atla:
Jump ayrıca program yürütmesini, onu tekrar çalıştırmak için zaten yürütülmüş bir ifadeye taşıyabilir.
Atlama yöntemine izin verilmiyor
1. Belirli akış kontrol ifadelerine girip çıkın ve ne zaman girileceğini belirlemek imkansızdır.
2. Jump işlevi girmek için kullanılabilir, ancak parametreler olmadan kod çalışmayacaktır.
3. Atlama, for döngüsünün ortasına girmeyecektir veya try: hariç ifadesi.
4. Nihayet bloğundaki kodun tümü yürütülmelidir, böylece atlama bloktan çıkmayacaktır.
5. En temel kısıtlama, atlamanın çağrı yığınının alt çerçevesi ile sınırlı olmasıdır. Yığını değişkenleri kontrol etmek için yukarı taşıdıktan sonra, yürütme akışı şu anda değiştirilemez.
Diğer komutlar
https://docs.python.org/3.7/library/pdb.html
Yazar hakkında: Kıdemli bir tarayıcı mühendisi olan Chen Xiangan, C # dilinden Python diline, çeşitli tarayıcı teknolojilerinde iyi, büyük ölçekli tarayıcı geliştirmeye aşina, Python'u seven ve okumayı seven tarayıcı işlerinde uzun yıllara dayanan deneyime sahiptir. Herkese gelip benimle öğrenmeye hoş geldiniz.
Bu makale yazar tarafından sunulmuştur ve telif hakkı yazara aittir.