刚读研的时候看到老师用pdb debug觉得很酷,不知道怎么用,下来后自己试了试,我感觉很好用!(1、可能是因为debug的文件夹都比较熟悉了所以觉得pdb好用,建议还是可以用vscode调试;2、亲身体验在Linux使用pdb调试打印model时显示不完整,不利于查看,在vscode的终端pdb调试能完整的看到model)
1、应用场景
用于Linux系统下Python文件的debug。
- 直接调试Python文件(此时我们的文件夹就全是Python文件,需要调试的Python文件不在一些执行脚本里面)。
- shell脚本里带有Python文件时(我们实现一些功能的时候,会写一个shell脚本即.sh文件,里面可能包括一些变量、路径之类的,也包括我们要运行的Python文件。运行的时候我们运行.sh文件,如果脚本里有运行Python文件的命令,那自然而然里面的Python文件也被运行到了)。
2、两种方式调试
- 非侵入式方法
python -m pdb xxx.py 如果还有后续的参数,直接加在它后面。
如果是要调试Pytorch的神经网络,如下命令:
torchrun -m pdb xxx.py : 注意调试的时候使用一个GPU, 一个线程来调试最好。 - 侵入式方法
需要在运行的文件中增加一行
import pdb;pdb.set_trace()
3、基本操作
- 查看源代码:
l
查看当前位置前后11行。ll
,查看当前函数的所有代码 - 运行下一行:
n
就是往下运行一行 - 添加断点:
b /mnt/database/xxx.py:100
在/mnt/database/xxx.py路径下的xxx.py文件的第100行打断点 - 清除断点:
cl
- 打印变量值:
p A
打印变量名为A的值(若是想打印这个A的shape之类的属性值都可以,即p A.shape
,就会把A的shape打印出来,打印其他属性操作是一样的) - 进入函数:
s
如果我们运行到某一行,这一行调用了一个函数,我们就可以使用s,然后就可以跳到那个函数里面去 - 执行下一行:
r
如果在函数中,直接运行到函数返回处 - 直接跳转到指定行:
j 100
跳到第100行 - 跳到断点处:
c
先使用b打断点,然后使用c就可以直接跳到断点处 - 持续执行直到运行到指定行:
unt 100
假如我现在在第20行,使用该命令我可以一直往下执行到第100行 - 在函数中时打印函数的参数和参数的值:
a
- 退出pdb调试:
q
- 如果要重新开始下一次调试:(即保留断点设置和debugger设置):
restart
4、例子解释
- 我使用的是wenet中写好的run.sh脚本(wenet是一个做语音识别的开源工具),对网络训练的时候进行debug
- shell脚本内容(看下我代码里的注释)
#!/bin/bash
. ./path.sh || exit 1;
export CUDA_VIS