使用Pdb调试Python

2023-11-05

简单介绍

Python自带 Pdb库,使用 Pdb调试 Python程序还是很方便的。但是远程调试、多线程,Pdb是搞不定的

本文参考的相关文章如下:

用Pdb调试有多种方式

使用 Pdb调试 Python的程序的方式主要是下面的三种!下面逐一介绍

命令行加-m参数

命令行启动目标程序,加上-m参数,这样调用 testPdb.py的话断点就是程序执行的第一行之前

本文接下来重点讲到的实例展示就是使用这种方式进行调试的!

python -m pdb testPdb.py

在python交互环境调试

>>> import pdb
>>> import testPdb
>>> pdb.run('testPdb.test()')

代码中插入一段程序

比较常用的,就是在程序中间插入一段程序,相对于在一般 IDE 里面打上断点然后启动 debug,不过这种方式是 hardcode的

if __name__ == "__main__":
  a = 1
  import pdb
  pdb.set_trace()
  b = 2
  c = a + b
  print(c)

然后正常运行脚本:python testPdb.py 到了 pdb.set_trace()那里就会定下来,然后就可以看到调试的提示符 (Pdb)了

针对上面的这段小程序的调试情况如下:

clipboard.png

准备测试程序

接下来使用上面介绍的第一种方式来调试 Python程序,以此来介绍 pdb常用的命令,不过在开始之前先要准备好测试的程序代码:

testFun.py

这是一个会被主模块调用的子模块,用于测试使用 Pdb调试的时候,是不是可以断点从主模块跟踪进入子模块(后续有说明)

#!/usr/bin/python
# -*- coding: utf-8 -*-

def add(a, b):
    return a + b

testPdb.py

这是下面被调试的主模块的代码

#!/usr/bin/python
# -*- coding: utf-8 -*-

def sub(a, b):
    return a - b

if __name__ == "__main__":

    print ''
    import testFun
    i = 0
    a = 1
    while(i < 100):
        a = testFun.add(a, 1)
        i = i + 1
    print "累加结果:", a
    print ""

    for letter in 'Pdb':
        print "当前字母:", letter
    print ""

    fruits = ['banana', 'apple', 'mango']
    for fruit in fruits:
        print "当前水果:", fruit
    print ""


    ret = 0
    for num in range(10, 12):
        ret = sub(ret, num)
    print '循环结果:', ret
    print ""

    d = {'abc': 123, 123: "abc"}
    for (k,v) in d.items():
        print "当前键值对:", k, '-', v
    print ""

总结常用的命令

基础命令

h(elp)命令:会打印当前版本 Pdb可用的命令,如果要查询某个命令,可输入 h [command] ,例如 h l 查看 list命令

clipboard.png

l(ist)命令:可以列出当前将要运行的代码块

clipboard.png

断点管理

b(reak):设置断点

比如 b 12 就是在当前脚本的第 9行加上断点

比如 b sub 就是在当前脚本的 sub函数定义处加断点

除了可以在当前的脚本中添加断点之外,还可以在当前脚本对其他脚本下断点,以上面用到的代码为例 b testFun.add 就可以实现在 testFun.py脚本中的 add函数处加断点

如果只用 b 就会显示现有的全部断点

clipboard.png

condition bpnumber [condition]:设置条件断点,比如 condition 2 a==0 ,就是在第二个断点出加条件 “a==0”

clipboard.png

cl(ear):删除断点,如果后面带有参数,就是清楚指定的断点;如果不带参数就是清除所有的断点

clipboard.png

disable/enable:禁用/激活断点

clipboard.png

程序逻辑控制

下面展示的几个命令,需要知道对应的脚本的代码和行号,所以这里先截图展示下面测试需要用到的前几行代码

clipboard.png

c(ont(inue)),让程序正常运行,直到遇到下一个断点

clipboard.png

n(ext),让程序运行下一行,如果当前语句有一个函数调用,用n是不会进入被调用的函数体中的

下图中展示的,当对脚本断点调试到 testFun.add(a, 1)时,继续执行n,并不会进入 testFun.add(a, 1)的函数内部

clipboard.png

s(tep),跟n相似,但如果当前有一个函数调用,那么 s会进入被调用的函数体中

下图中展示的,当对脚本断点调试到 testFun.add(a, 1)时,继续执行s,会进入 testFun.add(a, 1)对应的函数定义内部,虽然 testFun.add不是本脚本中定义的函数

clipboard.png

