Rumah > pembangunan bahagian belakang > Tutorial Python > Ringkasan penggunaan alat penyahpepijat python pdb (Python Debugger)

Ringkasan penggunaan alat penyahpepijat python pdb (Python Debugger)

WBOY
Lepaskan: 2022-11-07 20:25:06
ke hadapan
6366 orang telah melayarinya

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.

Ringkasan penggunaan alat penyahpepijat python pdb (Python Debugger)

[Cadangan berkaitan: Tutorial video Python3 ]

1. Terdapat 2 cara untuk menggunakan pdb

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.

3. Gunakan perintah putus untuk menetapkan titik putus pada lokasi yang ditentukan dalam fail yang ditentukan

3.1 Tetapkan titik putus pada lokasi yang dinyatakan dalam fail ini

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)
Salin selepas log masuk

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:

Ringkasan penggunaan alat penyahpepijat python pdb (Python Debugger) 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:

Ringkasan penggunaan alat penyahpepijat python pdb (Python Debugger)Untuk meringkaskan, arahan untuk menetapkan titik putus dalam fail yang sama ialah:

garis putus

3.2 Dalam lain-lain Tetapkan titik putus pada lokasi yang ditentukan dalam fail

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)
Salin selepas log masuk

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)
Salin selepas log masuk

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
Salin selepas log masuk

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))
Salin selepas log masuk

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: lineRingkasan penggunaan alat penyahpepijat python pdb (Python Debugger)Kita dapat melihat bahawa atur cara boleh masuk ke hadapan() daripada output = model(input ):Ringkasan penggunaan alat penyahpepijat python pdb (Python Debugger)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)
Salin selepas log masuk

4. Gunakan Masalah yang ditemui semasa menggunakan pdb

4.1 Apabila menggunakan pautan lembut, laluan fail yang dipaparkan oleh pdb tidak konsisten dengan laluan sebenar

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. Ringkasan penggunaan alat penyahpepijat python pdb (Python Debugger)

4.2 pdb kadangkala tidak boleh menambah titik putus dalam kaedah forward() model

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()

Seperti yang dinyatakan di atas, titik putus dimasukkan apabila program mula berjalan dan pdb digunakan untuk penyahpepijatan, iaitu,

Nyahpepijat terlebih dahulu

. 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")
Salin selepas log masuk

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>
Salin selepas log masuk

Kami boleh menggunakan arahan berikut untuk penyahpepijatan mudah:

python -i test.py

Pilihan -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>
Salin selepas log masuk

现在我们发现程序结束后出现了 >>> 符号,这就是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)
Salin selepas log masuk

可以发现,pdb.pm() 已经追踪到了导致程序奔溃的语句:return n+1

此时可以打印 n 的值进行检查:

(Pdb) p n'hello'(Pdb) q>>> quit()

F:\PycharmProjects\pytorch_practice>
Salin selepas log masuk

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!

Label berkaitan:
sumber:juejin.im
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan