百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

python使用pdb调试器来调试程序

yuyutoo 2025-01-14 18:39 10 浏览 0 评论

某客户购买了10万元一年期收益率为3.7%的理财产品。每年理财赎回后,他会取2万作为生活所需,全下资金仍购买此种理财,在收益率不变的情况下,多少年后资金会被全部取出?

假设本金money=100000,第一年到期后本息合计=money*(1+3.7%),然后取出2万。很容易得出计算公式为round(money*(1+0.037),2)-20000

重复运行上述公式,可以计算连续若干年的资金余额。

使用python3.8编写代码:

import pdb

money=100000 #本金
year=0
while money>0:
   money=round(money*(1+0.037),2)-20000
   year+=1
   pdb.set_trace() #运行到这里会自动暂停

pdb是Python标准库的一部分,类似于其他的调试器,是独立的工具,当你需要一个调试器时,它们是不可替代的。本篇教程的最后,大家将会学习到如何使用调试器来查看应用中的任何变量,可以在任何时刻停止或恢复应用执行流程,从而了解到每行代码是如何影响应用的内部状态的。这有助于追踪难以发现的bug,并且实现快速可靠的解决缺陷代码。有时候,在pdb中单步调试代码,然后查看变量值的变化,可以有助于我们对应用代码的深层次理解。,所以只要我们使用了Python解释器,也就可以使用pdb,非常方便。

解析:import pdb引入pdb标准库,在适当时候插入pdb.set_trace()这一行,程序会自动暂停。

> e:\python\work\demo\test_pdb.py(5)<module>()
-> while money>0:
(Pdb) p year,money
(1, 83700.0)
(Pdb) c
> e:\python\work\demo\test_pdb.py(5)<module>()
-> while money>0:
(Pdb) p year,money
(2, 66796.9)
(Pdb) c
> e:\python\work\demo\test_pdb.py(5)<module>()
-> while money>0:
(Pdb) p year,money
(3, 49268.39)
(Pdb) q
....
bdb.BdbQuit

在(Pdb)调试环境中,输入p 命令表示查看print,c命令表示继续运行continue,q命令表示quit退出。如上所示,使用p和c交替执行,可以查看第一年,资金为83700,第2年为66796.9

使用PDB的方式有两种:
1. 单步执行代码,通过命令 python -m pdb xxx.py 启动脚本,进入单步执行模式
 pdb命令行:
    1)进入命令行Debug模式,python -m pdb xxx.py
    2)h:(help)帮助
    3)w:(where)打印当前执行堆栈
    4)d:(down)执行跳转到在当前堆栈的深一层(个人没觉得有什么用处)
    5)u:(up)执行跳转到当前堆栈的上一层
    6)b:(break)添加断点
                 b 列出当前所有断点,和断点执行到统计次数
                 b line_no:当前脚本的line_no行添加断点
                 b filename:line_no:脚本filename的line_no行添加断点
                 b function:在函数function的第一条可执行语句处添加断点
    7)tbreak:(temporary break)临时断点
                 在第一次执行到这个断点之后,就自动删除这个断点,用法和b一样
    8)cl:(clear)清除断点
                cl 清除所有断点
                cl bpnumber1 bpnumber2... 清除断点号为bpnumber1,bpnumber2...的断点
                cl lineno 清除当前脚本lineno行的断点
                cl filename:line_no 清除脚本filename的line_no行的断点
    9)disable:停用断点,参数为bpnumber,和cl的区别是,断点依然存在,只是不启用
    10)enable:激活断点,参数为bpnumber
    11)s:(step)执行下一条命令
                如果本句是函数调用,则s会执行到函数的第一句
    12)n:(next)执行下一条语句
                如果本句是函数调用,则执行函数,接着执行当前执行语句的下一条。
    13)r:(return)执行当前运行函数到结束
    14)c:(continue)继续执行,直到遇到下一条断点
    15)l:(list)列出源码
                 l 列出当前执行语句周围11条代码
                 l first 列出first行周围11条代码
                 l first second 列出first--second范围的代码,如果second<first,second将被解析为行数
    16)a:(args)列出当前执行函数的函数
    17)p expression:(print)输出expression的值
    18)pp expression:好看一点的p expression
    19)run:重新启动debug,相当于restart
    20)q:(quit)退出debug
    21)j lineno:(jump)设置下条执行的语句函数
                只能在堆栈的最底层跳转,向后重新执行,向前可直接执行到行号
    22)unt:(until)执行到下一行(跳出循环),或者当前堆栈结束
    23)condition bpnumber conditon,给断点设置条件,当参数condition返回True的时候bpnumber断点有效,否则bpnumber断点无效
 
注意:
    1:直接输入Enter,会执行上一条命令;
    2:输入PDB不认识的命令,PDB会把他当做Python语句在当前环境下执行;

自从Python3.7以来,官方标准建议使用标准库内部函数breakpoint()替代上面的代码(注意:本文附带的代码都使用的上面代码形式),这样可以更加加快解释器的运行和调试:

默认情况下,breakpoint()将会导入pdb模块,然后调用pdb.set_trace()函数,只是它进行了进一步封装。但是,使用breakpoint()可以更加灵活,并且允许用户通过调用它的API来控制调试行为,以及使用环境变量PYTHONBREAKPOINT。例如,当我们设置PYTHONBREAKPOINT=0在我们的环境中,这就会完全关闭breakpoint()的功能,从而关闭调试功能。

以上示例仅为演示。如果使用循环结构,可以轻松解决开篇的问题

money=100000 #本金
year=0
while money>0:
   money=round(money*(1+0.037),2)-20000
   year+=1  
   print(year,money)

程序自动计算结果:

可以直观看到第5年资金仅有12241.7,第6年已经不够2万生活费了。

相关推荐

网络规划建设原来也可以这么简单!

废话少说,直接上干货。天气炎热,请各位看官老爷静心阅读。整体思路下图是关于网络建设的所有相关领域,接下来我为大家逐一讲解。网络分层...

网络规划设计师笔记-第 1 章 计算机网络原理

计算机网络原理1.1计算机网络概论(P1-10)...

别输在远见上,网工这样做职业规划,比啥都强

01职业中的规划,人生中的buff“职业规划“这个词,其实对很多年轻人,包括曾经年轻的我来说,都不屑一提。...

网络规划设计师学习中(个人自学笔记分享1),有一起学习的吗?

网络规划设计师,上午考试内容学习:第一章:计算机网络概述(上部分):如果你也在一起学习,那么我们来一起学习吧!坚持1年,争取明年一次性通过!...

在微服务中使用 ASP.NET Core 实现事件溯源和 CQRS

概述:事件溯源和命令查询责任分离(CQRS)已成为解决微服务设计的复杂性的强大架构模式。基本CQRS表示形式在本文中,我们将探讨ASP.NETCore如何使你能够将事件溯源和CQRS...

一个基于ASP.NET Core完全开源的CMS 解决方案

...

用 Nginx 部署 ASP.NET Core 应用程序

用Nginx部署ASP.NETCore应用程序步骤如下:在Linux中安装.NETCore运行时和Nginx:...

Asp.net Core启动流程讲解(一)(asp.net core 入门)

asp.netcore默认项目包括项目根目录级的Startup.cs、Program.cs、appsettings.json(appsettings.Development.json)launch...

十天学会ASP之第五天(十天学会asp教程)

学习目的:学会数据库的基本操作1(写入记录)数据库的基本操作无非是:查询记录,写入记录,删除记录,修改记录。今天我们先学习写入记录。先建立一个表单:<formname="form1"met...

ASP.NET Core 的 WebApplication 类

ASP.NETCore提供了3个主机类(Host)。这些类用于配置应用、管理生命周期和启动Web服务。...

ASP.NET Core中的键控依赖注入(.net依赖注入原理)

大家好,我是深山踏红叶,今天我们来聊一聊ASP.NETCore中的FromKeyedServices,它是在.Net8中引入的。这一特性允许通过键(如字符串或枚举)来注册和检索依赖注入(D...

Asp.net常用方法及request和response-a

asp.net教程asp.net常用方法:1、Request.UrlReferrer请求的来源,可以根据这个判断从百度搜的哪个关键词、防下载盗链、防图片盗链,可以伪造(比如迅雷)。(使用全局一般处理...

ASP.NET Core EFCore 属性配置与DbContext 详解

...

asp.net常考面试题(aspnet题库)

asp.net常考面试题一,列举ASP.Net页面之间传递值的几种方式?1,使用QueryString,如:......?id=1;response.Redirect()......2,使用Sessi...

在Windows系统搭建.NET Core环境并创建运行ASP.NET网站

微软于6月27日在红帽DevNation峰会上正式发布了.NETCore1.0、ASP.NET1.0和EntityFrameworkCore1.0,其将全部支持Windows、OSX和...

取消回复欢迎 发表评论: