[python入门㊿] - python如何打断点

news2025/2/24 6:16:58

目录

❤  什么是bug(缺陷)

❤  python代码的调试方式

❤  使用 pdb 进行调试

测试代码示例

利用 pdb 调试

退出 debug

debug 过程中打印变量

停止 debug 继续执行程序

debug 过程中显示代码

使用函数的例子

对函数进行 debug

在调试的时候动态改变值

❤  使用 PyCharm 进行调试

❤  Step Over, Step Into和Step Out 

Step Over的效果​编辑

Step Into的效果​编辑

Step Out的效果​编辑


当程序中出现错误时怎么解决?也就是我们所说的bug(缺陷),以及工作中如何对bug进行调试

❤  什么是bug(缺陷)

软件缺陷就是通常说的bug,它是指在软件中(包括文档和程序)存在的影响软件正常运行的问题

缺陷的原因:

  • 编码问题
  • 项目日期限短
  • 使用新技术

❤  python代码的调试方式

使用print语句打印出来

在编辑工具中,加断点跟踪(打断点)

使用日志模块,输出到日志中

下面我们来看看怎么打断点

Debug 对于任何开发人员都是一项非常重要的技能,它能够帮助我们准确的定位错误,发现程序中的 bug。python 提供了一系列 debug 的工具,可供我们选择。

❤  使用 pdb 进行调试

pdb 是 python 自带的一个包,为 python 程序提供了一种交互的源代码调试功能,主要特性包括设置断点、单步调试、进入函数调试、查看当前代码、查看栈片段、动态改变变量的值等。pdb 提供了一些常用的调试命令

命令解释
break 或 b 设置断点设置断点
continue 或 c继续执行程序
list 或 l查看当前行的代码段
step 或 s进入函数
return 或 r执行代码直到从当前函数返回
exit 或 q中止并退出
next 或 n执行下一行
pp打印变量的值
help帮助

下面结合具体的实例讲述如何使用 pdb 进行调试 

实例1.测试代码示例

import pdb 
a = "aaa"
pdb.set_trace() 
b = "bbb"
c = "ccc"
final = a + b + c 
print(final)

开始调试:直接运行脚本,会停留在 pdb.set_trace() 处,选择 n+enter 可以执行当前的 statement。在第一次按下了 n+enter 之后可以直接按 enter 表示重复执行上一条 debug 命令

实例2.利用 pdb 调试

[root@rcc-pok-idg-2255 ~]#  python epdb1.py 
 > /root/epdb1.py(4)?() 
 -> b = "bbb"
 (Pdb) n 
 > /root/epdb1.py(5)?() 
 -> c = "ccc"
 (Pdb) 
 > /root/epdb1.py(6)?() 
 -> final = a + b + c 
 (Pdb) list 
  1     import pdb 
  2     a = "aaa"
  3     pdb.set_trace() 
  4     b = "bbb"
  5     c = "ccc"
  6  -> final = a + b + c 
  7     print(final) 
 [EOF] 
 (Pdb) 
 [EOF] 
 (Pdb) n 
 > /root/epdb1.py(7)?() 
 -> print(final)
 (Pdb)

退出 debug:使用 quit 或者 q 可以退出当前的 debug,但是 quit 会以一种非常粗鲁的方式退出程序,其结果是直接 crash。

实例3.退出 debug

[root@rcc-pok-idg-2255 ~]#  python epdb1.py 
 > /root/epdb1.py(4)?() 
 -> b = "bbb"
 (Pdb) n 
 > /root/epdb1.py(5)?() 
 -> c = "ccc"
 (Pdb) q 
 Traceback (most recent call last): 
  File "epdb1.py", line 5, in ? 
    c = "ccc"
  File "epdb1.py", line 5, in ? 
    c = "ccc"
  File "/usr/lib64/python2.4/bdb.py", line 48, in trace_dispatch 
    return self.dispatch_line(frame) 
  File "/usr/lib64/python2.4/bdb.py", line 67, in dispatch_line 
    if self.quitting: raise BdbQuit 
 bdb.BdbQuit

打印变量的值:如果需要在调试过程中打印变量的值,可以直接使用 p 加上变量名,但是需要注意的是打印仅仅在当前的 statement 已经被执行了之后才能看到具体的值,否则会报 NameError: < exceptions.NameError … ....> 错误

实例4. debug 过程中打印变量

[root@rcc-pok-idg-2255 ~]#  python epdb1.py 
 > /root/epdb1.py(4)?() 
 -> b = "bbb"
 (Pdb) n 
 > /root/epdb1.py(5)?() 
 -> c = "ccc"
 (Pdb) p b 
'bbb'
 (Pdb) 
'bbb'
 (Pdb) n 
 > /root/epdb1.py(6)?() 
 -> final = a + b + c 
 (Pdb) p c 
'ccc'
 (Pdb) p final 
 *** NameError: <exceptions.NameError instance at 0x1551b710 > 
 (Pdb) n 
 > /root/epdb1.py(7)?() 
 -> print(final)
 (Pdb) p final 
'aaabbbccc'
 (Pdb)

使用 c 可以停止当前的 debug 使程序继续执行。如果在下面的程序中继续有 set_statement() 的申明,则又会重新进入到 debug 的状态,读者可以在代码 print(final) 之前再加上 set_trace() 验证。

实例5.停止 debug 继续执行程序

[root@rcc-pok-idg-2255 ~]#  python epdb1.py 
 > /root/epdb1.py(4)?() 
 -> b = "bbb"
 (Pdb) n 
 > /root/epdb1.py(5)?() 
 -> c = "ccc"
 (Pdb) c 
 aaabbbccc

显示代码:在 debug 的时候不一定能记住当前的代码块,如要要查看具体的代码块,则可以通过使用 list 或者 l 命令显示。list 会用箭头 -> 指向当前 debug 的语句。

实例6.debug 过程中显示代码

[root@rcc-pok-idg-2255 ~]#  python epdb1.py 
 > /root/epdb1.py(4)?() 
 -> b = "bbb"
 (Pdb) list 
  1     import pdb 
  2     a = "aaa"
  3     pdb.set_trace() 
  4  -> b = "bbb"
  5     c = "ccc"
  6     final = a + b + c 
  7     pdb.set_trace() 
  8     print(final)  
 [EOF] 
 (Pdb) c 
 > /root/epdb1.py(8)?() 
 -> print final 
 (Pdb) list 
  3     pdb.set_trace() 
  4     b = "bbb"
  5     c = "ccc"
  6     final = a + b + c 
  7     pdb.set_trace() 
  8  -> print(final) 
 [EOF] 
 (Pdb)

在使用函数的情况下进行 debug

实例7.使用函数的例子

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) 

如果直接使用 n 进行 debug 则到 final=combine(a,b) 这句的时候会将其当做普通的赋值语句处理,进入到 print final。如果想要对函数进行 debug 如何处理呢 ? 可以直接使用 s 进入函数块。函数里面的单步调试与上面的介绍类似。如果不想在函数里单步调试可以在断点处直接按 r 退出到调用的地方。

实例8.对函数进行 debug

[root@rcc-pok-idg-2255 ~]# python epdb2.py 
 > /root/epdb2.py(10)?() 
 -> b = "bbb"
 (Pdb) n 
 > /root/epdb2.py(11)?() 
 -> c = "ccc"
 (Pdb) n 
 > /root/epdb2.py(12)?() 
 -> final = combine(a,b) 
 (Pdb) s 
 --Call-- 
 > /root/epdb2.py(3)combine() 
 -> def combine(s1,s2):     
 (Pdb) n 
 > /root/epdb2.py(4)combine() 
 -> s3 = s1 + s2 + s1    
 (Pdb) list 
  1     import pdb 
  2 
  3     def combine(s1,s2):      
  4  ->     s3 = s1 + s2 + s1    
  5         s3 = '"' + s3 +'"'   
  6         return s3            
  7 
  8     a = "aaa"
  9     pdb.set_trace() 
 10     b = "bbb"
 11     c = "ccc"
 (Pdb) n 
 > /root/epdb2.py(5)combine() 
 -> s3 = '"' + s3 +'"'   
 (Pdb) n 
 > /root/epdb2.py(6)combine() 
 -> return s3            
 (Pdb) n 
 --Return-- 
 > /root/epdb2.py(6)combine()->'"aaabbbaaa"'
 -> return s3           
 (Pdb) n 
 > /root/epdb2.py(13)?() 
 -> print(final)  
 (Pdb)

在调试的时候动态改变值 。在调试的时候可以动态改变变量的值,具体如下实例。需要注意的是下面有个错误,原因是 b 已经被赋值了,如果想重新改变 b 的赋值,则应该使用 B。

实例9.在调试的时候动态改变值

[root@rcc-pok-idg-2255 ~]# python epdb2.py 
 > /root/epdb2.py(10)?() 
 -> b = "bbb"
 (Pdb) var = "1234"
 (Pdb) b = "avfe"
 *** The specified object '= "avfe"' is not a function 
 or was not found along sys.path. 
 (Pdb) !b="afdfd"
 (Pdb)

pdb 调试有个明显的缺陷就是对于多线程,远程调试等支持得不够好,同时没有较为直观的界面显示,不太适合大型的 python 项目。而在较大的 python 项目中,这些调试需求比较常见,因此需要使用更为高级的调试工具。

接下来将介绍 PyCharm IDE 的调试方法 

❤  使用 PyCharm 进行调试

PyCharm 同时提供了较为完善的调试功能,支持多线程,远程调试等,可以支持断点设置,单步模式,表达式求值,变量查看等一系列功能

❤  Step Over, Step Into和Step Out 

Step Over在单步执行时,在函数内遇到子函数时不会进入子函数内单步执行,而是将子函数整个执行完再停止,也就是把子函数整个作为一步

注意:在不存在子函数的情况下Step Over是和Step Into效果一样的

Step Into:单步执行,遇到子函数就进入并且继续单步执行(即进入子函数)

Step Out:当单步执行到子函数内时,用Step Out就可以执行完子函数余下部分,并返回到上一层函数

在第14行调用devide函数时打断点

实例1.Step Over的效果

实例2.Step Into的效果

点击Step Into下一步

 点击Step Into下一步

 点击Step Into下一步

实例3.Step Out的效果

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/362156.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

el-cascader v-model 绑定值改变了,但是界面没变化

查了很多资料&#xff0c;解决办法各异&#xff0c;但以下两个没有用 &#xff08;1&#xff09;this.$forceUpdate()强制更新渲染&#xff0c;没用。 &#xff08;2&#xff09;使用v-if和this.ifPanel false去控制el-cascader的显示&#xff0c;目的也是重新渲染&#xff…

原生小程序中模板自定义组件事件

封装request.js请求文件目的&#xff1a;优化代码结构以及后期项目版本迭代和维护方便&#xff0c;提升代码的执行速度。假设:在原生page中使用基本写法创建ajax请求//发送请求了wx.request({url:"",method:"",data:"",success(res){//写业务操做…

数据分片(mycat)

1. 数据分片概念&#xff1a; 1.1. 分库分表 什么是分库分表&#xff1a; 将存放在一台数据库服务器中的数据&#xff0c;按照特定方式&#xff08;指的是程序开发的算法&#xff09;进行拆分&#xff0c;分散存放到多台数据库服务器中&#xff0c;以达到分散单台服务器负载的…

Vue使用distpicker插件实现省市级下拉框三级联动

前言 这几天做项目&#xff0c;想着用一个全国省市区插件&#xff0c;之前就知道有几种&#xff0c;比如通过JSON文件生成对应的区域下拉框&#xff0c;element-china-are插件&#xff0c;包括distpicker插件 今天主要介绍的是如何使用distpicker插件实现省市级三联跳动 官网…

2023年100道最新Android面试题,常见面试题及答案汇总

除了需要掌握牢固的专业技术之外&#xff0c;还需要刷更多的面试去在众多的面试者中杀出重围。小编特意整理了100道Android面试题&#xff0c;送给大家&#xff0c;希望大家都能顺利通过面试&#xff0c;拿下高薪。赶紧拿去吧~~文末有答案Q1.组件化和arouter原理Q2.自定义view&…

钣金行业mes解决方案,缩短产品在制周期

钣金加工行业具有多品种、小批量离散制造行业的典型特点。一些常见的下料车间、备料车间、冲压车间、冲剪生产线等。一般来说&#xff0c;核心业务是钣金加工的生产单位。 一般来说&#xff0c;与大规模生产相比&#xff0c;这种生产方式效率低、成本高&#xff0c;自动化难度…

ur3+robotiq ft sensor+robotiq 2f 140配置gazebo仿真环境

ur3robotiq ft sensorrobotiq 2f 140配置gazebo仿真环境 搭建环境&#xff1a; ubuntu: 20.04 ros: Nonetic sensor: robotiq_ft300 gripper: robotiq_2f_140_gripper UR: UR3 通过上一篇博客配置好ur3、力传感器和robotiq夹爪的rviz仿真环境后&#xff0c;现在来配置一下对…

【读书笔记】《深入浅出数据分析》第一章 分解数据

阅读第一章后&#xff0c;觉得本章重点不是在“分解数据”上&#xff0c;而是在对分析流程&#xff0c;分析步骤的引导。 1&#xff0c;确定问题 当业务方或者leader给你提诉求时&#xff0c;往往都是会比较模糊&#xff0c;他们会简单的说下诉求&#xff0c;然后给你一些数据…

Spark介绍

1、Spark是什么?类似与Hadoop的MapReduce的计算框架,基于map和reduce实现分布式计算,对比MapReduce可有效减少落盘次数,增加效率.任务之间通信交互不需要落盘,仅在shuffle时需要重新将数据排序分区落盘.Spark的缓存功能更加高效&#xff0c;特别是在SparkSQL中,一般是以列式存…

