Rumah >pembangunan bahagian belakang >Tutorial Python >Ringkasan penggunaan alat penyahpepijat python pdb (Python Debugger)
Artikel ini membawakan anda pengetahuan yang berkaitan tentang Python Ia terutamanya memperkenalkan kandungan yang berkaitan tentang alat penyahpepijatan pdb, termasuk perintah pdb asas, menetapkan titik putus dengan rehat, dll. Mari kita lihat bersama-sama, saya harap. ia akan membantu semua orang.
[Cadangan berkaitan: Tutorial video Python3 ]
pdb: python debugger
1. Kaedah tidak mengganggu (Tidak perlu mengubah suai kod sumber, anda boleh nyahpepijat dengan menjalankannya terus dari baris arahan)
python3 -m pdb filename.py
2 Kaedah mengganggu (Anda perlu menambah kod berikut pada kod yang sedang dinyahpepijat dan kemudian jalankan kod seperti biasa) <.>
import pdb pdb.set_trace()Apabila anda melihat gesaan berikut pada baris arahan, ini bermakna pdb
(Pdb)2. perintah asas pdb
Dalam penggunaan sebenar, kami mendapati bahawa apabila menjalankan fail python dengan skrip shell, ia mungkin tidak boleh dinyahpepijat menggunakan pdb dan ia akan keluar. Pada masa ini, anda hanya boleh menjalankan fail py secara langsung untuk penyahpepijatan.
Sebagai contoh, dalam contoh berikut, jika anda ingin memasukkan kaedah ke hadapan() model untuk melihat proses pemprosesan data semasa perambatan ke hadapan, anda hanya boleh menetapkan rehat dalam baris pertama of forward() (line 26 Point, pdb.set_trace()
Tetapi kadangkala model ini sangat kompleks, dan menggunakan kaedah ini akan menyebabkan program melaporkan ralat dan keluar terus (saya tidak tahu sebabnya), maka kita boleh mempertimbangkan untuk menggunakan perintah break di sini Masukkan titik putus dalam satu baris supaya program akan berhenti apabila ia mencapai ke hadapan ().
import torchimport torch.nn as nnimport pdbclass EncoderLayer(nn.Module): def __init__(self): super().__init__() self.conv1 = nn.Conv2d(4, 10, (3, 3)) self.conv2 = nn.Conv2d(10, 4, (3, 3)) self.relu = nn.ReLU() def forward(self, x): x=self.relu(self.conv1(x)) return self.relu(self.conv2(x))class Encoder(nn.Module): def __init__(self,num_layers): super().__init__() # encoders 由 num_layers个 EncoderLayer子层组成,每个子层结构相同,但参数不一定相同。 self.ModelList = nn.ModuleList([EncoderLayer() for _ in range(num_layers)]) def forward(self, x): # ModuleList是一个list,只能通过list的操作方式(如用for循环、下标索引等)进行forward计算。 for layer in self.ModelList: x = layer(x) return xif __name__=="__main__": pdb.set_trace() input = torch.rand(5, 4, 30, 30) model = Encoder(num_layers=4) output = model(input)
Kaedah khusus: (1) Pertama set pdb.set_trace() pada mana-mana baris sebelumnya untuk menghentikan program. (2) Hanya masukkan rehat 26. Seperti yang ditunjukkan dalam gambar:
Dengan cara ini, titik putus berjaya ditetapkan dan program akan berhenti apabila ia mencapai ke hadapan().
Angka 26 di sini ialah nombor baris Perlu diingat bahawa kedudukan titik putus tidak boleh menjadi ulasan Sebagai contoh, jika kita menetapkan titik putus pada baris 25 (baris ulasan), ia akan gagal:
Untuk meringkaskan, arahan untuk menetapkan titik putus dalam fail yang sama ialah:
garis putus
Jika titik putus yang anda ingin tetapkan tiada dalam fail larian awal, bagaimana anda boleh menggunakan arahan putus untuk menetapkan titik putus dalam fail lain? Mari lihat contoh ini:
Bahagikan kod 3.1 kepada tiga fail py dan letakkannya dalam laluan yang sama:
![Ringkasan penggunaan alat penyahpepijat python pdb (Python Debugger)](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/4b5d476ba5b14b0ba541d78930b9704a~tplv-k3u1fbpfcp-zoom-1.image)
Lihat kandungan setiap fail:
run.py:
Tetapan pdb.set_trace() awal berada dalam run.py.
import torchfrom encoder import Encoderimport pdbif __name__=="__main__": pdb.set_trace() input = torch.rand(5, 4, 30, 30) model = Encoder(num_layers=4) output = model(input)
enkoder.py:
from encoder_layer import EncoderLayerimport torch.nn as nnclass Encoder(nn.Module): def __init__(self,num_layers): super().__init__() # encoders 由 num_layers个 EncoderLayer子层组成,每个子层结构相同,但参数不一定相同。 self.ModelList = nn.ModuleList([EncoderLayer() for _ in range(num_layers)]) def forward(self, x): # ModuleList是一个list,只能通过list的操作方式(如用for循环、下标索引等)进行forward计算。 for layer in self.ModelList: x = layer(x) return x
encoder_layer.py:
import torch.nn as nnclass EncoderLayer(nn.Module): def __init__(self): super().__init__() self.conv1 = nn.Conv2d(4, 10, (3, 3)) self.conv2 = nn.Conv2d(10, 4, (3, 3)) self.relu = nn.ReLU() def forward(self, x): x=self.relu(self.conv1(x)) return self.relu(self.conv2(x))
Sekarang kita jalankan run.py, dan kemudian tetapkan titik putus pada baris 12 encoder.py, iaitu
untuk lapisan dalam diri.ModelList:
Arahannya ialah:
break encoder.py:12
Iaitu, break nama fail: lineKita dapat melihat bahawa atur cara boleh masuk ke hadapan() daripada output = model(input ):Ini menjadikan penyahpepijatan sangat mudah.
Jika titik putus awal dan titik putus sasaran tidak berada dalam direktori yang sama, anda juga boleh menetapkan titik putus melalui nama fail di bawah laluan relatif, seperti:
(Pdb) break ../transformer/asr_model.py:91Breakpoint 1 at /local/wenet/examples/aishell/s0/wenet/transformer/asr_model.py:91(Pdb)
Seperti yang boleh didapati dalam rajah , pdb terdiri daripada tiga baris Baris pertama ialah laluan fail, baris kedua ialah baris kod yang sedang dilaksanakan, dan baris ketiga ialah baris arahan input.
Apabila terdapat pautan lembut, laluan yang dipaparkan oleh pdb ialah laluan yang ditunjukkan oleh pautan lembut, tetapi laluan kod sebenar ialah laluan yang menyalin kandungan pautan lembut ini adalah berbeza, jadi anda mesti memberi perhatian.
pdb kadangkala tidak boleh menggunakan pdb set_trace(. ) menambah titik putus pada kaedah ke hadapan() model Mesej ralat ialah:
Fungsi terkumpul tidak boleh mengambil nombor pembolehubah argumen atau menggunakan argumen kata kunci sahaja dengan lalai
mungkin bermaksud "fungsi yang disusun tidak dapat menerima bilangan parameter yang berubah-ubah, dan tidak boleh menggunakan parameter kata kunci sahaja secara lalai." tidak diselesaikan.
5. Pasca nyahpepijat selepas program ranap: pdb.pm()
. Malah, pdb juga boleh digunakan untuk penyahpepijatan bedah siasat, iaitu selepas program mengalami pepijat dan ranap, gunakan penyahpepijat python untuk melihatnya. Sebagai contoh, test.py jelas bermasalah:
Jalankan terus:# test.pydef add(n): return n+1add("hello")python test.py
Ranap program:Dengan cara ini kami tidak boleh menggunakan pdb untuk nyahpepijat. Jadi apabila program ranap, bagaimana kita harus nyahpepijatnya?
F:\PycharmProjects\pytorch_practice>python test.py Traceback (most recent call last): File "test.py", line 4, in <module> add("hello") File "test.py", line 2, in add return n+1 TypeError: can only concatenate str (not "int") to str</module>
Kami boleh menggunakan arahan berikut untuk penyahpepijatan mudah:
python -i test.pyPilihan -i membolehkan anda membuka Interaktif cangkerang, seperti berikut:
F:\PycharmProjects\pytorch_practice>python -i test.py Traceback (most recent call last): File "test.py", line 4, in <module> add("hello") File "test.py", line 2, in add return n+1 TypeError: can only concatenate str (not "int") to str >>></module>
现在我们发现程序结束后出现了 >>> 符号,这就是python调试器。
输入命令:
import pdb pdb.pm()
其中 pdb.pm() 用于程序发生异常导致奔溃后的事后调试,可以跟踪异常程序最后的堆在信息。
执行命令后得到:
TypeError: can only concatenate str (not "int") to str >>> import pdb >>> pdb.pm() > f:\pycharmprojects\pytorch_practice\test.py(2)add() -> return n+1 (Pdb)
可以发现,pdb.pm() 已经追踪到了导致程序奔溃的语句:return n+1
此时可以打印 n 的值进行检查:
(Pdb) p n'hello'(Pdb) q>>> quit() F:\PycharmProjects\pytorch_practice>
q 表示退出pdb调试,quit() 表示退出 python 调试器。
【相关推荐:Python3视频教程 】
Atas ialah kandungan terperinci Ringkasan penggunaan alat penyahpepijat python pdb (Python Debugger). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!