调试

pdb

pdb是基于命令行的调试工具,非常类似gnu的gdb(调试c/c++)。

命令 简写命令 作用
break b

设置断点(用法,b <数字>:在第数字行设置断点。.........................................................)

b 直接回车,查看所有断点

continue c 直接全部执行完毕----->直到遇到断点
list l 查看所有代码段
step s 进入函数
return r 在执行到函数内部时;执行代码到return完毕
quit q 中止并退出
next n 执行下一行
print 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的更多相关文章

  1. Python执行命令行

    背景 我们知道,虽然会破坏平台独立性,但是有的时候需要在代码里面调用命令行来获取一些信息,那么了解在 Python 中如何执行命令行至关重要 使用介绍 Python 中使用命令行可以通过 subpro ...

  2. Python 执行命令行操作。

    os.system os.popen() commands.getstatusoutput(cmd) (status, output) = commands.getstatusoutput('cat ...

  3. 如何在sublime编辑器中,执行命令行脚本

    我有个愿意,在执行命令行时,不打开那个黑乎乎命令行窗口,如果编辑器内置支持就好了. 打开vs code 和 sublime,分别按快捷键 Ctrl + ·(tab键上面那个键),vs code可以提供 ...

  4. python制作命令行工具——fire

    python制作命令行工具--fire 前言 本篇教程的目的是希望大家可以通读完此篇之后,可以使用python制作一款符合自己需求的linux工具. 本教程使用的是google开源的python第三方 ...

  5. 【转载】在LoadRunner向远程Linux/Unix执行命令行并收集性能数据

    前面介绍过在LoadRunner的Java协议实现“使用SSH连接Linux”,当然连接之后的故事由你主导. 今天要讲的,是一个非Java版本.是对“在LoadRunner中执行命令行程序之:pope ...

  6. 执行命令行并等待完成(使用WaitForSingleObject达到目的)

    function TDMDb.WaitExeFinish(const sCmdName: string):boolean; var StartupInfo: TStartupInfo; Process ...

  7. python 交互式命令行数据库连接助手 -- mysql、sql server (mssql)、redis

    目录 python 交互式命令行数据库连接助手 0. 操作示例 1. python 连接mssql 2. python 连接mysql 3. python 连接redis n. Tips python ...

  8. UNIX环境编程学习笔记(22)——进程管理之system 函数执行命令行字符串

    lienhua342014-10-15 ISO C 定义了 system 函数,用于在程序中执行一个命令字符串.其声明如下, #include <stdlib.h> int system( ...

  9. 【python】命令行解析工具argparse用法

    python的命令行参数 之前有用到optget, optparse, 现在这些都被弃用了. import argparse parser = argparse.ArgumentParser() ar ...

随机推荐

  1. 关于"丢失的牛"这个题的教学反思

    某天上课讲到这样一个题:丢失的牛1~n,乱序排列,告诉从第二个位置到最后一个位置, 每个位置的前面的数字中比它小的数的个数,求每个位置的数字是多少N<=8000 FormatInput第一行给出 ...

  2. 使用微软RPA工具 Power Automate自动完成重复性工作

    介绍 最近发现了win11自带了一个有趣的功能,可以自动去执行一些流程的工作.恰好目前每天早上都需要去提醒同事填写日计划,刚好可以试用下. 这是官网上对此功能的介绍 可以看到,对于win11我们是可以 ...

  3. C++ and OO Num. Comp. Sci. Eng. - Part 1.

    本文参考自 <C++ and Object-Oriented Numeric Computing for Scientists and Engineers>. 序言 书中主要讨论的问题是面 ...

  4. python12类

    self 表示类里面的对象的引用 python一般不需要去解决内存管理,解释器会进行自动给回收 #类鱼类之间空格两行,前面的函数里面也是两行,类里面的方法个一行 class Cat(object): ...

  5. perl substr

    substr EXPR,OFFSET,LENGTH,REPLACEMENT substr EXPR,OFFSET,LENGTH substr EXPR,OFFSET Extracts a substr ...

  6. MicrosoftPowerBI—2019-nCov 新型冠状病毒肺炎多功能动态看板

    https://app.powerbi.cn/view?r=eyJrIjoiNmE0ZDU0MGItOTFjYy00MWYyLWFmZjMtMThkM2EwMzg5YjgyIiwidCI6ImQxNj ...

  7. react native安装遇到的问题

    最近学习react native 是在为全栈工程师而努力,看网上把react native说的各种好,忍不住学习了一把.总体感觉还可以,特别是可以开发android和ios这点非常厉害,刚开始入门需要 ...

  8. Tikz绘制形似万花尺的图片

    初中时意外发现数学课本上有这么一个好玩的图 大概就是把两条相等线段A.B分为10个小段并在点上标序号,A线段1点连B线段9点,2点连8点,依次类推. 假设有这么一个框架图 按照第一张图的方式进一步绘图 ...

  9. 学习java 7.19

    学习内容: 接口的组成中加入了默认方法,静态方法,私有方法 接口中默认方法:public default 返回值类型  方法名(参数列表){ } public default void show()  ...

  10. 转Android service 启动篇之 startForegroundService

    本文转自:https://blog.csdn.net/shift_wwx/article/details/82496447 前言: 在官方文档 Android 8.0 行为变更 中有这样一段话: An ...