python执行命令行调试工具pdb
调试
pdb
pdb是基于命令行的调试工具,非常类似gnu的gdb(调试c/c++)。
命令 | 简写命令 | 作用 |
---|---|---|
break | b |
设置断点(用法,b <数字>:在第数字行设置断点。.........................................................) b 直接回车,查看所有断点 |
continue | c | 直接全部执行完毕----->直到遇到断点 |
list | l | 查看所有代码段 |
step | s | 进入函数 |
return | r | 在执行到函数内部时;执行代码到return完毕 |
quit | q | 中止并退出 |
next | n | 执行下一行 |
p | 打印变量的值 | |
help | h | 帮助 |
args | a | 查看当前执行函数 传入的参数 |
回车 | 重复上一条命令 | |
break | b | 显示所有断点 |
break lineno | b lineno | 在指定行设置断点 |
break file:lineno | b file:lineno | 在指定文件的行设置断点 |
clear num | 删除指定断点 ,num为断点的编号 | |
bt | 查看函数调用栈帧 |
执行时调试
程序启动,停止在第一行等待单步调试。
python -m pdb some.py
交互调试
进入python或ipython解释器
import pdb
pdb.run('testfun(args)') #此时会打开pdb调试,注意:先使用s跳转到这个testfun函数中,然后就可以使用l看到代码了
程序里埋点
当程序执行到pdb.set_trace() 位置时停下来调试
代码上下文
...
import pdb
pdb.set_trace()
...
日志调试
print大法好
使用pdb调试的5个demo
demo 1
import pdb
a = "aaa"
pdb.set_trace()
b = "bbb"
c = "ccc"
final = a + b + c
print final
#调试方法
# 《1 显示代码》
# l---->能够显示当前调试过程中的代码,其实l表示list列出的意思
#如下,途中,-> 指向的地方表示要将要执行的位置
# 2 a = "aaa"
# 3 pdb.set_trace()
# 4 b = "bbb"
# 5 c = "ccc"
# 6 pdb.set_trace()
# 7 -> final = a + b + c
# 8 print final
# 《2 执行下一行代码》
# n---->能够向下执行一行代码,然后停止运行等待继续调试 n表示next的意思
# 《3 查看变量的值》
# p---->能够查看变量的值,p表示prit打印输出的意思
#例如:
# p name 表示查看变量name的值
demo 2
import pdb
a = "aaa"
pdb.set_trace()
b = "bbb"
c = "ccc"
pdb.set_trace()
final = a + b + c
print final
# 《4 将程序继续运行》
# c----->让程序继续向下执行,与n的区别是n只会执行下面的一行代码,而c会像python xxxx.py一样 继续执行不会停止;c表示continue的意思
# 《5 set_trace()》
# 如果程序中有多个set_trace(),那么能够让程序在使用c的时候停留在下一个set_trace()位置处
demo 3
#coding=utf-8
import pdb
def combine(s1,s2):
s3 = s1 + s2 + s1
s3 = '"' + s3 +'"'
return s3
a = "aaa"
pdb.set_trace()
b = "bbb"
c = "ccc"
final = combine(a,b)
print final
# 《6 设置断点》
# b---->设置断点,即当使用c的时候,c可以在遇到set_trace()的时候停止,也可以在遇到标记有断点的地方停止;b表示break的意思
#例如:
#b 11 在第11行设置断点,注意这个11可以使用l来得到
# (Pdb) l
# 4 s3 = s1 + s2 + s1
# 5 s3 = '"' + s3 +'"'
# 6 return s3
# 7 a = "aaa"
# 8 pdb.set_trace()
# 9 -> b = "bbb"
# 10 c = "ccc"
# 11 final = combine(a,b)
# 12 print final
# [EOF]
# (Pdb) b 11
# Breakpoint 1 at /Users/wangmingdong/Desktop/test3.py:11
# (Pdb) c
# > /Users/wangmingdong/Desktop/test3.py(11)<module>()
# -> final = combine(a,b)
# (Pdb) l
# 6 return s3
# 7 a = "aaa"
# 8 pdb.set_trace()
# 9 b = "bbb"
# 10 c = "ccc"
# 11 B-> final = combine(a,b)
# 12 print final
# 《7 进入函数继续调试》
# s---->进入函数里面继续调试,如果使用n表示把一个函数的调用当做一条语句执行过去,而使用s的话,会进入到这个函数 并且停止
#例如
# (Pdb) l
# 6 return s3
# 7 a = "aaa"
# 8 pdb.set_trace()
# 9 b = "bbb"
# 10 c = "ccc"
# 11 B-> final = combine(a,b)
# 12 print final
# [EOF]
# (Pdb) s
# --Call--
# > /Users/wangmingdong/Desktop/test3.py(3)combine()
# -> def combine(s1,s2):
# (Pdb) l
# 1 import pdb
# 2
# 3 -> def combine(s1,s2):
# 4 s3 = s1 + s2 + s1
# 5 s3 = '"' + s3 +'"'
# 6 return s3
# 7 a = "aaa"
# 8 pdb.set_trace()
# 9 b = "bbb"
# 10 c = "ccc"
# 11 B final = combine(a,b)
# (Pdb)
# 《8 查看传递到函数中的变量》
# a---->调用一个函数时,可以查看传递到这个函数中的所有的参数;a表示arg的意思
#例如:
# (Pdb) l
# 1 #coding=utf-8
# 2 import pdb
# 3
# 4 -> def combine(s1,s2):
# 5 s3 = s1 + s2 + s1
# 6 s3 = '"' + s3 +'"'
# 7 return s3
# 8
# 9 a = "aaa"
# 10 pdb.set_trace()
# 11 b = "bbb"
# (Pdb) a
# s1 = aaa
# s2 = bbb
# 《9 执行到函数的最后一步》
# r----->如果在函数中不想一步步的调试了,只是想到这个函数的最后一条语句那个位置,比如return语句,那么就可以使用r;r表示return的意思
demo 4
In [1]: def pdb_test(arg):
...: for i in range(arg):
...: print(i)
...: return arg
...:
In [2]: #在python交互模式中,如果想要调试这个函数,那么可以
In [3]: #采用,pdb.run的方式,如下:
In [4]: import pdb
In [5]: pdb.run("pdb_test(10)")
> <string>(1)<module>()
(Pdb) s
--Call--
> <ipython-input-1-ef4d08b8cc81>(1)pdb_test()
-> def pdb_test(arg):
(Pdb) l
1 -> def pdb_test(arg):
2 for i in range(arg):
3 print(i)
4 return arg
[EOF]
(Pdb) n
> <ipython-input-1-ef4d08b8cc81>(2)pdb_test()
-> for i in range(arg):
(Pdb) l
1 def pdb_test(arg):
2 -> for i in range(arg):
3 print(i)
4 return arg
[EOF]
(Pdb) n
> <ipython-input-1-ef4d08b8cc81>(3)pdb_test()
-> print(i)
(Pdb)
0
> <ipython-input-1-ef4d08b8cc81>(2)pdb_test()
-> for i in range(arg):
(Pdb)
> <ipython-input-1-ef4d08b8cc81>(3)pdb_test()
-> print(i)
(Pdb)
1
> <ipython-input-1-ef4d08b8cc81>(2)pdb_test()
-> for i in range(arg):
(Pdb)
demo 5 运行过程中使用pdb修改变量的值
In [7]: pdb.run("pdb_test(1)")
> <string>(1)<module>()
(Pdb) s
--Call--
> <ipython-input-1-ef4d08b8cc81>(1)pdb_test()
-> def pdb_test(arg):
(Pdb) a
arg = 1
(Pdb) l
1 -> def pdb_test(arg):
2 for i in range(arg):
3 print(i)
4 return arg
[EOF]
(Pdb) !arg = 100 #!!!这里是修改变量的方法
(Pdb) n
> <ipython-input-1-ef4d08b8cc81>(2)pdb_test()
-> for i in range(arg):
(Pdb) l
1 def pdb_test(arg):
2 -> for i in range(arg):
3 print(i)
4 return arg
[EOF]
(Pdb) p arg
100
(Pdb)
练一练:请使用所学的pdb调试技巧对其进行调试出bug
#coding=utf-8
import pdb
def add3Nums(a1,a2,a3):
result = a1+a2+a3
return result
def get3NumsAvarage(s1,s2):
s3 = s1 + s2 + s1
result = 0
result = add3Nums(s1,s2,s3)/3
if __name__ == '__main__':
a = 11
# pdb.set_trace()
b = 12
final = get3NumsAvarage(a,b)
print final
pdb 调试有个明显的缺陷就是对于多线程,远程调试等支持得不够好,同时没有较为直观的界面显示,不太适合大型的 python 项目。而在较大的 python 项目中,这些调试需求比较常见,因此需要使用更为高级的调试工具。
python执行命令行调试工具pdb的更多相关文章
- Python执行命令行
背景 我们知道,虽然会破坏平台独立性,但是有的时候需要在代码里面调用命令行来获取一些信息,那么了解在 Python 中如何执行命令行至关重要 使用介绍 Python 中使用命令行可以通过 subpro ...
- Python 执行命令行操作。
os.system os.popen() commands.getstatusoutput(cmd) (status, output) = commands.getstatusoutput('cat ...
- 如何在sublime编辑器中,执行命令行脚本
我有个愿意,在执行命令行时,不打开那个黑乎乎命令行窗口,如果编辑器内置支持就好了. 打开vs code 和 sublime,分别按快捷键 Ctrl + ·(tab键上面那个键),vs code可以提供 ...
- python制作命令行工具——fire
python制作命令行工具--fire 前言 本篇教程的目的是希望大家可以通读完此篇之后,可以使用python制作一款符合自己需求的linux工具. 本教程使用的是google开源的python第三方 ...
- 【转载】在LoadRunner向远程Linux/Unix执行命令行并收集性能数据
前面介绍过在LoadRunner的Java协议实现“使用SSH连接Linux”,当然连接之后的故事由你主导. 今天要讲的,是一个非Java版本.是对“在LoadRunner中执行命令行程序之:pope ...
- 执行命令行并等待完成(使用WaitForSingleObject达到目的)
function TDMDb.WaitExeFinish(const sCmdName: string):boolean; var StartupInfo: TStartupInfo; Process ...
- python 交互式命令行数据库连接助手 -- mysql、sql server (mssql)、redis
目录 python 交互式命令行数据库连接助手 0. 操作示例 1. python 连接mssql 2. python 连接mysql 3. python 连接redis n. Tips python ...
- UNIX环境编程学习笔记(22)——进程管理之system 函数执行命令行字符串
lienhua342014-10-15 ISO C 定义了 system 函数,用于在程序中执行一个命令字符串.其声明如下, #include <stdlib.h> int system( ...
- 【python】命令行解析工具argparse用法
python的命令行参数 之前有用到optget, optparse, 现在这些都被弃用了. import argparse parser = argparse.ArgumentParser() ar ...
随机推荐
- c++基础知识02
1.前置与后置区别 #include<iostream> using namespace std; int main() { //前置和后置区别 //前置递增或递减 先让变量加减1 然后进 ...
- 洛谷 P5048 - [Ynoi2019 模拟赛] Yuno loves sqrt technology III(分块)
题面传送门 qwq 感觉跟很多年前做过的一道题思路差不多罢,结果我竟然没想起那道题?!!所以说我 wtcl/wq 首先将 \(a_i\) 离散化. 如果允许离线那显然一遍莫队就能解决,复杂度 \(n\ ...
- CF1493E Enormous XOR
题目传送门. 题意简述:给出长度为 \(n\) 的二进制数 \(l,r\),求 \(\max_{l\leq x\leq y\leq r}\oplus_{i=x}^yi\). 非常搞笑的题目,感觉难度远 ...
- RNA-seq 生物学重复相关性验证
根据拿到的表达矩阵设为exprSet 1.用scale 进行标准化 数据中心化:数据集中的各个数字减去数据集的均值 数据标准化:中心化之后的数据在除以数据集的标准差. 在R中利用scale方法来对数据 ...
- 金蝶EAS——客户端打开时,提示正在更新的文件d:\eas\client\bin\lib\proxy.jar被其他应用程序占用.请关闭
解决办法: 一.通过调用任务管理器来退出,启用任务管理器需同时按下键Ctrl+Alt+Del,在应用程序中找到金蝶EAS,单击,选择结束任务即可:或者在任务管理器中选择"进程",点 ...
- C语言计算fastq文件GC含量2
改进了一下,利用zlib可以读取gz格式的压缩文件,也可以直接计算非压缩格式 #include <stdio.h> #include <stdlib.h> #include & ...
- Linux基础命令---alias别名
alias Alias不带参数或使用-p选项在标准输出上以"name=value"的形式打印别名列表.当提供参数时,为其值给定的每个名称定义一个别名.值中的尾随空格将导致在扩展别名 ...
- linux 6.5 网卡
启动网卡 ifup eth0 eth0:网卡名称 设置网卡开机启动 vi /etc/sysconfig/network-scripts/ifcfg-eth0 ONBOOT=yes
- HelloWorldDynamic
package mbeanTest; import java.lang.reflect.Method; import javax.management.Attribute; import javax. ...
- java Map集合类
---恢复内容开始--- Map提供了一个更通用的元素存储方法,Map集合类用于存储元素对(称作"键"和"值"),其中每个键映射到一个值. 了解Map接口和方法 ...