Üç adımda Hata Ayıklama yapısını öğrenin ve verimliliği büyük ölçüde artırın!

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 > 5

2. İ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

  • yukarı (kısaca u): yığındaki daha eski bir çerçeveye gidebilirsiniz
  • aşağı (d olarak kısaltılır): Yığın içinde daha yeni bir çerçeveye gidebilirsiniz. Yığın içinde her yukarı veya aşağı hareket ettiğinizde, hata ayıklama aracı geçerli konumu, nerede tarafından oluşturulanla aynı biçimde yazdıracaktır.
  • args (a olarak kısaltılır): Mevcut fonksiyonun tüm parametrelerinin değerlerini yazdırabilirsiniz.
  • p ve pp: bu ikisi python'un yazdırma ve pprint işlevlerine benzer. Çıktı bilgisi için, pp bir güzelleştirme işlevine sahiptir.
  • !: Bir ifadenin önüne bir tane ekleyin! , Python programının o anda çalışan değerini değiştirebilirsiniz.Örneğin, yukarıdaki örnekte num 10'a eşittir.! Num = 3'ü çalıştırır ve daha sonra num çıktısını alırsanız, num'un şu anda 3 olduğunu göreceksiniz. Bu, test süremizi azaltabilir Döngü sayısı. Elbette döngü sayısının değiştirilip değiştirilemeyeceği programın mantığına bağlıdır.
  • Referans

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.

Yeni Oksijen Güncelleme Prospektüsü: Arka arkaya 9 çeyrekte yüksek büyüme sağlayan ilk karlı tıbbi güzellik platformu
önceki
Azınlığın gelecek varsayımları | Yakıt araçlarına veda edin? Arabanız sizi daha iyi anlamak istiyor
Sonraki
Çizgi Roman: Resmin en kısa yolu nasıl bulunur? | Teknik Başlıklar
50 yaşındaki Yang Lan, kısa süre önce kocasının "şişman ve büyük kulaklarını" fotoğrafladı ve 18 yaşındaki kızının güzel görünüşü miras kalmadı.
Programcının gözyaşlarını izledikten sonra "Heaven Slaying the Dragon" versiyonu!
Oylama | Tıbbi bakımın ani ölümü 300.000 yuan tazmin edilebilir mi? Çin'deki tıp endüstrisindeki ilk karşılıklı sigortayı alacak mısınız?
Du Haitao ve Shen Mengchen'in 6 yıllık uzun mesafe koşusu: Hong Kong tarzı masallar bozuldu ve "Tao" tarzı vaatler yükseliyor
Seni yeniden inşa etmek için ne yapabilirim, Notre Dame de Paris?
6 gün bekleyin! Dongguan'daki WeChat üzerinden hane kaydı için randevu alabilirsiniz (süreç eklenmiş olarak)
Eski DJI çalışanları kaynak kodu sızdırdığı için hapse girdi; Alibaba Pratt & Whitney yazı tipi yayınlandı | Geek Manşetleri
19 self servis kütüphane toplu olarak çevrimiçi! Bu yıl Zhongshan Okuma Ayı için başka hangi aktiviteler var?
Sert siyah teknolojisi size Marvel'ın on yılda kaç karaktere sahip olduğunu söylüyor?
Çiftçilerin yemeği ne kadar karmaşık?
Little Blue Wave Bay, büyük futbol hayali! Zhongshan'daki binlerce ilkokul öğrencisi Dünya Günü'nde becerilerini gösteriyor | Video
To Top