j(ump),让程序跳转到指定的行数

假如当前所在行是 10,注意:假如执行了 j 20 之后,那么相当于程序直接跳到 20行,中间的 11~19行其实就直接跳过去根本没有被执行到,所以如果这段代码中有变量的声明或对象的初始化需要在 20行及之后被用到,那么等到用到的时候就可能导致报错!

clipboard.png

打印重要信息

a(rgs),打印当前函数的参数。比如下图就是展示断点进入到 testFun.add内部之后,打印 testFun.add的参数

clipboard.png

p,打印某个变量

clipboard.png

退出调试

q,直接退出调试;或者使用 Ctrl+D的方式退出

clipboard.png

最后说一句

上面展示的使用 Pdb调试的过程其实是很简单的,文章中主要通过截图展示运行的效果。如果单纯的看一遍文章,不出意外,会很没有头绪,甚至感觉截图中的命令、输出乱七八糟,但是如果亲自动手跟着走一遍流程,花不了一小时,但是效果绝对极佳!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用Pdb调试Python 的相关文章

  • Python setuptools:如何在 setup.py 中添加私有存储库 (gitlab)?

    我上传了 2 个包 它们位于我的 gitlab 存储库中 如果我想使用 pip 将它们安装在我的系统中 这很容易 因为 gitlab 可以帮助您 https docs gitlab com ee user packages pypi rep
  • 切片稀疏(scipy)矩阵

    我将不胜感激任何帮助 以理解从 scipy sparse 包中切片 lil matrix A 时的以下行为 实际上 我想根据行和列的任意索引列表提取子矩阵 当我使用这两行代码时 x1 A list 1 x2 x1 list 2 一切都很好
  • JavaScript 相当于 Python 的参数化 string.format() 函数

    这是 Python 示例 gt gt gt Coordinates latitude longitude format latitude 37 24N longitude 115 81W Coordinates 37 24N 115 81W
  • 将 numpy 数组写入文本文件的速度

    我需要将一个非常 高 的两列数组写入文本文件 而且速度非常慢 我发现如果我将数组改造成更宽的数组 写入速度会快得多 例如 import time import numpy as np dataMat1 np random rand 1000
  • 如何使用显式引用转储 YAML?

    递归引用非常适合ruamel yaml or pyyaml ruamel yaml dump ruamel yaml load A A id001 id001 然而 它 显然 不适用于普通引用 ruamel yaml dump ruamel
  • 为什么我的代码不能根据字典解码加密字符串?

    我有一本字典 其中包含代表字母的键和值 例如一个简单的 DICT CODE b g n a p o x d t y 我收到了一个加密代码 并将该字符串转换为一个列表 其中每个项目都是一个单词 我需要根据字典中的项目来解决它 代码示例是 wo
  • TF map_fn 或 while_loop 用于不同形状的张量列表

    我想处理不同形状的张量序列 列表 并输出另一个张量列表 考虑每个时间戳上具有不同隐藏状态大小的 RNN 就像是 输入 tf ones 1 2 2 tf ones 2 2 3 tf ones 3 2 1 输出 tf zeros 1 2 4 t
  • 了解 Python 中的酸洗

    我最近接到一项作业 需要以腌制形式放置一本字典 其中每个键引用一个列表 唯一的问题是我不知道腌制形式是什么 谁能给我指出一些好的资源的正确方向来帮助我学习这个概念 pickle 模块实现了一个基本但强大的算法 用于序列化和反序列化 Pyth
  • 更新 Sqlalchemy 中的多个列

    我有一个在 Flask 上运行的应用程序 并使用 sqlalchemy 与数据库交互 我想用用户指定的值更新表的列 我正在使用的查询是 def update table value1 value2 value3 query update T
  • 登录网站并使用 python 请求下载文件

    我有一个带有 HTML 表单的网站 登录后 它会将我带到 start php 站点 然后将我重定向到overview php 我想从该服务器下载文件 当我单击 ZIP 文件的下载链接时 链接后面的地址是 getimage php path
  • 可以用 Django 制作移动应用程序吗?

    我想知道我是否可以在我的网站上使用 Django 代码 并以某种方式在移动应用程序 Flutter 等框架中使用它 那么是否可以使用我现在拥有的 Django 后端并在移动应用程序中使用它 所以就像models views etc 是的 有
  • 如何将 self 传递给装饰器?

    我该如何通过self key下面进入装饰器 class CacheMix object def init self args kwargs super CacheMix self init args kwargs key func Cons
  • `list()` 被认为是一个函数吗?

    list显然是内置类型 https docs python org 3 library stdtypes html list在Python中 我看到底下有一条评论this https stackoverflow com a 53645813
  • 在Python中计算内存碎片

    我有一个长时间运行的进程 不断分配和释放对象 尽管正在释放对象 但 RSS 内存使用量会随着时间的推移而增加 如何计算发生了多少碎片 一种可能性是计算 RSS sum of allocations 并将其作为指标 即便如此 我该如何计算分母
  • 乘以行并按单元格值附加到数据框

    考虑以下数据框 df pd DataFrame X a b c d Y a b d e Z a b c d 1 2 1 3 df 我想在 列中附加数字大于 1 的行 并在该行中的数字减 1 df 最好应该 然后看起来像这样 或者它可能看起来
  • 更改 Python Cmd 模块处理自动完成的方式

    我有一个 Cmd 控制台 设置为自动完成 Magic the Gathering 收藏管理系统的卡牌名称 它使用文本参数在数据库中查询卡片 并使用结果自动完成 建议卡片 然而 这些卡片名称有多个单词 Cmd 会从last到行尾的空间 例如
  • Django 模型:如何使用 mixin 类来覆盖 django 模型以实现 save 等功能

    我想在每次保存模型之前验证值 所以 我必须重写保存函数 代码几乎是一样的 我想把它写在 mixin 类中 但失败了 我不知道如何写 super func 我英语不好 抱歉 class SyncableMixin object def sav
  • 在 Django shell 会话期间获取 SQL 查询计数

    有没有办法打印 Django ORM 在 Django shell 会话期间执行的原始 SQL 查询的数量 Django 调试工具栏已经提供了此类信息 例如 5 QUERIES in 5 83MS但如何从 shell 中获取它并不明显 您可
  • 如何为所有用户安装 Anaconda python?

    Anaconda python 发行版 https store continuum io cshop anaconda 非常方便地部署科学计算环境 SCE 并根据需要切换python版本 默认情况下 安装会将 python 定位到 anac
  • 长/宽数据到宽/长

    我有一个数据框 如下所示 import pandas as pd d decil 1 decil 1 decil 2 decil 2 decil 3 decil 3 decil kommune AA BB AA BB AA BB 2010