学习.NET MAUI Blazor(六)、基于OpenAI接口的伪ChatGPT

ChatGPT不用介绍了。自从1月份开始到现在&#xff0c;火的不得了。网络上也充斥着各种教程&#xff0c;甚至还有号称是ChatGPT国内版的。那么ChatGPT到底有么有开放的API接口&#xff0c;那些打着ChatGPT的应用到底是如何实现的呢&#xff1f; 其实&#xff0c;国内环境虽然无法…

day49【代码随想录】动态规划之最长公共子序列、不相交的线、最大子序和、判断子序列

文章目录前言一、最长公共子序列&#xff08;力扣1143&#xff09;二、不相交的线&#xff08;力扣1035&#xff09;三、最大子序和&#xff08;力扣53&#xff09;四、判断子序列&#xff08;力扣392&#xff09;前言 1、最长公共子序列 2、不相交的线 3、最大子序和 4、判断…

C++012-C++一维数组

文章目录C012-C一维数组一维数组目标一维数组定义一维数组初始化一维数组输入输出题目描述 车厢货物**需要查看指定车厢的货物****倒着输出**题目描述 与指定数字相同的数的个数排序选择排序实现题目描述 成绩排名成绩第一名和最后一名在线练习&#xff1a;总结C012-C一维数组 …

推荐几个好玩的AI工具和办公效率网站!

1.copymonkey.ai CopyMonkey可以帮助用户生成和优化亚马逊商品列表文案&#xff0c;分析竞争对手&#xff0c;帮助推动销售。 2.bertha.ai Bertha可以帮助用户使用AI创建高质量的营销文案和图片&#xff0c;同时&#xff0c;帮助客户优化业务流程&#xff0c;提高效率。 3.cr…

UDP端口转发

sokit是一个开源项目&#xff0c;是一个TCP / UDP 测试工具,用来接收,发送,转发TCP或UDP数据包。 项目地址: http://code.google.com/p/sokit/、https://github.com/sinpolib/sokit。 中文版下载地址&#xff1a;https://download.csdn.net/download/android_cai_niao/874728…

LeetCode_动态规划_困难_1326.灌溉花园的最少水龙头数目

目录1.题目2.思路3.代码实现&#xff08;Java&#xff09;1.题目 在 x 轴上有一个一维的花园。花园长度为 n&#xff0c;从点 0 开始&#xff0c;到点 n 结束。 花园里总共有 n 1 个水龙头&#xff0c;分别位于 [0, 1, …, n] 。 给你一个整数 n 和一个长度为 n 1 的整数数…

LC-1326. 灌溉花园的最少水龙头数目(区间合并计算问题 LC-1024、LC-55、LC-45)

区间合并计算问题 文章目录区间合并计算问题[1326. 灌溉花园的最少水龙头数目](https://leetcode.cn/problems/minimum-number-of-taps-to-open-to-water-a-garden/)贪心[1024. 视频拼接](https://leetcode.cn/problems/video-stitching/)[55. 跳跃游戏](https://leetcode.cn/p…

感知数据温度,聚焦海量冷数据存储难题

在信息科技高速发展的背景之下&#xff0c;海量数据已经让拥有者和管理者应接不暇&#xff0c;根据IDC发布的《数据时代2025》预测&#xff0c;全球数据圈&#xff08;数据圈代表每年被创建、采集或是复制的数据集合&#xff09;将从2018 年的32ZB增至2025年的175ZB。2018年&am…

【学习记录】IMU内参标定:Allan方差与代码

本文仅用于记录自己学习IMU内参标定过程中的一些总结。 参考 关于IMU参数&#xff1a; 死磕陀螺仪之(一)陀螺仪参数意义以及工程转换 关于Allan方差&#xff1a; 多传感器融合定位理论基础&#xff08;三&#xff09;&#xff1a;惯性器件误差分析 IMU噪声参数辨识-艾伦方差…

虹科方案|从 uCPE 到成熟的边缘计算平台

基于开放硬件平台&#xff0c;通用客户端设备 (uCPE) 支持快速添加、集成或删除任意数量的集中管理虚拟功能。 为了增加收入并保持竞争优势&#xff0c;托管服务提供商 (MSP) 和企业正在部署 uCPE 以增强业务敏捷性、加速新服务的引入并提高运营效率。最初&#xff0c;uCPE被部…

防护设备检测实验室建设完整方案SICOLAB

防护设备检测实验室建造布局方案SICOLAB一、防护设备检测实验室通常需要划分为几个功能区域&#xff0c;包括&#xff1a;1、样品准备区&#xff1a;用于样品的接收、处理、准备等工作&#xff0c;通常包括样品接收台、洗手池、样品切割机等设备。2、实验操作区&#xff1a;用于…