随机推荐

  • Java业务开发常见错误100例总结

    最近在极客时间上看了 Java业务开发常见错误100例 收获还是很大 我个人是很认真地刷了两遍 并花了二十来个晚上认真整理了一份脑图包括大纲和每个知识点的详细笔记 虽然Github上有原创作者整理的版本 效果如下 全部内容如下 自己整理一遍
  • linux(RedHat)启动无法进入图形界面,出现灰色屏幕。

    问题描述 安装完某些软件如DB2 Oracle等 可能出现启动系统 检查完各种硬件设备 但是没有出现登陆界面 出现的 是灰色屏幕 解决过程 初步猜测是无法启动图形界面 进一步论证的方法是在启动时 按下entre键 选择你按装的或者是要更改的
  • JavaScript实现人民币大小写转换

    当使用支票或者签署合同时 需要用到大写人民币 常用的中文大写包括零 壹 贰 叁 肆 伍 陆 柒 捌 玖 拾 佰 仟 万 亿 本文介绍下如何使用JavaScript实现将阿拉伯数字的人民币转换成大写 工具地址 人民币大小写转换工具 人民币大小
  • uni-app自定义配置安卓模拟器 - MuMu模拟器

    第一步 下载MuMu模拟器 下载地址 http mumu 163 com 第二步 配置模拟器端口以及abd路径 该路径在HBuilder安装目录中 然后继续打开你的HBuilder编辑器 运行 运行到手机或模拟器 安卓模拟器端口配置 第三步
  • Oracle查询入门(五)连表查询

    定义 表连接查询 当要查询的数据来自于多个数据源 现在主要有92语法和99语法 92语法 select 数据 from 数据源1 数据源2 where 行过滤条件 group by 分组字段1 分组字段2 having 组过滤信息 orde
  • 仲裁文件夹服务器,存储仲裁服务器

    存储仲裁服务器 内容精选 换一换 帮助用户完成专属云服务器备份任务的创建 快速完成服务器数据保护 专属云服务器不支持应用一致性备份 当专属对象存储的容量不足时 会导致专属云服务器备份创建失败 已开通专属对象存储 登录管理控制台 单击 选择
  • IBM小型机安装AIX系统

    1 系统开机自检 系统开机后会进行自检 前置面板绿灯闪烁 此时放入系统光盘 2 系统菜单 系统自检完成后会显示菜单 按1进入系统菜单 这里要尽快输入 否则会进入之前的系统 3 输入密码 进入系统菜单后 出现两个选项 选择第二项输入密码 默认
  • html层级显示优先,CSS 样式的层叠和优先级说明

    上面说了浏览器要查看的所有样式来源后 现在聊一下浏览器显示元素时确认一个 CSS 属性值的次序 补充 CSS 样式由一条或者多条以分号分割开的样式声明组成 每条声明包含着一个 CSS 属性和该属性的值 两者以冒号分割 一 CSS 样式的层叠
  • 期货开户CTP高性能高容量高可靠性

    一 交易通道选择 CTP交易通道是就是上期技术 是上海期货信息技术有限公司研发的期货行业技术最先进的交易系统 具备每秒2000笔交易处理能力和1毫秒的行情更新速度 保障交易系统的最高可靠性 该通道是十分成熟的交易平台 目前主流期货公司中绝大
  • 在网页中内嵌网页

    目录 文章目录 前言 代码展示 主页代码 展示作品的代码 球体运动 方块旋转 结果演示 前言 在制作个人网站时 经常遇到一个问题 就是如何让自己的作品动态的显示在主页上 而本文就是找到了解决办法 利用标签 引入想要的结果 代码展示 主页代码
  • 自学Python能做哪些副业?我一般不告诉别人

    Python作为今天的互联网不可或缺的一门技能 可以成为自己的主业以外 其实它也还是可以成为副业的 那么学好python后可以从事的副业有哪些呢 自学Python能干的副业 1 兼职处理数据 分析数据是很重要的一点 那么利用python 就
  • 结构化思维的训练方式

    转自 https www sohu com a 198266900 628522 结构化思维 Structured Thinking 是指人在面对工作任务或者难题时 能从多个侧面进行思考 深刻分析导致问题出现的原因 系统制定行动方案 并采取
  • python实现剪刀石头布小游戏

    首先实现系统随机出剪刀石头布 import random 首先导入random模块 k 剪刀 石头 布 创建一个列表 列表共有我们所需要用到的三个元素 m random choice k 用该函数随机从k中取一个元素并赋值给m m便为剪刀石
  • MySql嵌套查询+关联查询+多表查询+对应案例+mybatis动态sql 超详细

    最近学习MyBatis框架 用到多表查询比较多 以前学的不是很好 今特意回来补上 呜呜呜 有对MySql数据库的初步使用不是很了解的朋友们 可以切换到这里噢 https blog csdn net haobo article details
  • [CMake教程] if 和 else

    目录 一 基本语法 二 基本用法 三 其他用法 3 1 逻辑运算 3 2 存在性检查 3 3 文件操作 3 4 数值比较 3 5 字符串比较 3 6 版本比较 3 7 路径比较 CMake 3 24引入 一 基本语法 if
  • 华为od机考真题-最少面试官数

    while 1 try n int input nums for in range n nums append list map int input
  • MQTT 协议入门:基础知识和快速教程

    本文是 MQTT 协议的入门指南 提供了实用的代码示例 物联网和 MQTT 的初学者可以通过本文掌握 MQTT 的基本概念 快速开启 MQTT 服务和应用的开发 什么是 MQTT MQTT Message Queuing Telemetry
  • Dell服务器通过IDRAC9收集TSR日志排查故障

    登陆IDRAC9 WEB管理界面 在菜单栏 lt 维护 gt 下选择 在联网的情况下推荐完成SupportAssist的注册 根据提示安装ISM并进行信息登记 如暂不注册 则点击取消继续 进入SupportAssist界面 点击 lt 开始
  • vue3+antv x6自定义节点样式

    前篇 vue3 ts使用antv x6 自定义节点 先大致定下节点样式 需要展示标题 输入 输出连接桩 参考样子大概是 https x6 antv antgroup com examples showcase practices class
  • 使用Pdb调试Python

    简单介绍 Python自带 Pdb库 使用 Pdb调试 Python程序还是很方便的 但是远程调试 多线程 Pdb是搞不定的 本文参考的相关文章如下 指针和字符串和字符串常量 用gdb来获取非法内存中的内容 Linux gdb调试器用法全面